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/
对于文章中的示例,有时间再做笔录和说明。
待续。。。。。。
Eureka是Netflix开源的服务发现组件,用于辅助微服务间的负载均衡。它采用P2P架构,允许自定义负载均衡策略。在极端情况下,SelfPreservation机制能保护注册信息。常见问题包括服务上下线信息同步延迟,可通过调整配置优化。此外,Eureka与Ribbon结合可实现灰度发布和不停机升级。





