《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用
  eZw8kcl3fQWu 2023年11月12日 22 0

1.Ribbon概述

1.1.是什么

《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡

1.2.官网资料

​https://github.com/Netflix/ribbon/wiki/Getting-Started​Ribbon目前也进入维护模式
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_02
未来替换方案
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_03

1.3.能干嘛

1.3.1.LB(负载均衡)

集中式LB
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_04
进程内LB
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_05

一句话:负载均衡+RestTemplate调用

2.Ribbon负载均衡演示

2.1.架构说明

《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_06
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_07

总结: Ribbon其实就是一个软负载均衡的客户端组件, 他可以和其他所需请求的客户端结合使用,和eureka结合只是其中一个实例.

2.2.POM

《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_08
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_09

2.3.二说RestTemplate的使用

官网:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_10
getForObject方法/getForEntity方法
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_11
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_12
postForObject/postEntity
GET请求方法
POST请求方法

3.Ribbon核心组件IRule

IRule:根据特定算法从服务列表中选取一个要访问的服务

《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_13
说明:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_14

RoundRobinRule: 默认轮询的方式
RandomRule: 随机方式
WeightedResponseTimeRule: 根据响应时间来分配权重的方式,响应的越快,分配的值越大。
BestAvailableRule: 选择并发量最小的方式
RetryRule: 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
ZoneAvoidanceRule: 根据性能和可用性来选择。
AvailabilityFilteringRule: 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)

4.修改Ribbon默认的负载均衡规则

方式一:修改代码更换负载均衡策略

第一步:新建一个不会被@ComponentScan组件扫描到的包,如:com.rules

第二步:在该包下新建自己的负载均衡算法的规则类

第三步:主启动类上添加注解:@RibbonClient

package com.rules;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @BelongsProject: MicroService
* @BelongsPackage: com.rules
* @CreateTime: 2020-11-18 16:50
* @Description: TODO
*/
@Configuration
public class MyLoadBalanceRule {


/**
* @desc 自定义负载均衡规则,默认是轮询规则
* @return
*/
@Bean
public IRule myRule(){
//return new RandomRule(); // 改为随机算法规则
return new RoundRobinRule(); // 轮询
}

}




@EnableEurekaClient //开启客户端
@SpringBootApplication
@RibbonClient(name = "PRODUCT-SERVICE",configuration = MyLoadBalanceRule.class)
public class ProtalApp80 {

public static void main(String[] args) {
SpringApplication.run(ProtalApp80.class,args);
}
}

方式二:修改配置文件更换负载均衡策略
第二种方式在application.properties中设置分配的策略

#设置负载均衡策略 eureka-ribbon-provider 为调用的服务的名称
eureka-ribbon-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

'eureka-ribbon-provider’是调用的服务的名称,后面的组成部分是固定的。
同时注释掉方式一中的内容

5.Ribbon负载均衡算法

5.1.原理

《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_15

5.2.源码跟踪

为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是​​LoadBalancerInterceptor​​​ 我们进行源码跟踪:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_16
继续跟入execute方法:发现获取了8001端口的服务

org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient

《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_17
如果再跟下一次,发现获取的是8002

5.3.负载均衡策略

Ribbon默认的负载均衡策略是简单的轮询,我们可以测试一下:
编写测试类,在刚才的源码中我们看到拦截中是使用​​​RibbonLoadBalanceClient​​​来进行负载均衡的,其中有一个​​choose​​​方法,是这样介绍的:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_18
现在这个就是负载均衡获取实例的方法。我们对注入这个类的对象,然后对其测试:

package com.bruceliu.test;

import com.bruceliu.SpringcloudDemoConsumerApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.test.context.junit4.SpringRunner;

/**
* @author bruceliu
* @create 2019-05-04 11:33
* @description 负载均衡算法测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringcloudDemoConsumerApplication.class)
public class LoadBalanceTest {

@Autowired
RibbonLoadBalancerClient client;

@Test
public void test1(){
for (int i = 0; i <10 ; i++) {
ServiceInstance instance = this.client.choose("SPRINGCLOUD-DEMO-SERVICE");
System.out.println(instance.getHost() + ":" + instance.getPort());
}
}
}

运行结果:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_19
符合了我们的预期推测,确实是轮询方式

我们是否可以修改负载均衡的策略呢?继续跟踪源码,发现这么一段代码:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_20
我们看看这个rule是谁:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_21
这里的rule默认值是一个​​​RoundRobinRule​​​,看类的介绍:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_负载均衡_22
这不就是轮询的意思嘛。

我们注意到,这个类其实是实现了接口IRule的,查看一下:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_23
定义负载均衡的规则接口。
它有以下实现:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_.net_24
SpringBoot也帮我们提供了修改负载均衡规则的配置入口:

SPRINGCLOUD-DEMO-SERVICE:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是:​​{服务名称}.ribbon.NFLoadBalancerRuleClassName​​​,值就是IRule的实现类。
再次测试,发现结果变成了随机:
《SpringCloud专题11》-微服务架构编码构建-Ribbon负载均衡调用_spring_25


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
eZw8kcl3fQWu