熔断就像保险丝一样,保险丝能够保证在设备出现故障之后,依然可以保护家庭电器可以正常使用,现在又若干微服务,并且微服务之间可以互相调用。
Hystrix熔断处理
如果在实际项目设计中没有处理好熔断,就会产生雪崩效应,spring cloud提供Hystrix熔断机制,以保证即使某一个微服务出现问题之后,依然可以正常使用。
ribbon
- ribbon是一个基于http/tcp的客户端负载均衡工具,它是基于Netflix Ribbon实现的。
- 它不像spring cloud服务注册中心,配置中心,API网关那样独立部署,但是它几乎存在于每个spring cloud微服务中,包括feign提供的声明式事务调用也是基于ribbon实现的。
- ribbon默认提供多种负载均衡算法,例如轮询,随机等等,甚至包含自定义的负载均衡算法。
- 它解决并提供了微服务的负载均衡问题。
负载均衡解决方案分类
- 第一类:集中式负载均衡,即在consumer和provider之间使用独立的负载均衡设施(可以是硬件,也可以是软件(nginx)),由该设施负责把访问请求通过某种策略转发至provider。
- 第二类:进程内负载均衡,将负载均衡的逻辑集成到consumer,consumer从服务注册中心获知有哪些地址可用,然后再从这些地址中选择一个合适的provider。
- ribbon属于后者(进程内的负载均衡),它只是一个类库,集成于consumer进程,consumer通过它来获取provider地址。
七种常用的负载均衡策略
- 轮询策略(RoundRobinRule),轮询策略表示每次都顺序取下一个provider,比如有5个provider,第一次取第一个,第二次取第二个。
- 权重轮询策略(WeightedResponseTimeRule),根据每个provider的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
- 随机策略(RandomRule),从provider列表中随机选择一个provider。
- 最少并发数策略(BestAvailableRule),选择正在请求中的并发数最小的provider,除非这个provider正在熔断中。
- 在选定的负载均衡策略基础上进行重试(RetryRule),假定选定的负载均衡策略是轮询策略。该策略先选定一个阀值时间段,如果这个阀值时间段内选择provider不成功,则一直尝试采用轮询策略,最后选择一个可用的provider。
- 可用性敏感策略(AvailabilityFilteringRule),过滤性能差的provider,有两种策略:1.过滤掉在eureka中一直处于连接失败的provider。2.过滤掉高并发的provider。
- 区域敏感性策略(ZoneAvoidanceRule),以一个区域为单位考察可用性,对于不可用的区域,整个丢弃,从剩下的区域中选择可用的provider。
修改默认的负载均衡策略的方法
方式一:在启动类上新增一个bean
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
方式二:修改配置文件
[provider-name].ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRule(轮询模式)
Feign
- Feign是一种声明式,模板化的HTTP客户端(仅在consumer中使用)
- 声明式调用就像调用本地方法一样调用远程方法,无感知远程http请求。
- spring cloud的声明式调用,可以做到使用HTTP请求远程服务时,就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个http请求。
- 它像dubbo一样,consumer直接调用接口方法调用provider,而不需要通过常规的HttpClient构造请求再解析返回数据。
- 它解决的让开发者调用远程接口就跟调用本地方法一样,无需关注与远程交互的细节,更无需关注分布式环境开发。
声明式服务调用的好处:
- 如果不采用声明式服务调用,而是直接采用负载均衡对象调用注册在eureka上的服务,则需要使用负载客户端选取服务提供方,再利用字符拼接拼出要请求的服务的url地址,再使用RestTemplate去调用,比较繁琐。
- 使用Feign声明式调用事务,只需要再需要调用的逻辑方法上加@FeignClient(name="[服务提供方]"),再在服务的逻辑方法上继承提供方接口即可,实现了之后就像调用本地方法一样调用远程方法。
如果方法中传入一个对象,feign会自动地把请求转换为post,因此用@RequestParam进行逐个传参。采用了httpclient后就不会自动将请求转换为post。
当传递地参数是对象时,需要在@RequestMapping注解中加入consumes=MediaType.APPLICATION_JSON_VALUE)。
对feign地负载均衡进行优化配置
- feign地负载均衡采用的是ribbon,对ribbon的配置进行优化。
- ribbon的配置分为全局配置和局部配置
- ribbon的全局配置
#请求连接的超时时间
ribbon.connectTimeout=5000
#请求处理的超时时间
ribbon.ReadTimeout=5000
4.ribbon为什么需要局部配置?
通常情况下,一个consumer需要依赖多个provider,如果配置为全局,就会形成一刀切的现象,通过局部配置,在配置中指定具体的服务实例清单。
5.ribbon的局部配置
#对所有操作请求都进行重试
e-book-product.ribbon.okToRetryOnAllOperations=true
#对当前实例的重试次数
e-book-product.ribbon.MaxAutoRetries=2
#切换实例的重试次数(用于集群)
e-book-product.ribbon.MaxAutoRetriesNextServer=0
#请求连接的超时时间
e-book-product.ribbon.ConnectTimeout=3000
#请求处理的超时时间
e-book-product.ribbon.ReadTimeout=3000