SpringCloud(6)使用Ribbon负载均衡

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@LoadBalancedpublic 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";@Autowiredprivate 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 {@Beanpublic 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端口
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部