0


二、Eureka注册中心

注册中心原理

注册中心主要有三种角色:

1、服务提供者(RPC Server)

在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。

2、服务消费者(RPC Client)

在启动时,向 Registry 订阅服务,把 Registry 返回的服务节点列表缓存在本地内存中,并与 RPC Sever 建立连接。

3、服务注册中心(Registry)

用于保存 RPC Server 的注册信息,当 RPC Server 节点发生变更时,Registry 会同步变更,RPC Client 感知后会刷新本地 内存中缓存的服务节点列表。

最后,RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Sever 发起调用。

注册中心实现原理

1、服务的提供者在启动时把自身的服务接口信息注册到注册中心,这时每个服务与注册中心保持一个长连接,并以心跳包的形式与注册中心进行通讯

2、客户端在启动的时候往注册中心订阅它所需要的服务列表信息,把它订阅的服务列表缓存到本地

3、当客户端需要调用服务端接口时,从本地缓存中获取地址列表,通过本地负载均衡策略选择具体的服务地址,再通过RPC(FeignClient)进行远程调用

4、注册中心会保存服务地址列表信息和客户端的订阅信息

5、当服务出现不可用时(宕机),注册中心会剔出不可用服务地址,再通过事件通知给订阅的客户端

常用的注册中心:

  1. Eureka(netflix) AP
  2. Zookeeper CP
  3. Consul CP
  4. Nacos(Alibaba) AP/CP

常用注册中心对比:

Eureka 的工作流程:

1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息。

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务。

3、Eureka Client 默认会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常。

4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例。

5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。

6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式。

7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地。

8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。

9、Eureka Client 获取到目标服务器信息,发起服务调用。

10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

一、搭建Eureka注册中心微服务,提供注册中心功能

1、在springcloud父项目下创建聚合项目springcloud-eureka,在springcloud-eureka项目的pom文件引入eureka服务端依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

2、添加application.yml配置文件

server:
#设置注册中心服务端口号
  port: 8090

spring:
  application:
#设置应用名称
    name: server-eureka

eureka:
  client:
#注册中心同步注册信息,默认true
    fetch-registry: false
#将自己注册到注册中心,默认为true
    register-with-eureka: false

3、添加EurekaApp.class启动类上添加注解@EnableEurekaServer表示当前项目为Eureka服务端

@EnableEurekaServer
@SpringBootApplication
public class EurekaApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApp.class, args);
    }
}

4、运行启动类

5、访问注册中心地址http://localhost:8090/

访问到此页面说明注册中心已经配置完成了,可以看到当前注册中心并没有服务实例

6、项目结构

二、使用Eureka注册中心

1、在springcloud-member、springcloud-order、springcloud-pay项目的pom文件中添加eureka客户端依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

2、在springcloud-member、springcloud-order、springcloud-pay项目的application.yml文件中分别添加以下配置

springcloud-member

spring:
  application:
    name: server-member

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/

springcloud-order

spring:
  application:
    name: server-order

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/

springcloud-pay

spring:
  application:
    name: server-pay

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/

3、在springcloud-member、springcloud-order、springcloud-pay项目的启动类上添加注解@EnableEurekaClient表示当前项目为Eureka客户端

4、运行springcloud-member、springcloud-order、springcloud-pay项目的启动类

5、打开Eureka注册中心地址http://localhost:8090/

此时可以看到服务的实例信息,即表示完成了服务注册

三、注册中心缓存更新

Eureka 默认30s会从注册中心同步更新一次本地的缓存地址列表,所以当我们启动新的服务时,服务不会马上被访问到,需要等服务同步更新到本地缓存后才会被访问。

在Eureka注册中心里,有一个独有的机制-------自我保护机制,当网络分区发生故障时,微服务与Eureka Server之间无法正常通信,然后Eureka误以为服务宕机了,将服务从服务地址列表中剔出,其实这时服务运行是正常的,等网络恢复后即可正常使用了,这就造成了误判,因此Eureka的自我保护机制就是为了避免这种情况发生,当服务不可用时,启动自我保护机制,此时并不会把服务从地址列表中剔出,而是一直挂在服务地址列表中,但是服务并不会被调用到,只要服务和Eureka Server正常通信,服务又可以被重新调用了

在生产环境中一般会选择默认开启自我保护机制

在开发环境中一般会关闭开启自我保护机制

eureka:
**** server****:
**# **关闭自我保护机制,保证不可用的服务及时被剔出

  • *enable-self-preservation: false

**# 如果2秒内没有收到某个服务的心跳,那就剔出该微服务,单位为毫秒ms**

  • *eviction-interval-timer-in-ms: 2000

1、在springcloud-eureka项目的配置文件中,修改Eureka Server的配置

server:
#设置服务端口号
  port: 8090

spring:
  application:
#设置应用名称
    name: server-eureka

eureka:
  client:
#注册中心同步注册信息,默认true
    fetch-registry: false
#将自己注册到注册中心,默认为true
    register-with-eureka: false
  server:
#  关闭自我保护机制,保证不可用的服务及时被剔出
    enable-self-preservation: false
#  如果2秒内没有收到某个服务的心跳,那就剔出该微服务,单位为毫秒ms
    eviction-interval-timer-in-ms: 2000

2、客户端配置文件修改

eureka:
instance:
**# Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s**

  • *lease-renewal-interval-in-seconds: 1

# Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
**# 超时将剔出该微服务,也可以在Eureka**服务端进行设置

  • *lease-expiration-duration-in-seconds: 2

例如:server-order的配置文件修改如下

server:
  port: 9071

spring:
  application:
    name: server-order

eureka:
  instance:
  # 使用ip地址作为host,而不是机器号/电脑名称
    prefer-ip-address: true
#    Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
#    超时将剔出该微服务,也可以在Eureka服务端进行设置
    lease-expiration-duration-in-seconds: 2
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/
标签: eureka java rpc

本文转载自: https://blog.csdn.net/Tony_chenph/article/details/130647737
版权归原作者 Tony_chenph 所有, 如有侵权,请联系我们删除。

“二、Eureka注册中心”的评论:

还没有评论