参阅
https://github.com/zhangxd1989
https://github.com/codecentric/spring-boot-admin
https://github.com/ityouknow/spring-boot-examples
Finchley -> Greenwich 2.1.1
Dalston ->Edgware SR5 1.2.2-1.4.2
1. Eureka
1.1 自我保护机制与自我保护模式
自我保护机制是当大量客户端连接异常时触发(没有收到下线通知,缺无法连接),则进入自我保护模式
进入自我保护模式后将不再下线任何实例
配置项(EurekaServerConfigBean, EurekaClientConfigBean中可查看默认值):
## 客户端与服务端共用属性
eureka.instance.lease-renewal-interval-in-seconds = 30 服务端和客户端的心跳频率,默认30秒,不建议更改(客户端与服务端需保持一致),因为服务端认为客户端按此频率心跳来进行评估
eureka.instance.lease-expiration-duration-in-seconds = 90 心跳超时时间,服务端达到多少秒没有收到心跳,才认为客户端出现心跳异常并设定注册表信息为过期且应该剔除实例(用于容忍临时性的网络故障),
## 服务端属性
### 服务端清理任务
eureka.server.eviction-interval-timer-in-ms = 60 剔除过期(超过lease-expiration-duration)注册表(实例)信息任务的间隔实现,前提未处于自我保护模式
此值确定无效结点是否会被及时清理,但清理的过于及时,则有效实例比例较高,不容易进入自我保护模式
### 服务端自我保护机制
eureka.server.enable-self-preservation=true 用于开启或关闭自我保护机制,关闭自我保护机制可强制退出自我保护模式,生产环境建议开启,确实应关闭时可临时性的手动关闭
是否在自我保护模式可在Eureka WEB UI中的Lease expiration enabled判断 如果Lease expiration enabled=false则表示禁止剔除结点,在自我保护模式中
eureka.server.renewal-threshold-update-interval-ms: 15*60*1000 自我保护阈值的评估(评估周期),根据周期内的实际总心跳数计算实际每分钟平均心跳数
例如:实际总条数N,每分钟心跳数=N/15 此值显示在Eureka WEB UI的Renews (last min)中
eureka.server.renewal-percent-threshold=0.85(暂时设置0.75): 开启自我保护机制时,根据服务总数量和此阈值计算每分钟预期应该受到的最低心跳数阈值,如果低于此值,则进入自我保护模式
例如:服务数SC=4, 单服务每分钟预期心跳数RPS=2 每分钟预期总心跳数=SC*RPS=8 预期心跳阈值为 8*0.75 = 6 此值显示在Eureka WEB UI的Renews threshold中
1.2 物理分区配置(Kubernetes的nodelabel也有类似的概念,来自于AWS)
datacenter: 数据中心类型,自建,Aliyun, AWS等
env: 数据中心的目录,研发环境,生产环境等
region: 实例所在的地域(不同地域间网络延迟存在差异)
zone: 实例所在的地方(可用区,不同机房可提供高可用环境,因采用不同的供电,网络等机制设置)
1.3 实例元数据
instance-id:实例的唯一ID, 需保证每个唯一,可以用主机名+端口号+版本号表示
hostName: Spring Cloud使用hostName+Port进行心跳检查,必须是有效的且可进行通信的网络标识
app: 服务名称,用于标识功能相同的服务实例(以实现负载均衡),一个服务可以由很多个实例
vipAddress: Ribbon负载均衡客户端与vipAddress进行匹配的名称,也是服务实际提供服务的地址,可自行实现服务端的高可用和负载均衡能力
Eureka Rest API列表
https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
剔除节点的规则
2. Feign && Ribbon
2.1 轻量的HTTP客户端 Feign, 本意是伪装,假装
@FeignClient
作用: FeignClient配置,FeignCLient注解的接口最终实现类是ReflectiveFeign(动态代理类),最终交由MethodHandler接口处理请求
解析类: FeignClientsRegistrar(通过@EnableFeignClients注解 import)
原理: FeignClientsRegistrar通过扫描@FeignClient注解,并将扫描到的注解利用工厂类FeignClientFactoryBean批量生成ReflectiveFeign并添加到SpringIoC容器
创建流程:
调用流程:
FeignClient->Proxy->ReflectiveFeign.invoke->SynchronousMethodHandler.invoke->LoadBalancerFeignClient.execute
Target
|-HystrixTargeter(默认)
MethodHandler
|-SynchronousMethodHandler(默认)
2.2 客户端的负载均衡器 Ribbon的相关对象结构
Client
|-LoadBalancerFeignClient
LoadBalancerClient
|-RibbonLoadBalancerClient
ILoadBalancer
|-AbstractLoadBalance
|-BaseLoadBalancer
|-DynamicServerListLoadBalancer 可动态更新ServerList的负载均衡器
|-ZoneAwareLoadBalancer
ServerList
|-DomainExtractingServerList
|-DiscoveryEnabledNIWSServerList(默认) 从Eureka client获取ServerList
ServerListFilter
|-ZoneAffinityServerListFilter 根据Zone亲和性进行Server选择
|-ZonePreferenceServerListFilter(默认) 优先使用local zone作为负载均衡使用
|-ServerListSubsetFilter 用于在大量Server提供的情况下选择一部分Server作为负载均衡使用