1.依赖导入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
当使用Eureka作为注册中心时,新版的eureka依赖包中是包含了ribbon的依赖,所以不需要重复导入,下面是eureka依赖包中的依赖
2.Ribbon介绍与使用
Ribbon的介绍
Ribbon是一个开源的提供负载均衡算法的客户端,它能够为服务添加负载均衡功能,是一个负载均衡器,能够自动的根据定义的规则(各种负载均衡算法)将请求分发到对应的服务器进行获取服务。
Ribbon的使用
Ribbon主要是通过负载均衡+restTemplate的方式进行使用,对restTemplate使用@LoadBanlanced
注解即可开启负载均衡能力
@Configuration
public class ApplicationContextConfig {
//注册restTemplate进容器,LoadBalanced开启restTemplate负载均衡的能力
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
使用ribbon负载均衡和eureka注册中心之后,调用的服务地址,不需要填写具体的ip地址,只需要填写服务的名称,Ribbon就会自动选择合适的服务器。下面的地址配置,可以看到直接填写了注册中心中的服务的名称。
@RestController
@Slf4j
@RequestMapping("/consumer/payment")
public class OrderController {
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
@Autowired
private RestTemplate restTemplate;
@PostMapping("/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
}
@GetMapping("/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
下面是注册中心中的消费者和提供者服务:
调用接口进行测试:
第一次:
第二次:
可以发现服务的端口发生了改变,证明调用了不同的消费者服务,这是负载均衡中的轮询规则,会依次调用服务。
3.Ribbon的IRule组件
IRule就是用于设置负载均衡算法的一个组件,可以实现这个接口用于编写负载均衡算法。默认实现的有以下几种负载均衡算法:
其中默认选择的是RoundRobinRule轮询规则。
各个规则的说明:
规则类 | 规则名称 | 说明 |
---|---|---|
RandomRule | 随机规则 | 随机选择一个server |
RetryRule | 重试规则 | 在一个时间段内,当选择一个server不成功,则一直重试选择一个可用的server |
StickyRule | 相同实例规则 | 总是返回相同实例的server |
RoundRobinRule | 轮询规则 | 循环选择server |
BestAvailableRule | 最低并发规则 | 跳过带有打开了断路器的server并选择并发请求最少的服务器的规则 |
AvailabilityFilteringRule | 可用过滤规则 | 过滤掉由于连续连接失败而处于断路器circuit breaker 状态的server,或者是并发数超过配置的server |
WeightedResponseTimeRule | 响应时间加权规则 | 使用平均/百分比响应时间为每个server分配动态“权重”的规则,然后以“加权循环”方式使用。 |
ZoneAvoidanceRule | 区域权衡规则 | 综合判断server所在区域的性能和server的可用性轮询选择server |
4.使用自定义的负载均衡算法
需要注意的是:
官方明确说明了,这个自定义配置类不能放到带有@componentScan
注解扫描到的包下,不然会被所有ribbon客户端所使用,达不到特殊化的配置目的
在springboot主启动类上的@SpringBootApplication
点进去,可以看到有@componentScan
注解,所以不能跟springboot主启动类在一个包下,需要新建个包。
①在myrule包下新建一个配置类
@Configuration
public class MyRule {
@Bean
public IRule myrule(){
//这里使用随机规则代替自定义
return new RandomRule();
}
}
②在主启动类上加入@RibbonClient
注解
name属性是需要调用的服务id,configuration属性是自己的自定义规则类
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyRule.class)
public class CloudConsumerOrderApplication {
public static void main(String[] args) {
SpringApplication.run(CloudConsumerOrderApplication.class, args);
}
}
③启动项目测试
第一次:
第二次:
第三次:
可以见到,的确变成了自定义规则配置的随机规则。
5.轮询规则的原理
rest接口的请求次数%服务器集群的总数=实际调用服务器的下标,每次重新启动后rest接口计数器从1开始
例如:
总共有两台服务器,一个接口去请求服务,第一次请求的就是1%2=1,调用第二个服务器,第二次请求的就是2%2=0,则调用第一个服务器,第三次3%2=1,调用第二个服务器。
在下图中,payment8012就是下标为0,payment8011就是下标为1,所以测试的时候先调用8011端口,再调用8012端口