Eureka 服务注册与发现
什么是服务治理?
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。
在传统的 rpc 远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,来管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册与发现?
Eureka 采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,由一个注册中心。当服务器启动的时候,会把当前自己服务器的信息,比如服务地址通讯地址等,以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地 RPC 调用 RPC 远程调用。
框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何 rpc 远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))。
下图为 Eureka 系统架构:
下图为 Dubbo 的架构:
Eureka 的两个组件
Eureka 包含两个组件:Eureka Server 和 Eureka Client。
Eureka Server
Eureka Server 提供服务注册服务,各个微服务节点通过配置启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
Eureka Client
Eureka Client 通过注册中心进行访问,它是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用 轮询 负载算法的负载均衡器。在应用启动后,将会想 Eureka Server 发送心跳(默认周期为30秒)。如果 Eureka Server 在多个心跳周期内没有收到某个节点的心跳,Eureka Server 将会从服务注册表中吧这个服务节点移除(默认90秒)。
创建服务注册中心模块
建 Module
新建一个名为 eureka-server7001 的 module
修改 POM 文件
需要添加的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置 YML 文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己。
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://eureka7002.com:7002/eureka/
写主启动文件
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}
测试
- 浏览器输入 localhost:7001 来到 Eureka 页面
- 此时并没有服务注册进来,所以没有服务被发现。
Eureka 自我保护机制
翻译:紧急情况!EUREKA 可能不正确地声称实例已启动,但实际上并未启动。续订少于阈值,因此为了安全起见,实例不会过期。
首先对 Eureka 注册中心需要了解的是 Eureka 各个节点都是平等的,没有 ZK 中角色的概念, 即使 N-1 个节点挂掉也不会影响其他节点的正常运行。
默认情况下,如果 Eureka Server 在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server 将会移除该实例。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
官方对于自我保护机制的定义:
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么 Eureka 就认为客户端与注册中心出现了网络故障,Eureka Server 自动进入自我保护机制,此时会出现以下几种情况:
- Eureka Server 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前 Eureka Server 新的注册信息会被同步到其它节点中。
因此 Eureka Server 可以很好的应对因网络故障导致部分节点失联的情况,而不会像 ZK 那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
自我保护开关
Eureka自我保护机制,通过配置 eureka.server.enable-self-preservation
来true
打开/false
禁用自我保护机制,默认打开状态,建议生产环境打开此配置。
将服务注册进 Eureka Server
订单服务模块
添加依赖
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置 yml 文件
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
主启动类上添加注解 @EnableEurekaClient
测试
- 先启动 Eureka Server
- 再启动 paymentmain8001服务
- 进入页面,显示已有一个服务被注册进来:
注:服务名称为 yml 中配置的名称:
将客户端模块注册进 Eureka Server
添加依赖
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
修改 yml 文件
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
主启动类上添加注解 @EnableEurekaClient
测试
- 先启动 Eureka Server
- 再启动服务提供者 paymentmain8001服务
- 进入页面,两个服务都被注册了进来
- 调用服务接口,成功返回值
集群
待更新~
评论区