五、Ribbon
1、什么是Ribbon
Ribbon是Netflix发布的开源项目,主要提供客户端负载均衡的工具。
简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法
2、Ribbon能干什么?
- LB,及负载均衡(Load Balance),在服务器或分布式集群中经常用的一种应用。
- 负载均衡简单的来说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用).
- 常见的负载均衡软件有Nginx, L vs等等
- dubbo、Spring Cloud中均得我们提供了负载均衡,Spring Cloud的负载均衡算法可以自定义
- 负载均衡简单分类:
- 集中式LB
- 即在服务的消费方和提供方之间使用独立的LB实施,如Nginx, 由该设施负责把访问请求通过某种策略转发至服务的提供方!
- 进程式LB
- 将LB逻辑集成到消费方,消费方从服务中心获知有哪些地址可用,然后自己再从这些地址中选取一个合适的服务器
- Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务器提供方地址
- 集中式LB
3、实践
在客户服务【80】端口导入Ribbon依赖
<!-- Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
修改配置
eureka:
client:
# 不想 eureka注册自己
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
在Config加入注解@LoadBalanced
实现RestTemplate
的负载均衡
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
在程序主入口加入开启客户端服务的注解@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}
-
Ribbon作为消费方,会从Eureka集群查询可用的服务列表,然后通过负载均衡默认算*询的方式进行挨个访问可用的服务列表。
负载均衡算法:【IRule】
- RoundRobinRule 轮询【默认】
- RandomRule 随机
- RetryRule 先按照轮询获取服务,如果服务获取失败,则会在指定的时间内进行重试。
- AvailabilityFilteringRule 会先过滤掉,跳闸,访问故障的服务,对剩下的进行轮询
4、自定义路由组件
1、创建自定义路由包(不能与程序主入口在同目录下)
复制源码RandomRule
修改主要算法,比如:每个服务要访问5次,换下一个服务
if (total < 5){
server = upList.get(currentIndex);
total++;
}else{
total = 0;
currentIndex++;
if (currentIndex > upList.size()){
currentIndex = 0;
}
// 从活着的服务获取指定的服务进行操作
server = upList.get(currentIndex);
}
2、创建Config类,将修改的路由组件,装配到Spring中
@Configuration
public class AaronRule {
@Bean
public IRule myRule(){
return new AaronRandomRule();
}
}
3、在主程序入口上添加注解@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = AaronRule.class)
`
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = AaronRule.class)
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}