1、概念
LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。Ribbon是客户端的负载均衡算法。
2、Ribbon负载均衡的使用
(1)配置
- 在消费者模块添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 配置application.xml:添加Eureka的服务注册地址
eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 在配置类添加注解:该注解能够实现在客户端的负载均衡
@Configuration public class ConfigBean { @Bean @LoadBalanced public RestTemplate template(){ return new RestTemplate(); } }
- 在主启动类添加EnableEurekaClient注解
通过微服务的名称访问已经注册进Eureka的微服务:直接通过微服务的名称访问,前提是该服务已经注册进了Eureka
@RestController public class DeptConsumerController { private static final String REST_URL_PREFIX = "PROVIDER"; @Autowired private RestTemplate restTemplate;
(2)负载均衡
- 新建与提供者(8001)相同的两个模块,配置pom.xml、核心配置文件中要保证三个提供者对外暴露的名字相同
spring: application: name: provider
- 新建数据库,每一个服务的提供者都连接到不同的数据库
- 测试
先启动80端口(消费者)的服务,消费者通过服务的名称来获取服务,因为8001、8002、8003配置中的服务的名称是相同的,将三个服务的提供者注册进Eureka,Eureka是一个集群,消费者可以从集群中获取提供者提供的服务。
在消费中配置Ribbon的负载均衡以后,消费者获取到的服务是按顺序获取的,并不是每次获取到同一个服务(轮询算法,默认)。
3、Ribbon的组件IRule
(1)分类
RoundRobinRule:轮询,默认
RandomRule:随机
AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到
RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器
(2)使用
@Configuration public class ConfigBean { @Bean @LoadBalanced public RestTemplate template(){ return new RestTemplate(); } @Bean public IRule myRule(){ return new RandomRule(); } }
在消费者的配置类中配置即可
(3)自定义负载均衡策略
在启动类上面添加注解:
@RibbonClient(name="PROVIDER",configuration=MySelfRule.class)
定义配置类,配置类中的方法返回的是自定义策略类的对象:
@Configuration public class MySelfRule { @Bean public IRule myRule() { return new RandomRule_ZY(); } }