Spring Cloud LoadBalancer基础入门与应用实践

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

【1】概述

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

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

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

在这里插入图片描述
LoadBalancer 在工作时分成两步:

  • 第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的,默认轮询调用谁都可以正常执行。

  • 第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器。


Spring Cloud LoadBalancer 集成使用

为了简化Spring Cloud LoadBalancer的使用,Spring Cloud 提供了ReactorLoadBalancerExchangeFilterFunction(可与WebClient配合使用)和BlockingLoadBalancerClient(可与RestTemplateRestClient一起工作)。更多详细信息及使用示例,请参阅以下章节:

  1. Spring RestTemplate作为LoadBalancer客户端
    在这一节中,我们将探讨如何将RestTemplate用作负载均衡客户端,利用BlockingLoadBalancerClient实现服务间的调用负载均衡。

  2. Spring RestClient作为LoadBalancer客户端
    这一章节会介绍RestClientBlockingLoadBalancerClient结合使用的方法,展示如何通过这种方式实现对后端服务的负载均衡调用。

  3. Spring WebClient作为LoadBalancer客户端
    在此部分,我们将讲解如何将WebClientReactorLoadBalancerExchangeFilterFunction配合使用,以实现非阻塞、响应式的负载均衡调用。

  4. Spring WebFlux WebClient与ReactorLoadBalancerExchangeFilterFunction的结合使用
    本章节将深入讨论WebFlux框架下的WebClient如何与ReactorLoadBalancerExchangeFilterFunction协同工作,实现高效、响应式的负载均衡机制。

两种主要的工具:ReactorLoadBalancerExchangeFilterFunction 和 BlockingLoadBalancerClient,分别适用于响应式编程和阻塞式编程场景。

【2】Spring RestTemplate as a LoadBalancer Client应用实践

pom依赖:

<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

你可以配置一个RestTemplate来使用负载均衡客户端。要创建一个负载均衡的RestTemplate,需要创建一个带有@Bean注解的RestTemplate实例,并使用@LoadBalanced限定符,如下例所示:

@Configuration
public class MyConfiguration {@LoadBalanced@BeanRestTemplate restTemplate() {return new RestTemplate();}
}public class MyClass {@Autowiredprivate RestTemplate restTemplate;public String doOtherStuff() {String result = restTemplate.getForObject("http://stores/stores", String.class);return result;}
}

这意味着,在你的Spring配置类中,可以通过定义一个带有@Bean@LoadBalanced注解的方法来生成一个RestTemplate实例。这样做的结果是,该RestTemplate实例将自动集成Spring Cloud LoadBalancer的功能,能够智能地在多个服务实例之间进行请求分发,实现负载均衡的效果。这种方法特别适用于基于Spring的微服务架构,使得服务间的调用更加健壯和高效。

如下图所示,当服务实例拥大于等于2时,将会实现轮询效果:

在这里插入图片描述

【3】编码使用DiscoveryClient动态获取所有上线的服务列表

这里自动注入DiscoveryClient来获取注册中心的服务实例列表:

@Resource
private DiscoveryClient discoveryClient;@GetMapping("/consumer/discovery")
public String discovery()
{// 获取所有服务实例List<String> services = discoveryClient.getServices();for (String element : services) {System.out.println(element);}System.out.println("===================================");//获取指定名字服务实例List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");for (ServiceInstance element : instances) {System.out.println(element.getServiceId()+"\t"+element.getHost()+"\t"+element.getPort()+"\t"+element.getUri());}return instances.get(0).getServiceId()+":"+instances.get(0).getPort();
}

【4】切换负载均衡算法

默认使用的ReactiveLoadBalancer 实现是RoundRobinLoadBalancer(轮询负载均衡器)。如果你想为某些特定服务或者所有服务切换到不同的负载均衡实现,可以利用自定义的负载均衡配置机制。

例如,下面的配置可以通过@LoadBalancerClient注解切换到使用RandomLoadBalancer(随机负载均衡器):

public class CustomLoadBalancerConfiguration {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

修改RestTemplateConfig如下所示:

@Configuration
@LoadBalancerClient(value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{@Bean@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python第三方包】爬虫前言(request包)

文章目录 前言安装发送请求Response对象常用函数总结前言 在Python编程中,我们经常需要从互联网上获取或发送数据。这就涉及到了网络编程,而在网络编程中,我们常常需要使用到HTTP请求。Python的requests库就是一个非常强大的工具,它可以帮助我们轻松地发送HTTP请求。 req…

前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)

简介 ONLYOFFICE 文档 是一个开源办公套件&#xff0c;包括文本文档、电子表格、演示文稿和可填写表单的编辑器。 它提供以下功能&#xff1a; 创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单&#xff1b; 与其他队友实时协作处理文件。 基于这个控件&#xff0c;…

通过window.scrollTo实现丝滑跳转到页面的某个位置

原理 通过计算对应id的组件距离页面顶部的距离&#xff0c;来使用window.scrollTo丝滑跳转到该位置 代码如下&#xff1a; <div id"test1"></div> <div id"test2"></div> <div id"test3"></div><butt…

PySide(PyQt),event.pos() 和 event.position()的区别

在 PySide6 中&#xff0c;event.pos() 和 event.position() 在处理鼠标事件时有所不同&#xff1a; event.pos(): event.pos() 返回的是鼠标指针相对于接收事件的小部件&#xff08;widget&#xff09;的局部坐标。这意味着它返回的是鼠标在接收事件的窗口或部件内的坐标位置。…

基于Java毕业生生活用品出售网站的设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

【算能全国产AI盒子】基于BM1688CV186AH+FPGA智能物联工作站,支持差异化泛AI视觉产品定制

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒子&#…

Spring Boot中的日志管理最佳实践

Spring Boot中的日志管理最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下在Spring Boot应用中如何有效管理日志&#xff0c;确保系统…

C4D快捷键整合所有快捷键

C4D快捷键整合所有快捷键 快捷键常用快捷键主菜单建模材质管理器物体管理器图片浏览器结构管理器浏览器编辑器动画模块属性管理器Body Paint 3D时间线视窗Mocca 小技巧 快捷键 常用快捷键 作用快捷键备注裁切时间线ALT【 】最大化显示所限物体0最大化显示场景所有物体H物体属…

解读防水防腐保温二级资质:为何社保需缴纳X月以上?

解读防水防腐保温二级资质中关于社保需缴纳X月以上的要求&#xff0c;可以从以下几个方面进行&#xff1a; 一、社保缴纳的重要性 稳定雇佣关系的体现&#xff1a;社保缴纳是企业与员工之间稳定雇佣关系的直接体现&#xff0c;它展示了企业对员工的长期承诺和责任感。员工权益…

esp32使用TFT_eSPI库,系统双闪,指针溢出的问题

问题描述 使用TFT_eSPI烧录进esp32c3之后&#xff0c;开发板灯双闪&#xff0c;串口输出指针越界的错误。 问题原因 不小心点到了更新&#xff0c;把esp32的库给更新了。 问题解决 把esp32的库改到2.0.9版本。

Spring Boot与Redis集成的最佳实践

Spring Boot与Redis集成的最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现与Redis的集成&#xff0c;以及一…

c++ std::forward 笔记

请您查看如下代码块&#xff0c;这样方便复制过去直接运行 int x 5; q_forward w1(x); // 使用左值构造 q_forward w2(10); // 使用右值构造 w2.wrapper_func(); /*** std::forward<>() 向前的&#xff0c;前进的&#xff1b;* 通常与模板和右值引用&#xff08;r…

MySQL3(多表联查 子查询 流程控制函数,语句 Sql 执行顺序 学生选课表练习)

目录 一、多表联查 1. 等值查询和非等值查询 等值查询 --- 主外键相等 ​编辑非等值查询 2. 连接查询 ​编辑 内连接 ​编辑 左外连接 ​编辑 右外连接 3. UNION 二、子查询 1. where 型子查询&#xff1a; 2. from型子查询: 3. exists型子查询: 4. any, some…

如何使用PHP Curl类库编写高效的爬虫程序?

如何使用php curl类库编写高效的爬虫程序&#xff1f; 摘要&#xff1a;爬虫程序可以用于从网页中获取数据&#xff0c;以实现各种场景下的自动化处理。本文将介绍如何使用PHP Curl类库编写高效的爬虫程序&#xff0c;并提供相关的代码示例。 导语&#xff1a;随着互联网普及…

ArrayList学习

1.2.1 构造方法 方法名说明public ArrayList()创建一个空的集合对象 1.2.2 成员方法 方法名说明public boolean add(E e)将指定的元素追加到此集合的末尾public boolean remove(E e)删除指定元素,返回值表示是否删除成功public E remove(int index)删除指定索引处的元素&…

PVE更新 报错过程解决

Proxmox 报错提示 E: Failed to fetch https://enterprise.proxmox.com/debian/ceph-quincy/dists/bookworm/InRelease 401 Unauthorized E: The repository https://enterprise.proxmox.com/debian/ceph-quincy bookworm InRelease is not signed.Proxmox 报错提示 Tempor…

笔记本重装系统怎么操作? windows电脑重装系统,超实用的四种方法

重新安装操作系统是维护计算机性能和确保系统稳定运行的重要步骤。对于 Windows 笔记本用户而言&#xff0c;熟悉重装系统的方法可以帮助他们解决各种问题&#xff0c;从提高系统速度到修复软件故障。然而具体来讲&#xff0c;笔记本重装系统怎么操作呢&#xff1f;接下来&…

input的23种属性

button 定义可点击的按钮&#xff08;通常与 JavaScript 一起使用来启动脚本&#xff09;。 checkbox 定义复选框。 color 定义拾色器。 date 定义 date 控件&#xff08;包括年、月、日&#xff0c;不包括时间&#xff09;。 datetime 定义 date 和 time 控件&…

AngularJS 参考手册

AngularJS 参考手册 1. 引言 AngularJS,一种由Google维护的开源前端Web框架,自2010年发布以来,已成为Web开发领域的重要工具。它允许开发者使用HTML作为模板语言,并扩展HTML的语法,以清晰简洁地表达应用的组件。本参考手册旨在为开发者提供AngularJS的全面指南,包括其核…

LLDP 基本原理

LLDP 简介 定义 LLDP&#xff08;Link Layer Discovery Protocol&#xff0c;链路层发现协议&#xff09;是 IEEE 802.1ab 中定义的第二层发现&#xff08;Layer 2 Discovery&#xff09;协议。 LLDP 提供了一种标准的链路层发现方式&#xff0c;可以将本端设备的主要能力、…