1 Ribbon相关介绍
1.1 Ribbon是什么
Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon是一个客户端负载均衡器,它可以按照一定规则来完成多态服务器负载均衡调用,这些规则还支持自定义。
Ribbon是负载均衡器,是基于RestTemplate ,它赋予了RestTemplate 负载均衡的能力。
1.2 集成原理
其中负载均衡的算法有:轮询算法、随机算法、权重算法、响应权重算法、iphash等,默认使用轮询算法。
2 Spring Cloud 集成 Ribbon
2.1 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.1 编写配置文件 application.yml
eureka:
client:
serviceUrl:
defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/
instance:
prefer-ip-address: true
instance-id: order-server:2000
server:
port: 2000
spring:
application:
name: order-server
2.2 修改RestTemplate的Bean的定义
/**
* SpringMvc提供的一个基于Rest风格的http调用工具
* @LoadBalanced :ribbon的负载均衡标签,赋予RestTemplate有负载均衡的能力
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
2.3 Controller层调用
@RestController
@RequestMapping("/orderserver")
public class OrderServerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{id}")
public AjaxResult getUser(@PathVariable("id") Long id){
String url = "http://user-server/userserver/user/"+id;
User user = restTemplate.getForObject(url, User.class);
AjaxResult result = new AjaxResult();
result.setData(user);
return result;
}
}
3 Ribbon默认算法修改
3.1 负载均衡策略
ribbon通过服务名获取到服务列表后,要根据一定规则来选择一个服务实例来完成调用.这个规则就叫负载均衡策略.
- IRule
通过配置不同IRule的子类,可以选择不同负载均衡策略,也就是从服务列表以特定策略选择一个服务来完成调用。当然也可以自定义。所以负载均衡策略可以分为内置和自定义。 - 内置负载均衡策略:
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule(默认) | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略:(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。注意:可以通过修改配置。loadbalancer.[clientName].connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上线,可以由客户端的[clientName].[clientConfigNameSpace].ActiveConnectionsLimit属性进行配置。 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。 |
BestAvailableRule | 忽略哪些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
Retry | 重试机制的选择逻辑 |
3.2 算法修改的实现
/**
* 随机算法
* @return
*/
@Bean
public IRule myRule(){
return new RandomRule();
}