Eureka服务注册中心(高级)
共 6450字,需浏览 13分钟
·
2021-09-15 17:00
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的服务发现与注册。