Spring Cloud——LoadBalancer

Spring Cloud------LoadBalancer

一、负载均衡(LoadBalance)

  • 负载均衡(Load Balance),简单的说就是将用户的请求分摊到多个服务上,从而使系统达到高可用性,常见的负载均衡有软件NginxLVS,硬件F5等。
  • Spring Cloud LoadBalancer是由Spring Cloud官网提供的一个开源的、简单易用的客户端负载均衡器,它包含在Spring Cloud Commons中用来替换以前的Ribbon组件。想比较于RibbonSpring Cloud LoadBalancer不仅能够支持RestTemplate,还支持WebClientWebClientSpring Web Flux中提供的功能,可以实现响应式异步请求)

1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别

  • Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。
  • LoadBalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

二、LoadBalancer

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

1.Spring RestTemplate as a LoadBalancer Client

  • 第一步,在服务调用方加入LoadBalancer组件:

    xml 复制代码
    <!--loadbalancer-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
  • 第二步,赋予RestTemplate负载均衡的能力:

    java 复制代码
    @Configuration
    public class RestTemplateConfig {
        /**
         * 使用 @LoadBalanced 注解赋予 RestTemplate 负载均衡的能力
         */
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

2.编码使用DiscoveryClient动态获取所有上线的服务列表

  • 负载均衡算法:rest接口第几次请求数%服务器集群总数量 = 实际调用服务器位置下标,每次服务器重启后rest接口计数从1开始。

    java 复制代码
     @Resource
     private DiscoveryClient discoveryClient;
    
     @GetMapping("/discovery")
     public ResponseResult<List<String>> discovery() {
         List<String> list = new ArrayList<>();
         List<String> services = discoveryClient.getServices();
         for (String element : services) {
             List<ServiceInstance> instances = discoveryClient.getInstances(element);
             for (ServiceInstance ele : instances) {
                 list.add(ele.getServiceId() + "     " + ele.getHost() + "       " + ele.getPort() + "       " + ele.getUri());
             }
         }
         return ResponseResult.success(list);
     }

3.从默认的轮询,切换为随机算法

java 复制代码
/**
 * 将负载均衡的默认轮询算法,切换为随机算法
 */
@Configuration
@LoadBalancerClient(
        //下面的value值大小写一定要和consul里面的名字一样,必须一样
        value = "cloud-payment-service", configuration = RestTemplateConfig.class)
public class RestTemplateConfig {
    @Bean
    @LoadBalanced //使用@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);
    }
}
相关推荐
LSTM975 分钟前
C# 实战:轻松提取 PDF 文件中的文字内容
后端
PFinal社区_南丞30 分钟前
Skills与脚本:当智能遇上死板,一场编程界的"冰与火之歌"
后端
树上有只程序猿34 分钟前
低代码何时能出个“秦始皇”一统天下?我是真学不动啦!
前端·后端·低代码
2501_9216494935 分钟前
期货 Tick 级数据与基金净值历史数据 API 接口详解
开发语言·后端·python·websocket·金融·区块链
架构师沉默36 分钟前
AI 写的代码,你敢上线吗?
java·后端·架构
Nyarlathotep01131 小时前
Redis的内存回收和对象共享
redis·后端
我叫黑大帅1 小时前
Go 中最强大的权限控制库(Casbin)
后端·面试·go
腾讯云云开发2 小时前
用 OpenClaw + CloudBase 自动化开发网站:30分钟从安装到上线
后端·ai编程
独断万古他化2 小时前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
舒一笑2 小时前
🚀 我用一行命令,把 OSS 私有文件变成“可直接下载的公网链接”(很多人不会)
后端