Eureka服务注册中心(高级)

Java猫

共 6450字,需浏览 13分钟

 · 2021-09-15


1.Eureka server 高可用集群

在上一个章节,实现了单节点的Eureka Server的服务注册与服务发现功能。Eureka Client会定时连接Eureka Server ,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。但如果EurekaServer宕机时,某些微服务也出现了不可用的情况, Eureka Server中的缓存若不被刷新,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用。因此,在生成环境中,通常会部署一个高可用的Eureka Server集群。


Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署, Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行为。


大概:


简单的说:

部署多个eureka server 节点集群,互相同步数据备份等,

当一个eureka server宕机后,另一个节点的eureka server继续提供服务,达到高可用的状态。


2. eureka server 注册中心之间相互注册

1.准备2个eureka server ,需要相互注册与发现

  • eureka server节点1 端口9000

  • eureka server节点2 端口8000

2.将多个服务注册到多个eureka server中


以下是步骤实现:


1.准备2个eureka server ,需要相互注册与发现

eureka server 节点1工程yml配置文件

server:
  port: 9000
spring:
  application:
    name: server-eureka #注册中心节点1服务名称

# 配置 eureka server 注册中心
eureka:
  instance:
    hostname: localhost
  client:
    #register-with-eureka-: false #是否将自己注册到注册中心 (默认为true)
    #fetch-register: false  #是否从eureka中获取注册信息
    serviceUrl: #配置暴露给eureka client的请求地址
      defaultZone: http://${eureka.instance.hostname}:8000/eureka/ #注册到节点2 server上

eureka server 节点12工程yml配置文件

server:
  port: 8000
spring:
  application:
    name: server-eureka2 #注册中心节点2服务名称

# 配置 eureka server 注册中心
eureka:
  instance:
    hostname: localhost
  client:
    #register-with-eureka-: false #是否将自己注册到注册中心 (默认为true)
    #fetch-register: false  #是否从eureka中获取注册信息
    serviceUrl: #配置暴露给eureka client的请求地址
      defaultZone: http://${eureka.instance.hostname}:9000/eureka/ # 注册到节点1 server上

以上配置实现两个eureka server的服务互相注册与发现。


启动两个节点后:

访问eureka server节点1

访问eureka server节点2


2.服务注册到多个eureka server中

订单工程服务(服务消费者)注册到多个eureka server中

server:
  port: 9002
spring:
  application:
    name: service-order #订单服务名称(服务消费者)
# 配置 eureka 服务注册与发现 (看这里!!!!)
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ # 向多个注册中心注册服务(逗号分割)
  instance:
    prefer-ip-address: true # 使用ip地址注册


商品工程服务(服务提供者)注册到多个eureka server中

server:
  port: 9001
spring:
  application:
    name: service-product #商品服务名称(服务提供者)
# 配置 eureka
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/,http://localhost:8080/eureka/ # 向多个注册中心注册地址
  instance:
    prefer-ip-address: true # 使用ip地址注册

测试,停止注册中心节点2,模拟节点2宕机。

一个eureka server节点宕机了,另一个eureka server还在服务,并不影响整个服务的运行,从而保证了服务高可用。


提示:

只要两个注册中心互相注册,就可默认自动实现两个节点之间的服务列表信息同步,但是最好还是在服务提供者注册到多个注册中心节点集群里好一些。



3.Eureka常见问题

1.控制台显示服务ip

在服务提供者工程中修改显示id

server:
  port: 9001
spring:
  application:
    name: service-product #商品服务名称(服务提供者)
# 配置 eureka
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/,http://localhost:8080/eureka/ # 向多个注册中心注册地址
  instance:
    prefer-ip-address: true # 使用ip地址注册
    # 看这里,解决在控制台显示服务的ip和端口组成的请求地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册id(服务ip请求路径)



2.Eureka的服务剔除问题


健康检查:

  • 默认30秒给注册中心发送心跳

  • 90秒内续约到期时间


在已经注册的微服务列表中,微服务会默认30秒给注册中心发送一次心跳,证明我还活着,90秒内没有发送心跳(续约到期时间),证明该微服务已经宕机,那么就需要注册中心及时剔除掉宕机微服务地址信息,注册中心会自动剔除宕机的服务信息。


大概:


解决:

在服务提供者工程yml设置发送心跳时间间隔和续约时间。

server:
  port: 9001
spring:
  application:
    name: service-product #商品服务名称(服务提供者)
# 配置 eureka
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/,http://localhost:8080/eureka/ # 向多个注册中心注册地址
  instance:
    prefer-ip-address: true # 使用ip地址注册
    # 解决在控制台显示服务的ip和端口组成的请求地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册id(服务ip请求路径)
    #看这里,发送心跳间隔与续约到期时间设置
    lease-renewal-interval-in-seconds: 5 #间隔5秒发送心跳给注册中心
    lease-expiration-duration-in-seconds: 10 #续约到期时间 10秒没发送心跳代表我宕机

微服务每隔5秒给注册中心发送心跳证明活着,如果10秒我没发送心跳,证明我宕机了。


服务提供者微服务宕机后,注册中心会自动剔除该微服务。

服务提供者正常运行时:

停止服务提供者模拟宕机:


3.Eureka 自我保护机制

一般不建议用。

eureka server注册中心会自动检测统计所有的微服务发送过来的心跳效率是否在85%以上,如果低于85%,则eureka自动开启自我保护机制,不再剔除已经注册的微服务列表信息,如果某些微服务宕机了,但是微服务列表仍然存在信息,那么就不恰当,所以不建议使用自我保护机制。


注册中心关闭自我保护机制:

server:
  port: 9000
spring:
  application:
    name: server-eureka #注册中心节点1服务名称
# 配置 eureka server 注册中心
eureka:
  instance:
    hostname: localhost
  client:
    #register-with-eureka-: false #是否将自己注册到注册中心 (默认为true)
    #fetch-register: false  #是否从eureka中获取注册信息
    serviceUrl: #配置暴露给eureka client的请求地址
      defaultZone: http://${eureka.instance.hostname}:8000/eureka/ #注册到节点2 server上
  # 看这里,关闭eureka server 自我保护机制
  server:
    enable-self-preservation: false # 关闭自我保护机制 (默认是开启的)
    eviction-interval-timer-in-ms: 4000 # 剔除服务间隔(4秒扫码删除一次宕机的服务信息)

在开发测试阶段缩短服务剔除间隔时间,能够更快的得到服务数据,上线可删掉,使用默认的时间。



最后:

测试项目工程结构展示:

聚合maven工程包含的是SpringBoot子工程


4.总结:

到此,你已经学会了如何使用Eureka server作为注册中心,以及解决服务的注册与发现的问题,我们注重的是yml的配置,来实现Erueka的服务发现与注册。





浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报