微服务中的负载均衡策略Ribbon

1.Ribbon介绍

Ribbon是一种运用于SpringCloud中的客户端负载均衡工具,它是由Netflix实现的。一般的负载均衡有两种实现方式,一种为客户端实现,一种为服务端实现

  • 客户端负载均衡 将负载的功能放到客户端上,在客户端上有一个服务器列表,每次调用由客户端决定调用哪个服务器,缺点就是增加客户端的压力,优点就是简单,不需要额外的服务器。
  • 服务端负载均衡:将客户端的请求发送到服务器上,由服务器选择哪个节点来处理,好处是不要增加客户端的压力,坏处是需要增加服务器,并且配置麻烦,nginx和F5就是服务端负载均衡的代表
2.DEMO
2.1 pom引用
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
2.2 application
@SpringBootApplication
@EnableDiscoveryClient
public class app {

    @Bean
    @LoadBalanced
    public RestTemplate register(){
        return new RestTemplate();
    }


    public static void main(String[] args) {
        new SpringApplicationBuilder(app.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }

}

2.3 controller
@RestController
@Slf4j
public class Controller {
    @Autowired
    private RestTemplate restTemplate;

    

    @GetMapping("/hello")
    public String hello(){

         return restTemplate.getForObject("http://eureka-client/sayHi",
                String.class);

    }


}
2.4 application.yml
spring:
  application:
    name: eureka-consumer

server:
  port: 40000
## 注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:20000/eureka/

2.5 启动eureka服务端和两个客户端,用postman调用

在这里插入图片描述

在这里插入图片描述

3.负载均衡策略

如果对Ribbon的负载均衡策略的源码感兴趣可以参考一下这篇文章:Ribbon策略模式源码品读

RandomRule

随机访问策略,从可用的服务节点中随机挑选一个节点访问。

RoundRobinRule

顺序访问,一个节点一个节点的依次分配
在这里插入图片描述

RetryRule

在其他策略上增加重试功能
在这里插入图片描述

WeightedResponseTimeRule

能者多劳,根据服务节点的响应时间计算权重,响应时间越长,权重越低,反之同理,权重的高低决定了机器被选中概率的高低,也就是说响应时间越短的节点被选中的概率越大。注意由于刚开始服务器启动的时候,对各个节点采样不足,因此会采用轮训的方式,等样本积累到一定的时候,才会切换到WeightedResponseTimeRule模式下。
在这里插入图片描述

BestAvailableRule

在过滤掉故障的节点后,会基于过去30分钟内的统计结果选取当前并发量最小的服务节点,如果没有选取出来,则还是按照轮训的方式选取节点。
在这里插入图片描述

AvailabilityFilteringRule

底层利用轮训的方式,选取节点,但是会对节点进行检查

  • 看节点是否处于熔断状态
  • 节点当前的active请求连接数是否超过阈值
    如果检查没有通过,则自动重试(次数最多10次),让RobinRule重新选择一个服务节点。
    在这里插入图片描述
ZoneAvoidanceRule

这个过滤器包含了组合过滤条件,分别是Zone级别和可用性级别。
Zone Filter: 在Eureka注册中一个服务节点有Zone, Region和URL三个身份信息,其中Zone可以理解为机房大区(未指定则由Eureka给定默认值),而这里会对这个Zone的健康情况过滤其下面所有服务节点。
可用性过滤:这里和AvailabilityFilteringRule的验证非常像,会过滤掉当前并发量较大,或者处于熔断状态的服务节点。
在这里插入图片描述

4.负载均衡策略配置

指定服务优先级大于全局配置

  1. 全局配置
    ⚠️注意:默认的策略为轮训策略
    将配置策略注入到spring中
@Configuration
public class RibbonConfigration {
    @Bean
    public IRule defaultRuler(){
        return new RandomRule();
    }

}
  1. 指定服务配置
    第一种方式在yml中配置
## eureka-client是你的服务名称
eureka-client:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

第二种方式用注解的方式配置,在启动类上增加
@RibbonClient(name = "eureka-client",configuration = com.netflix.loadbalancer.RandomRule.class),name为服务名称,configuration为具体的策略。

5.懒加载模式和饥饿加载模式
  • 懒加载模式:在第一次发起调用的时候才开始初始化Loadbalance,懒加载的好处是可以节省服务的消耗,坏处是会造成请求超时。
  • 饥饿加载模式:在服务启动的时候就开始初始化LoadBalance。
##开启饥饿加载模式
ribbon.eager-load.enabled=true
##需要饥饿加载的服务名称
ribbon.eager-load.clients=ribbon-consumer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值