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
    @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包下新建一个配置类

扫描二维码关注公众号,回复: 11920774 查看本文章
@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端口
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41120971/article/details/107970574