服务注册中心 Eureka
服务注册中心 Eureka
Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力。
Eureka 有 3 个角色
- 服务中心(Eureka Server):服务器端。它提供服务的注册和发现功能,即实现服务的治理。
- 服务提供者(Service Provider):服务提供者。它将自身服务注册到 服务中心,以便 服务消费者 能够通过服务器提供的服务清单(服务注册列表)来调用它。
- 服务消费者(Service Consumer):服务消费者。它从 服务中心 获取已注册的服务列表,从而消费服务。
Eureka 是 AP 架构(可用性和分区容错性),Zookeeper 是 CP 架构(一致性和分区容错性)。Eueka 优先保证服务的可用性,Zookeeper 在 Master 节点因为网络故障与其他节点失去联系时,剩余节点选取 leader 的时间太长,这就导致在选举期间注册服务瘫痪。
1. 搭建单机Eureka注册中心
首先需要创建一个 spring-cloud 工程,删除 src 目录,然后在 pom.xml 文件中加入以下依赖:
<!-- 统一管理jar包版本 -->
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring-cloud.version>2021.0.0</spring-cloud.version><spring-boot.version>2.6.3</spring-boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本,子modlue不用写groupId和version -->
<dependencyManagement><dependencies><!--spring boot 2.6.3--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--spring cloud 2021.0.0--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
创建 eureka-server-7001 模块,然后在 pom.xml 文件中加入以下依赖:
<!-- 服务注册发现Eureka-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
写 application.yaml 配置文件,具体如下:
server:port: 7001
eureka:instance:# eureka服务端的实例名字hostname: localhostclient:# 是否将自己注册到eureka serverregister-with-eureka: false# 是否从eureka server获取注册的服务信息fetch-registry: false# 设置与eureka server交互的地址service-url:defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
最后在启动类上加上 @EnableEurekaServer 注解即可
@EnableEurekaServer
启动访问 localhost:7001 即可访问到 Eureka 注册中心的界面。
2. 创建服务提供者与服务消费者
创建服务提供者 provider-8001 和服务消费者 consumer-80 模块,然后在 pom.xml 文件中加入以下依赖:
<!-- 引入Eureka 客户端依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
服务提供者和消费者的依赖是一样的,都是 eureka-client。
写 application.yaml 配置文件,具体如下:
server:port: 8001
spring:application:name: cloud-provider-8001
eureka:client:# eureka服务地址service-url:defaultZone: http://localhost:7001/eureka/
server:port: 80
spring:application:name: cloud-consumer-80
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/
最后在启动类上面加 @EnableEurekaClient 注解即可。
@EnableEurekaClient
先启动 Eureka 注册中心,然后在分别启动服务提供者和服务消费者,即可在 Eureka 服务注册中心看到相关信息。
3. Eureka 注册中心界面说明
访问上面我们搭建的注册中心(localhost:7001),界面如下:
其中最重要的是中间服务信息的那一栏,实例的状态有以下几种:
- UP:服务正常运行,特殊情况当进入自我保护模式,所有的服务依然是 UP 状态,所以需要做好熔断重试等容错机制应对灾难性网络出错情况
- OUT_OF_SERVICE:不再提供服务,其他的 Eureka Client 将调用不到该服务,一般有人为的调用接口设置的,如:强制下线。
- UNKNOWN:未知状态
- STARTING:表示服务正在启动中
- DOWN:表示服务已经宕机,无法继续提供服务
4. 服务自保和服务剔除机制
服务自保机制(Service Self-Preservation Mechanism):是指 Eureka Server 中的一种机制,用于保护在 Eureka 注册中心上注册的微服务实例免受意外删除的影响。当微服务实例在心跳超时时间内没有发送心跳信号给 Eureka Server 时,Eureka Server 不会立即将其从服务注册表中删除,而是认为该实例可能处于网络故障等临时异常情况,会将其保留在注册表中,提供一定的自我保护,防止误删健康的实例。这样可以避免因网络抖动、服务器负载或其他临时问题导致服务实例被误删,从而提高服务的稳定性和可用性。
服务剔除机制(Service Eviction Mechanism):与服务自保相对应,是指当服务实例连续长时间未发送心跳信号、或注册中心发现某个服务实例心跳连续失败的次数超过一定阈值时,Eureka Server 会将该服务实例从服务注册表中剔除。通过服务剔除机制,可以排除不健康、异常或故障状态的服务实例,防止其他服务继续调用故障的实例,减少错误的传播范围,提高系统的稳定性。
Eureka 中的服务自保机制是为了保护健康、可能出现临时异常的服务实例免受误删的影响,而服务剔除机制则是为了及时剔除不健康、长时间未发送心跳或心跳连续失败的服务实例,保障整个服务治理系统的正常运行。这两个机制的存在都是为了提高服务的可靠性和稳定性。
服务自保是默认开启的,可以使用以下配置来关闭,在 Eureka Server 的 application.yaml 配置文件中加入以下配置:
eureka: server:# 参数来关闭保护机制,已确保注册中心可以将不可用的实例正确剔除,默认为trueenable-self-preservation: false
5. Actuator 微服务信息完善
SpringCloud 体系里的服务实体向 Eureka 注册时,注册名默认是 IP名:应用名:应用端口名。
我们可以通过 actuator 来修改完善注册名,在服务提供者或消费者的 pom.xml 文件中加入以下配置:
<!-- actuator监控信息完善 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在 application.yaml 配置文件中加入以下配置:
eureka:instance:# 实例名称instance-id: cloud-consumer01-80
6. 服务注册发现 Discovery
注册进入 Eureka 里面的微服务,可以通过服务发现来获取该服务的信息。
在服务提供者模块controller类,具体如下:
@Slf4j
@RestController
@RequestMapping("/provider")
public class ProviderController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/discovery")public Object discovery() {// 获取所有微服务信息List<String> services = discoveryClient.getServices();for (String service : services) {log.info("service:={}", service);}return this.discoveryClient;}/*** 供消费者调用*/@GetMapping("/index")public String getMsg() {return "success";}
}
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange() 以及 execute()。
在服务消费者模块中添加配置类,具体如下:
@Configuration
public class CloudConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
最后在服务消费者模块添加对应调用方法,具体如下:
@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/index")public String index() {// 远程微服务调用地址: 微服务名称String host = "http://cloud-provider-8001";// 具体URLString url = "/provider/index";// 发起远程调用// getForObject: 返回响应体中数据转化成的对象, 可以理解为json// getForEntity: 返回的是ResponseEntity的对象包含了一些重要的信息return restTemplate.getForObject(host + url, String.class);}
}
浏览器访问:http://localhost:80/consumer/index 地址,即出现在服务提供者模块中返回的 “success” 字符串。
相关文章:

服务注册中心 Eureka
服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心(Eureka Server):…...

SpringIoC组件的高级特性
目录 一、Bean组件的周期与作用域 二、FactoryBean接口 一、Bean组件的周期与作用域 1.1 Bean组件的生命周期 什么是Bean的周期方法 我们可以在组件类中定义方法,然后当IoC容器实例化和销毁组件对象的时候进行调用!这两个方法我们成为生命周期方法&a…...

Linux--进程地址空间
1.线程地址空间 所谓进程地址空间(process address space),就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合。 简单地说,进程就是内核数据结构和代码和本身的代码和数据,进程本身不能…...

ISIS路由协议
骨干区域与非骨干区域 凡是由级别2组建起来的邻居形成骨干区域;级别1就在非骨干区域,骨干区域有且只有一个,并且需要连续,ISIS在IP环境下目前不支持虚链路。 路由器级别 L1路由器只能建立L1的邻居;L2路由器只能建立L…...
论文解读:Bert原理深入浅出
摘取于https://www.jianshu.com/p/810ca25c4502 任务1:Masked Language Model Maked LM 是为了解决单向信息问题,现有的语言模型的问题在于,没有同时利用双向信息,如 ELMO 号称是双向LM,但实际上是两个单向 RNN 构成的…...

共享内存 windows和linux
服务端,即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…...
一个mongodb问题分析
mongodb问题分析 现状 表的个数: 生产上常用的表就10来个。 sharding cluster replica set方式部署: 9个shard server, 每个shard server 1主2从, 大量数据写入时或对大表创建索引时,可能有主从复制延迟问题。实…...

Vue3.0极速入门- 目录和文件说明
目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件说明node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录,基本上要做的事情都在这个目录里assets放置一些图片,如logo等。componentsvue组件…...

RabbitMQ---订阅模型-Direct
1、 订阅模型-Direct • 有选择性的接收消息 • 在订阅模式中,生产者发布消息,所有消费者都可以获取所有消息。 • 在路由模式中,我们将添加一个功能 - 我们将只能订阅一部分消息。 例如,我们只能将重要的错误消息引导到日志文件…...

Django REST framework实现api接口
drf 是Django REST framework的简称,drf 是基于django的一个api 接口实现框架,REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …...

4.19 20
服务端没有 listen,客户端发起连接建立,会发生什么? 服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。 没有 listen&#x…...

(动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】
❓剑指 Offer 10- II. 青蛙跳台阶问题 难度:简单 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97(1000000007),如计算初始结果为:1…...
物联网WIFI 模块AT指令版本七大元凶
前言 目前我们讨论的这个问题,并不是说WIFI方案不具备以应的功能。而是指在同一个AT固件下可能存在的问题。由于各厂商AT指令的开发深度不同,导致各厂商之间的AT指令差异很大。我总结了一些问题,可能是导致目前AT指令不好用元凶。 底层库问题…...
Qt 正则(数据格式校验、替换指定格式数据、获取匹配数据)
头文件引用 #include <QRegExp>初始化QRegExp实列 QRegExp re("^\\d{1,3},\\d{1,3}$");数据格式验证 QRegExp re("^\\d{1,3},\\d{1,3}$"); QString msg "12,33"; if(re.exactMatch()){// 验证通过 }else{//验证不通过 }替换数…...

网络层协议——ip
文章目录 1. 网络层2. IP协议2.1 协议头格式 3. 网段划分3.1 特殊的IP地址3.2 IP地址的数量限制 4. 私有IP地址和公网IP地址 1. 网络层 在应用层解决了如何读取完整报文、序列化反序列化、协议处理问题。在传输层解决了可靠性问题。那么网络层IP的作用是在复杂的网络环境中确定…...

Qt6和Rust结合构建桌面应用
桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开…...

Kubernetes(K8S)简介
Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…...
面试中问:React中函数组件和class组件的区别,hooks模拟生命周期
React中函数组件和class组件的区别,hooks模拟生命周期 React中函数组件和class组件的区别hooks模拟生命周期 React中函数组件和class组件的区别 函数组件: 定义:函数组件是使用纯函数定义的组件,它接受 props 作为参数并返回 JSX。简洁性&am…...

Python高光谱遥感数据处理与高光谱遥感机器学习方法应用
本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…...
Java实现接收xml格式数据并解析,返回xml格式数据
需求描述:后端接受xml格式数据,解析出相应数据,并返回xml格式数据。 <!--XML解析--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...