Ribbon实现客户端负载均衡及策略配置
前言
Spring Cloud为什么要有负载均衡?同一个服务有多个实例,你访问哪一个?根据IP和端口访问吗?
Ribbon用来实现客户端负载均衡,由此引出两个概念
什么是服务端负载均衡?客户端发送请求到服务端,服务端再根据负载均衡策略把请求分派到某台服务器上。
什么是客户端负载均衡?客户端发送请求前查看服务列表,根据负载均衡策略选择一个服务进行请求。
负载均衡策略怎么配置?好多博客写的我都试过,都不能用,最后在Stack Overflow找到了答案,直接配置一个IRule的@Bean就行了
1、Ribbon负载均衡机制
- BestAvailableRule:选择一个最小并发请求的server
- AvailabilityFilteringRule:过滤掉那些因为一直连接失败而被标记为circuit tripped的server,同时过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
- WeightedResponseTimeRule:根据响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
- RetryRule:在一定时间内不断重试subRule,默认subRule是RoundRobinRule
- RoundRobinRule:轮询访问服务器(默认)
- RandomRule:随机选择一个server进行请求
- ZoneAvoidanceRule:判断server所在区域的性能和server的可用性来综合选择
2、Ribbon负载均衡实战
step1
首先,为了简单,我们只启动一个EurekaServer,配置如下:
server:
port: 20001
eureka:
instance:
hostname: server1 #注意修改host 127.0.0.1 server1
client:
service-url:
defaultZone: http://server1:20001/eureka/
fetch-registry: false
register-with-eureka: false #不是集群,所以不用开启fetch和register
server:
enable-self-preservation: false #关闭自我保护保护模式,防止Emergency飘红
image.png
step2
使用上篇博客https://www.jianshu.com/p/34892e62771c中的service,启动两个实例
step3
新建一个springboot项目,引入web Eureka client ribbon,yml配置如下
server:
port: 8772
#为服务命名
spring:
application:
name: ribbon-consumer
#指定服务注册中心的地址
eureka:
client:
service-url:
defaultZone: http://server1:20001/eureka/
新建一个service,引入RestTemplate,所有对远端的调用直接用restTemplate的相关方法就行了。调用不用写iP,直接使用服务名称就行
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
public String helloService() {
return restTemplate.getForObject("http://SERVICE-HI/hi", String.class);
}
public String helloFallBack() {
return "Error occurred !";
}
}
上面的RestTemplate是需要配置的,新建一个配置类,配置Restemplate,并注解为LoadBanced(用来做负载均衡器),IRule的配置就是配置负载均衡策略的。
@Configuration
public class CloudProviderConfiguration {
@Bean
public IRule ribbonRule() {
return new WeightedResponseTimeRule();
}
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
总结
上述代码git地址https://github.com/KouLouYiMaSi/springcloud,Eureka服务使用eureka-server,服务使用service-hi,负载均衡使用ribbon