irpas技术客

【SpringCloud 2021.0.0】7、LoadBalancer 负载均衡(客户端) 非Ribbon (spring-boot 2.6.3)_土味儿~

大大的周 3181

1、负载均衡以及Ribbon 1)Ribbon是什么? Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说,就是在配置文件中列出 LoadBalancer (简称LB:负载均衡) 后面所有的机器,Ribbon 会自动的帮助你基于某种规则 (如简单轮询,随机连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定义的负载均衡算法! 2)Ribbon能干嘛?

LB,即负载均衡 (LoadBalancer) ,在微服务或分布式集群中经常用的一种应用。负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高用)。常见的负载均衡软件有 Nginx、Lvs 等等。Dubbo、SpringCloud 中均给我们提供了负载均衡,SpringCloud 的负载均衡算法可以自定义。负载均衡简单分类: 集中式LB 即在服务的提供方和消费方之间使用独立的LB设施,如Nginx(反向代理服务器),由该设施负责把访问请求通过某种策略转发至服务的提供方! 进程式 LB 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器。Ribbon 就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址! 2、Spring Cloud 2020.0 新特性

2020是大版本,2021是在2020的基础上小的升级

参考:

https://blog.csdn.net/alisystemsoftware/article/details/111935236

https://blog.csdn.net/u013277209/article/details/111610862

旧版本的 spring-cloud-netflix-dependencies 管理着 Netflix 所有组件,包括 Hystrix、Ribbon、Zuul、Eureka 等。而自 2020.0 版本起它有且只管理 Eureka(包括 Server 和 Client)

Spring Cloud 2020.0.0 作为一个主要版本,带来了众多显著的变化,其中进行了一些阻断式更新(不向下兼容)

组件替代方案

3、集成 LoadBalancer 1)导jar包

在消费者 springcloud-consumer-dept-80 模块的 pom.xml 中导入

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> 只需要导入 spring-cloud-starter-netflix-eureka-client 即可(父工程中有版本号)里面包含了 LoadBalancer

spring-cloud-starter-netflix-ribbon 这个包不需要再导入;自SpringCloud 2020起,已经舍弃了ribbon <!-- 不需要这个包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.10.RELEASE</version> </dependency> 2)配置Eureka application.yml # 配置eureka eureka: client: # 消费者需要从注册中心获取服务,也要连接注册中心 # 因为不是服务提供者,不需要向注册中心注册,所以为 false register-with-eureka: false # 注册中心地址 service-url: defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/ 3)@EnableEurekaClient

主启动类加上 @EnableEurekaClient 注解,开启Eureka

@SpringBootApplication @EnableEurekaClient public class DepartmentConsumer_80 { public static void main(String[] args) { SpringApplication.run(DepartmentConsumer_80.class,args); } } 4)@LoadBalanced

自定义Spring配置类:ConfigBean.java 配置负载均衡实现RestTemplate,添加 @LoadBalanced 注解

使用 RestTemplate 和 RestOperations 都可以;建议用新版 RestOperations

@Configuration public class ConfigBean { /** * @LoadBalanced 配置负载均衡实现RestTemplate */ //public RestTemplate getRestTemplate(){ // return new RestTemplate(); //} @LoadBalanced @Bean public RestOperations getRestTemplate(RestTemplateBuilder builder){ return builder.build(); } } 5)修改conroller @Autowired //private RestTemplate restTemplate; // 选用 RestOperations private RestOperations restTemplate; /** * 服务提供者基础路径 */ //private static final String REST_URL_PREFIX = "http://localhost:8001"; // 通过服务名来访问;服务名不区分大小写 private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";

服务名:

不区分大小写服务名指的是服务提供者的yml文件中配置信息 spring: application: # 服务名称 name: springcloud-provider-dept 6)测试

7)多服务提供者测试 (1)新建两个服务提供者

springcloud-provider-dept-8002 和 springcloud-provider-dept-8003

与 springcloud-provider-dept-8001 一样,提供同样的服务

三个服务提供者提供相同的服务,服务名一致 # spring spring: application: # 服务名称一样 name: springcloud-provider-dept

不同之处

每个服务端口不同:分别为 8001、8002、8003

每个服务连接的数据源不同

需要三个数据库:springcloud_db01,springcloud_db02,springcloud_db03

分别修改 DepartmentMapper.xml 中的SQL语句

如:insert into springcloud_db01.department(dept_name, db_source) VALUES (#{deptName},DATABASE()) 连接各自的数据库

MyInfo.java:修改服务的info信息

主启动类名称不同

(2)启动测试

默认为轮询算法

4、切换负载均衡算法

Ribbon 中的算法实现类有多种;但已经舍弃

在新版 LoadBalancer 中的算法实现类只有两种:RoundRobinLoadBalancer , RandomLoadBalancer;可以自定义

切换随机算法

在集成 LoadBalancer 成功的基础上做如下修改 1)新建配置类

官方建议:

不与主启动类在同级目录 可以建在主启动类的上级目录下;目的是不让 @SpringBootApplication 或 @ComponentScan 扫描到 不要加 @Configuration 注解

提示:

经过测试,建立同级目录下,或者加上 @Configuration 之后,也可以;但可能会造成其它问题,没有深入探究

//@Configuration 不要加这个注解 public class CustomLoadBalancerConfiguration { @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); System.out.println("随机============="); return new RandomLoadBalancer(loadBalancerClientFactory .getLazyProvider(name, ServiceInstanceListSupplier.class), name); } } 2)@LoadBalancerClient 在@SpringBootApplication 能扫描的范围内设置配置 RestOperations 的配置类@LoadBalancerClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = CustomLoadBalancerConfiguration.class) @Configuration @LoadBalancerClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = CustomLoadBalancerConfiguration.class) public class ConfigBean { @LoadBalanced @Bean public RestOperations getRestTemplate(RestTemplateBuilder builder){ return builder.build(); } }

解析: 请求服务 SPRINGCLOUD-PROVIDER-DEPT 时,执行 CustomLoadBalancerConfiguration 中定义的算法

3)测试

测试前:使用meven的 clean 清理项目、清理浏览器缓存、重启注册中心、服务提供者、服务消费者


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #springcloud #负载均衡客户端 #非Ribbon #springboot #263 #Cloud