三:LoadBalancer负载均衡服务调用

LoadBalancer负载均衡服务调用

官网:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html

1.LB负载均衡(Load Balance)是什么

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx等

Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon(仅维护)组件。相比较于Ribbon,SpringCloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient(WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求)

LoadBalancer支持如下:

2.loadbalancer本地负载均衡客户端 与 Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。

loadbalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用。

3.实现loadbalancer负载均衡实例

LoadBalancer 在工作时分成两步:

  • 第一步,先选择nacos注册中心查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的微服务。默认轮询调用谁都可以正常执行。
  • 第二步,按照指定的负载均衡策略从nacos取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器

如何引入使用:

3-1.首先应模拟启动多个服务提供者应用实例:

1)方法一:复制cloud-payment-service端口为8002

2)方法二:拷贝虚拟映射




3-2.在服务消费项目引入LoadBalancer

引入依赖:

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

赋予RestTemplate负载均衡的能力:

复制代码
@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced //赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }

}

3-3:测试用例

复制代码
@RestController
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping("/consumer/pay/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id)
    {
        String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);
        return result+"\t"+"    我是OrderNacosController80调用者。。。。。。";
    }

}

3-4:测试负载均衡

第一次请求:

第二次请求:

可见8001与8002实例交替出现,则负载均衡实现

4.负载均衡算法

官网:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html#switching-between-the-load-balancing-algorithms

默认有2种算法:

4-1:轮询(默认)

复制代码
public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer

4-2:随机

复制代码
public class RandomLoadBalancerimplements ReactorserviceInstanceloadBalancer

从默认的轮询算法切换为随机算法:

复制代码
@Configuration
@LoadBalancerClient(
        //下面的value值必须要和nacos里面的名字一样
        value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig {

    @Bean
    @LoadBalanced //赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }

    //配置负载均衡为随机算法
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }

}

测试:

第一次请求:

第二次请求:

第三次请求:

相关推荐
蝎子莱莱爱打怪4 天前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking5 天前
Java微服务练习方式
java·后端·微服务
米丘8 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质11 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
霸道流氓气质11 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯11 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y11 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
递归尽头是星辰11 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理
就改了12 天前
Windows 环境 SkyWalking 完整实操教程
windows·微服务·skywalking
至乐活着12 天前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose