【SpringCloud】10 Ribbon 服务负载均衡与调用
基于Netfilx Ribbon实现的客户端,负载均衡工具
提供客户端软件负载均衡算法和服务调用
在之前的Eureka谈及负载均衡时就已经使用过了这个技术
就是对RestTemplate引用注解的@LoadBalanced

我们可以翻看Maven的依赖:
spring-cloud-starter-eureka-client

或者也可以单独拉出来导入使用:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
回顾RestTemplate:
之前一直调用的是Object方法,其作用是返回Json

如果调用的是Enitity方法,那么将包含响应的重要信息,例如:响应头,响应状态码,响应体

设置响应状态已经提供了基本的规范匹配:

IRule自定义负载规则:
就是自定义声明一个类实现Ribbon的接口或者抽象类,重写负载方法即可
但是特别要注意的问题是,我们Ribbon的这个自定义类,不允许@ComponentScan被SpringBoot扫描到
也就是@ComponentScan的当前包及其后代包目录都不能存放,
否则该配置会变成全局配置,所有的Ribbon客户端均能被配置生效
失去了单独配置的意义了
那么。。。SpringBoot启动类的注解就会表示当前目录下的所有包。

也就是Ribbon的配置必须在启动类所在的目录的上一级才可以配置
package cn.dzz.custom; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author DaiZhiZhou * @file SpringCloud-ATGG-2020 * @create 2020-08-26 22:04 */ @Configuration public class CustomizeRibbonLoadRule { @Bean public IRule customizeRule(){ return new RandomRule(); } }
回到主启动类,因为脱离SpringBoot启动注解的扫描,我们需要自己来手动注册成为Bean容器

开启之前的Eureka集群和单机服务中心 7001 + 7002 ,启动原始的8001服务 + 8002服务,再启动80服务
访问接口查看:
http://localhost/order/consumer/payment/get/1 {"code":200,"message":"查询数据成功 端口:8001","data":{"id":1,"serial":"aaabbb111"}}
服务访问正常,多刷新几次就会发现,每次请求的端口都将不会一样
轮询算法原理:
服务集群即一个服务的实例的集合,被Ribbon封装在一个封装服务实例的List中
这样的每一个服务实例元素就有对应的索引编号
需要的变量要素:
1、接口的总的请求次数 == RequestCount
2、服务集群总数 == ClusterCount
3、服务实例索引 == Available-Instance-Index
Available-Instance-Index = RequestCount % ClusterCount
得到我们的取余数,余数即为我们服务实例索引

浙公网安备 33010602011771号