负载均衡
负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行操作
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡
服务端负载均衡指的是发生在服务提供者一方,比如nginx
客户端负载均衡指的是发生在服务消费的一方,也就是在发送请求之前已经选好了由哪个实例处理请求
微服务中一般会选择:客户端负载均衡
ribbon
ribbon是spring cloud的一个组件,它可用让我们使用一个注解就能轻松搞定负载均衡
使用
-
在RestTemplate的生成方法上添加注解
@Bean @LoadBalanced public RestTemplate restTemplate () { return new RestTemplate(); }
-
修改RestTemplate的调用方式
restTemplate.getForObject("http://服务名称", Object.class)
默认负载均衡策略:轮询
负载均衡策略
ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为com.netflix.loadbalancer.IRule
具体策略
策略名 | 策略描述 |
---|---|
BestAvailableRule | 选择一个最小的并发请求的server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败被标记为circuit tripped的后端server,并过滤掉那些高并发的后端server(active connections 超过配置的阈值) |
WeightedResponseTimeRule | 根据相应时间分配一个weiht,相应时间越长,weight越小,被选中的可能性越低 |
RetryRule | 对选定的负载均衡策略上重试机制 |
RoundRobinRule | 轮询方式轮询选择server,默认使用 |
RandomRule | 随机选择一个server |
ZoneAvoidanceRule | 符合判断server所在区域的性能和server的可用性选择server |
修改策略
方式一
修改配置文件
被调用服务名称:
ribbon:
NFLoadBalancerRuleClassName: 策略类全类名
方式二
-
编写自定义配置类
/** * 必须使用@Configuration * 不能在在应用程序扫描包路径下 */ @Configuration public class MyRibbonConfig { @Bean public IRule ribbonRule(){ return new RandomRule(); //具体策略 } }
-
在启动类上添加注解
//如果有多个可以使用@RibbonClients @RibbonClient(name = "被调用服务名",configuration = MyRibbonConfig.class)