Ribbon负载均衡
Nginx服务器端负载均衡:
nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。 即请求由nginx服务器端进行转发。
Ribbon客户端负载均衡:
Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡策略。 即在客户端实现负载均衡。
应用场景的区别:
Nginx适合于服务器端实现负载均衡 比如Tomcat ;Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud中都是采用本地负载均衡。
Ribbon使用(需要和RestTemplate配合使用来实现服务接口调用)
- pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
引入eureka则不需要引入ribbon依赖
2. 新建RestTemplate配置类,加上@LoadBalanced
注解
@Configuration
public class RestConfig {
@Bean
@LoadBalanced //该注解实现负载均衡 默认为轮询
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- Controller编写
@Autowired
private RestTemplate restTemplate;
public static final String PAYMENT_URL="http://CLOUD-Client";
@GetMapping(value = "/server/create")
public ResponseEntity<Result> create(Payment payment){
return restTemplate.postForEntity(PAYMENT_URL+"/payment/create",payment,Result.class);
}
@GetMapping(value = "/server/get/{id}")
public ResponseEntity<Result> get(@PathVariable("id") Long id){
return restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id,Result.class);
}
- 测试:CLOUD-SERVER端向CLOUD-CLIENT端发送请求
Ribbon选择负载均衡策略
ribbon有7种负载均衡策略可供选择:
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule | 重试策略 | 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
新建配置类,返回需要使用的负载均衡策略
@Configuration
public class RuleConfig {
@Bean
public IRule getRule(){
return new RandomRule(); //随机
}
}
主启动类添加@RibbonClient
@RibbonClient(name = "CLOUD-SERVICE", configuration = RuleConfig.class)