springcloud微服务-feign

1.ribbon

  1.创建restTemplate的bean的时候加上@LoadBalanced注解

  2.通过http调用时,不在需要指定具体的实例,直接使用"http://eureka-client/sayHi"即可,ribbon底层做了负载均衡逻辑

  3.ribbon默认懒加载,客户端第一次发起http调用时,加载负载均衡策略,很可能导致http调用超时。需要修改成饥饿加载模式

    ribbon.eager-load.enabled=true

    ribbon.eager-load.clients=ribbon-consumer

 

  ribbon的七种负载均衡策略

      1.随机

    2.轮询

    3.重试

    4.权重

    5.最少连接

    6.可用性过滤(是否熔断,连接数是否过大等)

    7.组合过滤(包含zone过滤和可用性过滤)

 

  ribbon实现配置负载均衡策略

    1.使用一个配置类做全局配置,@Configuration+@Bean注解, 

      @Configuration
      public class RibbonConfigruation {

     @Bean
     public IRule defaulLBStrategy(){
       return new RandomRule();
     }

      }

    2.通过配置文件方式,服务名称.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.***

      eureka-client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

    3.通过注解方式,@RibbonClient,指定name和configuration属性,其中注解方式加载顺序在后,所以优先级更高   

      @RibbonClient(name = "eureka-client",configuration = com.netflix.loadbalancer.RandomRule.class)

负载均衡策略源码解析
  1.随机 底层是一个random函数
  2.轮询 底层有一个CAS+自旋锁的逻辑,所谓自旋,就是for(;;)或者while(true),- -! ,退出循环的条件是CAS,即要比较的值和预期的值相等,也就是说没有其他线程修改过。

LoadBalancer作用原理
  通过@LoadBalanced注解对restTemplate进行打标,ribbon将带有负载均衡能力的拦截器注入到restTemplate中,发送http请求前进行拦截,根据负载均衡策略改造url
Ribbon的IPing机制
  闲的没事干,给ribbon找点事情做- -!
  1.自娱自乐 默认返回true,即认为所有节点都可用
  2.隔山打牛 通过eureka发现可用的节点(此功能完全可以放在eureka做)
  3.主动出击,给所有节点发送http请求,确认可用状态(增加服务器压力,没有必要)

选择哪种负载均衡策略?
  没有银弹!具体问题具体分析,没有一劳永逸的解决方案。
  1.做好了幂等处理的服务菜可以使用retry策略,否则可能是灾难性的
  2.响应时间敏感型服务使用最短连接时间策略
  3.连接数敏感型服务使用最小连接数策略
  4.搭配了hystrix的服务使用AvailabilityFilteringRule,根据熔断状态做过滤
  5.无所谓?那就直接默认好了,轮询走起

ribbon自定义负载均衡策略(一致性hash算法)

·1.什么是一致性hash算法?
  把所有待选节点的hash值放在一个环上,通过对一个特征变量(比如url)取hash值,在这个hash环上顺时针方向找到对应的最近节点,作为选择结果。底层实现可以采用treemap的有序性,通过tailMap()方法找到hash更大的所有节点,取第一个。如果没有更大的,就取第一个,从而实现hash环的概念。
 2.在做的时候,需要对每个节点做虚拟化,目的是让节点在hash环上分布的更加均匀一些,防止某个节点承担了过多的请求。


feign调用:
  1.引入feign的jar包
  2.将要提供服务的接口加上@feignClient注解,name属性为服务的名称
  3.配置文件添加spring.main.allow-bean-definition-overriding,设置允许bean覆盖
  4.在需要远程服务的项目中,启动类上添加@enableFeignClients注解,并通过basepackage属性指定扫包路径
  5.在需要调用的类中,像调用本地方法一样去调用远程服务。

    

  远程调用超时判定,优先级从低到高:

    1.ribbon重试

    2.feign重试

    3.hystrix重试

               

posted @ 2020-07-27 22:26  红嘴鲤鱼  阅读(335)  评论(0编辑  收藏  举报