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

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 注解

使用 RestTemplateRestOperations 都可以;建议用新版 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-8002springcloud-provider-dept-8003

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

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

    • 每个服务端口不同:分别为 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);
    }
}

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 清理项目、清理浏览器缓存、重启注册中心、服务提供者、服务消费者

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Spring Cloud是一个用于构建分布式系统的开发工具包,它提供了一套完整的微服务开发框架。 LoadBalancer负载均衡器)是Spring Cloud提供的一个组件,用于实现在分布式环境中的负载均衡。在微服务架构中,通常会将同一个服务部署在多台服务器上,当客户端请求到达时,负载均衡器会根据预定义的策略将请求转发到具体的服务实例上,从而实现对服务请求的分发和负载均衡SpringCloud 2022.0是Spring Cloud框架在2022年的最新版本,它进一步强化了LoadBalancer的功能和性能。在SpringCloud 2022.0中,LoadBalancer提供了更多的负载均衡算法选择,如轮询、随机、最少连接等,以满足不同场景下的需求。它还支持根据服务实例的健康状态进行负载均衡的判定,保证只将请求发送给健康的服务实例。同时,LoadBalancer还支持动态添加和移除服务实例,以应对服务的伸缩和容灾需求。 另外,SpringCloud 2022.0的LoadBalancer还提供了高可用性的支持。当负载均衡器自身出现故障或不可用时,它可以通过与注册中心交互,获取其他负载均衡器的状态信息,并选择一个可用的负载均衡器进行请求转发。 总之,SpringCloud 2022.0的LoadBalancer是一个强大的负载均衡组件,它能够有效地提高微服务架构的可用性、性能和弹性。通过合理配置LoadBalancer的策略和参数,开发者可以根据系统的具体需求来实现负载均衡和服务发现的功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土味儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值