005 SpringCloud-Eureka注册中心高可用机制与AP架构

Spring Cloud 高可用Eureka 服务注册中心:

控制台里eureka2个服务,此时高可用注册中心已经搭建完成,以后即使宕机一个Eureka,另外一个也可以进行服务。

从架构中可以看到,两个EurekaServer之间采用Replicate(复制副本)的方式实现;

1. 服务提供者:其可以将服务注册到EurekaServer,也可以将服务从EurekaServer下线,并且其与EurekaServer之间采用定时心跳(10秒通讯一次)方式来告知存活,即续约功能;并且可以获取服务列表,相对而言同时也是服务的调用者;

2.服务消费者:获取服务列表,根据列表调用相应服务,从而实现微服务间通讯;

服务发现机制说明:

服务注册:服务提供者在启动时会通过发送REST请求的方式将自己注册到Eureka服务器上,同时带上了自身服务的一些元素信息。Eureka 收到这个Rest请求后,将元数据信息存储在一个双层结构Map中,其中第一层的key是服务名,第二层的key是具体服务实例名。

服务同步:如架构图中所示,这里两个服务提供者分别注册到了两个不同的注册中心上,也就是说他们的信息分别被两个服务注册中心所维护,此时由于服务注册中心之间因为相互注册服务的关系,当服务提供者发送注册请求到一个服务注册中心的时候,它会将该请求转发给集群的其他注册中心,从而实现注册中心之间的服务同步过程。通过服务同步,两个服务提供者的服务信息就可以通过这两台服务注册中心的任意一台获取到。

注意:Eureka(AP)不能保障数据强一致性,其存在时间窗口;

例如,服务A注册到EurekaA,正常流程EurekaA要将服务A同步到EurekaB,此时出现闪断,注册失败,那么在设定(30秒或60秒)的一段时间内,EurekaB不具备服务A的列表,所以EurekaB的消费者在时间窗口内无法获取服务A的功能,只有时间到期启动下一次同步后才能正常使用;

如上例,服务A注册到EurekaA,未完成同步到EurekaB,EurekaA宕机,那么EurekaB中同样不具备服务A的功能列表,需要等待服务A将自己注册到EurekaB后才能正常使用;

 •服务续约:服务注册完成后,服务提供者会维护一个心跳来持续告诉注册中心“我还活着”以防止注册中心“剔除该服务”也就是将服务列表中排除出去。

获取服务:当启动消费者的时候,它会发送一个Rest请求给注册中心获取上面所有的服务清单,并且为了性能考虑,返回给客户端的清单缓存默认每隔30s更新一次(延迟问题)。

服务调用:消费者获得清单后,通过服务名可以获得具体提供服务的实例名和改实例的元数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定调用那个服务示例,在ribbon中会默认采用轮训的方式进行服务调用,从而实现负载均衡机制。

服务下线:在系统运行中必然会出现关闭或重启某个实例的情况,在关闭服务期间,自然不希望调用到已经下线的服务实例,所以在客户端程序中,当服务实例正常关闭操作时,它会触发一个服务下线的Rest请求给Eureka,通知其下线,当然注册中心收到该请求后把其服务列表状态改为下线,并把该事件传播给集群其他节点。当出现非正常下线(由于系统内部故障,如内存溢出、服务器宕机等问题)时,注册中心可能并没有收到正常的下线通知请求,而这种情况,我们的Eureka自己会有一个内部的定时任务,每隔一段时间定时检查超时的清单进行剔除(如果没有续约)。 

1.创建eureka-server-b(复制eureka-server-a(上一篇)改名即可)然后修改eureka-server-a和eureka-server-b的application-dev.properties文件:

eureka-server-a:

server.port=8001
##主机名称,在hosts文件中配置后可以直接使用配置的名字
eureka.instance.hostname=eureka1

##关闭自我保护机制,如不关闭,eureka容易出现在一定时间内无法使用,就不能保证AP高可用
eureka.server.enable-self-preservation=false
##定时清理不可用的服务列表信息,配置定时时间周期,默认60秒(服务下线)
eureka.server.eviction-interval-timer-in-ms=10000

##客户端向服务器端(注册中心)发送的心跳间隔时间
eureka.instance.lease-renewal-interval-in-seconds=10
##服务器注册租期到期的时间:Eureka服务在收到最后一次心跳的时候算起,如果后续30秒内没有收到任何的心跳,Eureka主动标示该服务会被剔除,然后由定时任务清理服务列表
eureka.instance.lease-expiration-duration-in-seconds=30

##注册中心的访问地址
#eureka.client.service-url.defaultZone=http://eureka1:8001/eureka
#高可用:将eureka1的注册地址配置为eureka2,即互相配置对方
eureka.client.service-url.defaultZone=http://eureka2:8002/eureka

eureka-server-b:

server.port=8002
##主机名称,在hosts文件中配置后可以直接使用配置的名字
eureka.instance.hostname=eureka2

##关闭自我保护机制,如不关闭,eureka容易出现在一定时间内无法使用,就不能保证AP高可用
eureka.server.enable-self-preservation=false
##定时清理不可用的服务列表信息,配置定时时间周期,默认60秒(服务下线)
eureka.server.eviction-interval-timer-in-ms=10000

##客户端向服务器端(注册中心)发送的心跳间隔时间
eureka.instance.lease-renewal-interval-in-seconds=10
##服务器注册租期到期的时间:Eureka服务在收到最后一次心跳的时候算起,如果后续30秒内没有收到任何的心跳,Eureka主动标示该服务会被剔除,然后由定时任务清理服务列表
eureka.instance.lease-expiration-duration-in-seconds=30

##注册中心的访问地址
#高可用:将eureka2的注册地址配置为eureka1
eureka.client.service-url.defaultZone=http://eureka1:8001/eureka

2. 启动eureka-server-a和eureka-server-b:

 

 3. 启动生产者和消费者:

 

4. 通过消费者访问服务,然后关闭其中一个在访问,测试高可用:

 

  5.模拟正常关闭生产者:

租期到期后被定时任务自动剔除; 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值