源码仓库:github-CNXMBuyu-springclouddemo
Eureka
用法看源码
服务注册中心的一些基本操作如下图:
- EurekaClient:包含服务提供者和服务调用者
- EurekaServer:Eureka服务器
register - 服务注册
EurekaClient向EurekaServer提供自身的元数据。
renew - 服务续约
EurekaClient在默认情况下,每隔30秒会发送一次心跳来进行服务续约。通过服务续约来告知服务器,该EurekaClient是可用的。
正常情况下,如果EurekaServer在90秒内没有收到EurekaClient的心跳,则会将EurekaClient实例从注册列表中移除。
fetchRegistry - 获取服务注册列表信息
EurekaClient从EurekaServer获取服务注册表信息,并将其缓存在本地。EurekaClient会使用服务注册列表信息查找其他服务的信息,从而进行远程调用。
默认30秒更新一次
cancel - 服务下线
EurekaClient在程序关闭时可以向EurekaServer发送下线请求。
DiscoveryManager.getInstance().shutdownComponent();
构建EurekaServer集群
Ribbon
用法看源码
在测试负载均衡时,需要把配置eureka.instance.preferIpAddress=true加上,不然会调用超时(或者配置hosts文件也可以)。
简介
将负载均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
Ribbon作为服务消费者的负载均衡器,有两种使用方式。一种是和RestTemplate相结合,另一种是和Feign相结合。
LoadBalancerClient介绍
负载均衡器LoadBalancerClient是从EurekaClient获取服务注册列表信息的,并将服务注册列表信息缓存一份。根据负载均衡策略选择一个服务实例的信息,从而进行负载均衡。
可以通过配置ribbon.eureka.enable=false,来禁止调用EurekaClient获取注册列表,通过配置stores.ribbon.listOfServers=a.com,b.com
IRule
- BestAvailableRule:选择最小请求数
- ClientConfigEnabledRoundRobinRule:轮询
- RandomRule:随机选择一个server
- RoundRobinRule:轮询选择server
- RetryRule:根据轮询的方式重试
- WeightedResponseTimeRule:根据响应时间分配一个weight,weight越低,被选择的可能性就越低
- ZoneAvoidanceRule:根据server的zone区域和可用性来轮询选择
// 改变负载均衡的策略
@Bean
public IRule rule(){
return new RandomRule();
}
IPing
- PingUrl:真实地去ping某个url,判断其是否可用
- PingConstant:固定返回某个服务是否可用,默认返回true,即可用
- NoOpPing:不去ping,直接返回true,即可用
- DummyPing:直接返回true,并实现了initWithNiwsConfig方法
- NIWSDisconveryPing:根据DiscoveryEnabledServer的InstanceInfo的InstancesStatus去判断,如果为InstanceStatus.UP,则可用,否则不可用。
负载均衡原理
- 通过EurekaClient获取服务注册列表
- 通过IPing,默认每10秒发送一次ping,来更新服务的注册列表信息
- 根据负载均衡策略来实现负载均衡
Feign
用法看源码
Hystrix
工作机制
- 当某个API服务在一定时间内失败的次数大于设定的阈值,则打开熔断器;打开熔断器的服务会执行快速失败的逻辑(即fallback指定的方法)
- 处于打开的熔断器,过一段时间会处于半打开模式状态。(一部分执行正常逻辑,一部分执行失败逻辑)
- 自我修复能力。当执行正常逻辑的请求都成功了,则关闭熔断器,否则继续打开熔断器。