Hystrix服务治理

熔断就像保险丝一样,保险丝能够保证在设备出现故障之后,依然可以保护家庭电器可以正常使用,现在又若干微服务,并且微服务之间可以互相调用。

Hystrix熔断处理

如果在实际项目设计中没有处理好熔断,就会产生雪崩效应,spring cloud提供Hystrix熔断机制,以保证即使某一个微服务出现问题之后,依然可以正常使用。

                                                                                           ribbon

  1. ribbon是一个基于http/tcp的客户端负载均衡工具,它是基于Netflix Ribbon实现的。
  2. 它不像spring cloud服务注册中心,配置中心,API网关那样独立部署,但是它几乎存在于每个spring cloud微服务中,包括feign提供的声明式事务调用也是基于ribbon实现的。
  3. ribbon默认提供多种负载均衡算法,例如轮询,随机等等,甚至包含自定义的负载均衡算法。
  4. 它解决并提供了微服务的负载均衡问题。

                                                                              负载均衡解决方案分类

  1. 第一类:集中式负载均衡,即在consumer和provider之间使用独立的负载均衡设施(可以是硬件,也可以是软件(nginx)),由该设施负责把访问请求通过某种策略转发至provider。
  2. 第二类:进程内负载均衡,将负载均衡的逻辑集成到consumer,consumer从服务注册中心获知有哪些地址可用,然后再从这些地址中选择一个合适的provider。
  3. ribbon属于后者(进程内的负载均衡),它只是一个类库,集成于consumer进程,consumer通过它来获取provider地址。

                                                                            七种常用的负载均衡策略

  1. 轮询策略(RoundRobinRule),轮询策略表示每次都顺序取下一个provider,比如有5个provider,第一次取第一个,第二次取第二个。
  2. 权重轮询策略(WeightedResponseTimeRule),根据每个provider的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
  3. 随机策略(RandomRule),从provider列表中随机选择一个provider。
  4. 最少并发数策略(BestAvailableRule),选择正在请求中的并发数最小的provider,除非这个provider正在熔断中。
  5. 在选定的负载均衡策略基础上进行重试(RetryRule),假定选定的负载均衡策略是轮询策略。该策略先选定一个阀值时间段,如果这个阀值时间段内选择provider不成功,则一直尝试采用轮询策略,最后选择一个可用的provider。
  6. 可用性敏感策略(AvailabilityFilteringRule),过滤性能差的provider,有两种策略:1.过滤掉在eureka中一直处于连接失败的provider。2.过滤掉高并发的provider。
  7. 区域敏感性策略(ZoneAvoidanceRule),以一个区域为单位考察可用性,对于不可用的区域,整个丢弃,从剩下的区域中选择可用的provider。

修改默认的负载均衡策略的方法

方式一:在启动类上新增一个bean

@Bean

public IRule ribbonRule(){

      return new RandomRule();

}

方式二:修改配置文件

[provider-name].ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRule(轮询模式)

                                                                                              Feign

  1. Feign是一种声明式,模板化的HTTP客户端(仅在consumer中使用)
  2. 声明式调用就像调用本地方法一样调用远程方法,无感知远程http请求。
  3. spring cloud的声明式调用,可以做到使用HTTP请求远程服务时,就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个http请求。
  4. 它像dubbo一样,consumer直接调用接口方法调用provider,而不需要通过常规的HttpClient构造请求再解析返回数据。
  5. 它解决的让开发者调用远程接口就跟调用本地方法一样,无需关注与远程交互的细节,更无需关注分布式环境开发。

声明式服务调用的好处:

  1. 如果不采用声明式服务调用,而是直接采用负载均衡对象调用注册在eureka上的服务,则需要使用负载客户端选取服务提供方,再利用字符拼接拼出要请求的服务的url地址,再使用RestTemplate去调用,比较繁琐。
  2. 使用Feign声明式调用事务,只需要再需要调用的逻辑方法上加@FeignClient(name="[服务提供方]"),再在服务的逻辑方法上继承提供方接口即可,实现了之后就像调用本地方法一样调用远程方法。

如果方法中传入一个对象,feign会自动地把请求转换为post,因此用@RequestParam进行逐个传参。采用了httpclient后就不会自动将请求转换为post。

当传递地参数是对象时,需要在@RequestMapping注解中加入consumes=MediaType.APPLICATION_JSON_VALUE)。

                                                                      对feign地负载均衡进行优化配置

  1. feign地负载均衡采用的是ribbon,对ribbon的配置进行优化。
  2. ribbon的配置分为全局配置和局部配置
  3. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值