定制网站【SpringCloud 2021.0.0】7、LoadBalancer 负载均衡(客户端) 非Ribbon (spring-boot 2.6.3)

1、定制网站负载均衡以及

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 管理着 所有组件,包括 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>
  • 1
  • 2
  • 3
  • 4
  • 只需要导入 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2)配置Eureka

  • application.yml
# 配置eurekaeureka:  client:    # 消费者需要从注册中心获取服务,也要连接注册中心    # 因为不是服务提供者,不需要向注册中心注册,所以为 false    register-with-eureka: false    # 注册中心地址    service-url:      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3)@EnableEurekaClient

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

@SpringBootApplication@EnableEurekaClientpublic class DepartmentConsumer_80 {    public static void main(String[] args) {        SpringApplication.run(DepartmentConsumer_80.class,args);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4)@LoadBalanced

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

使用 RestTemplateRestOperations 都可以;建议用新版 RestOperations

@Configurationpublic class ConfigBean {    /**     * @LoadBalanced 配置负载均衡实现RestTemplate     */    //public RestTemplate getRestTemplate(){    //    return new RestTemplate();    //}    @LoadBalanced    @Bean    public RestOperations getRestTemplate(RestTemplateBuilder builder){        return builder.build();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

服务名:

  • 不区分大小写
  • 服务名指的是服务提供者的yml文件中配置信息
spring:  application:    # 服务名称    name: springcloud-provider-dept
  • 1
  • 2
  • 3
  • 4

6)测试

7)多服务提供者测试

(1)新建两个服务提供者

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

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

  • 三个服务提供者提供相同的服务,服务名一致
# springspring:  application:    # 服务名称一样    name: springcloud-provider-dept
  • 1
  • 2
  • 3
  • 4
  • 5
  • 不同之处

    • 每个服务端口不同:分别为 800180028003

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

      • 需要三个数据库:springcloud_db01springcloud_db02springcloud_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);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

3)测试

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发