SpringCloud系列探索(一)----Eureka

Eureka是Netflix开源的服务发现组件,用于辅助微服务间的负载均衡。它采用P2P架构,允许自定义负载均衡策略。在极端情况下,SelfPreservation机制能保护注册信息。常见问题包括服务上下线信息同步延迟,可通过调整配置优化。此外,Eureka与Ribbon结合可实现灰度发布和不停机升级。

1.Eureka是什么?

是由 Netflix 开源的一款基于REST的服务发现组件,包括 Eureka Server 及 Eureka Client。

2.Netflix公司为什么要设计Eureka?

图1-Netflix公司微服务架构简图

 

从上图可以看出,如果EurekaSerivce被去掉(红色X),ELB直连后端的API Service(蓝色箭头),这个架构仍然也是可以工作的。

那EurekaService存在的意义是什么呢?以上图为例:

 

不管是Amazon的ELB,阿里的SLB,还是腾讯的CLB,还是你自己搭建的Ngnix,都无法做到:

  • 为微服务的网关转发到内部app的流量做负载均衡。

即它们只能做第一层无法做第二层。尤其是,注意上图第二层的文字描述,它需要的是基于Customer Hash这种自定义型的负载均衡。

 

因此设计Eureka的原因如下:

  • 做服务发现。
  • 辅助中间服务层的提供个性化的负载均衡算法。

2.市面上服务发现组件那么多,为什么选择Eureka?

  • 因为它是Netflix原生组件,和zuul,ribbon整合得比较好。

3.设计细节:

   3.1 Eureka集群宣称自己首先考虑AP,它是怎么设计的?为什么这样设计?

  • 集群采用PeerToPeer的网络架构互相通信
  • 注册信息在集群内部相互全量复制
  • Peter Kelley 在<<Eureka!Why You Shouldn't Use ZooKeeper for Service Discovery>> 文中指出,在实际生产环境里,服务注册及发现中心保留及过期数据总比丢失掉可用的数据好。(https://medium.com/knerd/eureka-why-you-shouldnt-use-zookeeper-for-service-discovery-4932c5c7e764 PS:需要科学上网)

   3.2 Zone和Region设计

  • 多中心设计

   3.3 Self Preservation机制

  • 触发条件,比如发生了极端情况,EurekaServer和Client之间出现了网络分区,大量app实例掉线
  • 怎么办?Eureka Client 端与 Server 端之间有个租约,Client要定时发送心跳来维持这个租约,表示自己还存活着。Eureka通过当前注册的实例数,去计算每分钟应该从应用实例接收到的心跳数,如果最近一分钟接收到的续约的次数小于等于指定阈值的话,则关闭租约失效剔除,禁止定时 任务剔除失效的实例,从而保护注册信息。

常常遇到的问题:

1. 为什么服务下线 了,Eureka Server接口返回的信息还会存在。

调整 EvictionTask 的调度频率,比如下面配置将调度间隔从默认的60秒,调整为5秒:

eureka.server.eviction-interval-timer-in-ms=5000

或者 关闭readOnlyCacheMap:

eureka.server.use-read-only-response-cache=false

或者 调整 readWriteCacheMap 的过期时间:

eureka.server.response-cache-auto-expiration-in-seconds=60

2. 为什么服务上线了,Eureka Client 不能及时获取到。主要针对测试环境。

可以适当提高 Client 端拉取 Server 注册信息的频率,例如下面将默认的 30 秒改为 5 秒:

eureka.client.registry-fetch-interval-seconds=5

3.对持续集成的影响

开启Self Preservation机制有时候会影响持续集成,通过如下参数关闭该机制:

eureka.server.enableSelfPreservation=false

生产环境可以把 renewalPercentThreshold 及 leaseRenewalIntervalInSeconds 参数调小一点,进而提高触发 SELF PRESERVATION 机制的门槛,比如:

eureka.instance.leaseRenewalIntervalInSeconds=10 ##默认30 

eureka.server.renewalPercentThreshold=0.49 ##默认0.85

 

更多高级调优可以参考《重新定义SpringCloud实战》这本书。

其中我最有兴趣的是基于metadata路由实例那一节,其内容主要是配合Ribbon实现灰度或不停机升级。但是书中讲得比较粗浅,难以理解。详情请参考下面这篇文章。

https://www.pianshen.com/article/3204341259/

对于文章中的示例,有时间再做笔录和说明。

待续。。。。。。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值