什么是Ribbon?
Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
负载均衡的流程图
负载均衡流程图
负载均衡原理图
基本流程如下:
- LoadBalancerIntercepor拦截器拦截我们的RestTemplate请求http://userservice/user/1
- RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
- DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
- eureka返回列表,localhost:8081、localhost:8082
- IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
- RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
负载均衡的算法
轮询:
- 将所有请求,依次分发到每台服务器上,适合服务器硬件同相同的场景。
- 优点:服务器请求数目相同;
- 缺点:服务器压力不一样,不适合服务器配置不同的情况;
随机:
- 请求随机分配到各个服务器。
- 优点:使用简单;
- 缺点:不适合机器配置不同的场景;
最少链接:
- 将请求分配到连接数最少的服务器(目前处理请求最少的服务器)。
- 优点:根据服务器当前的请求处理情况,动态分配;
- 缺点:算法实现相对复杂,需要监控服务器请求连接数;
Hash(源地址散列):
- 根据IP地址进行Hash计算,得到IP地址。
- 优点:将来自同一IP地址的请求,同一会话期内,转发到相同的服务器;实现会话粘滞。
- 缺点:目标服务器宕机后,会话会丢失;
加权:
- 在轮询,随机,最少链接,Hash等算法的基础上,通过加权的方式,进行负载服务器分配。
- 优点:根据权重,调节转发服务器的请求数目;
- 缺点:使用相对复杂;
Ribbon用来负载均衡的策略
默认 RoundRobinRule 简单轮询策略
如何更改负载均衡策略
导入pom文件
<!-- 修改负载均衡的策略的pom-->
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-loadbalancer</artifactId>
<version>2.3.0</version>
</dependency>
<!-- ribbon的pom-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
第一种:创建配置类
注意:不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享。
单独创建一个module用作负载均衡,取名ribbon
第一步:创建配置类
/**
* @author XiaoSuDa
* @description: 更改负载均衡策略$
*/
@Configuration
public class RibbonRandomRuleConfig {
//方法名一定要叫iRule
@Bean
public IRule iRule(){
return new RandomRule(); //更改为随机选择服务器
}
}
第二步:修改启动类
@SpringBootApplication
@EnableEurekaClient
//name属性是服务名,取配置文件的spring.application.name的值,configuration属性是指该服务的负载均衡机制为该配置类修改的负载均衡机制
//表示stock-service服务实例使用RibbonRandomRuleConfig配置类配置的负载均衡机制,这里是随机机制
@RibbonClients(value = {
@RibbonClient(name = "cloud-client",configuration = RibbonRandomRuleConfig.class),
@RibbonClient(name = "cloud-providers",configuration =RibbonRandomRuleConfig.class)
})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
@LoadBalanced //负载均衡
/**
* 默认的负载均衡机制采用的类似轮询的这种均衡机制
*/
public RestTemplate restTemplate(RestTemplateBuilder builder){
//spring官网建议RestTemplateBuilder构造器来进行构造,这里体现了构造者设计模式
return builder.build();
}
}
@RibbonClient注解中,name为eureka注册中心的实例名字,configuration为配置类名字,如果需要配置多个负载均衡,则选择 @RibbonClients 注解
第三步:修改yml文件,将ribbon服务注册到eureka
server:
port: 8084
spring:
application:
name: ribbon
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka
instance:
hostname: 127.0.0.1
prefer-ip-address: true
instance-id: 127.0.0.1:8084
第二种:修改yml文件
cloud-providers: #提供者应用名,取提供者配置文件的spring.application.name的值
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #随机负载均衡策略
Ribbon饥饿加载
Ribbon默认懒汉加载,第一次加载速度很慢,更改为饥饿加载,可以提高第一次加载速度
修改方法:修改yml文件
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: #指定Eureka服务实例名称
- cloud-providers
- cloud-client