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重试