网站首页 > 博客文章 正文
Spring Cloud LoadBalancer是Spring Cloud生态体系下的一个轻量级的服务负载均衡的解决方案,主要的功能是在服务客户端实现负载均衡策略,其目的就是为了替代之前的Ribbon框架,成为Spring Cloud 生态下的权限的客户端负载均衡的框架,下面我们就来详细的介绍一下在Spring Boot中如何整合Spring Cloud LoadBalancer实现客户端的负载均衡。
引入依赖
在Spring Cloud LoadBalancer中需要与注册中心配合实现动态服务列表的获取操作,下面我们就以Eureka注册中心为例来演示如何对Spring Cloud LoadBalancer进行集成。
首先需要添加的就是Spring Cloud LoadBalancer的依赖配置,如果要使用Eureka作为注册中心的话还需要添加Eureka客户端依赖,如下所示。
org.springframework.cloud
spring-cloud-starter-loadbalancer
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
基本配置
依赖添加完成之后,第二步操作就是完成配置信息的管理,首先需要保证服务能够正确的从Eureka注册中心获取到服务注册的列表信息,如下所示。
yaml复制代码spring:
application:
name: demo-service
cloud:
discovery:
client:
enabled: true
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
接下来就是需要保证能够在客户端正确的使用对应的客户端负载均衡机制,需要通过@LoadBalanced 注解标记RestTemplate或WebClient Bean,以启用客户端侧负载均衡。
基于RestTemplate的示例
首先需要在配置文件中创建一个通过RestTemplate调用的客户端操作,如下所示。
@Configuration
public class AppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
在上面的代码中,通过@LoadBalanced注解就开启了客户端负载均衡的操作,然后我们就可以通过RestTemplate直接进行服务的调用操作,如下所示。
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/invoke-service")
public String invokeService() {
String url = "http://target-service/api/endpoint";
return restTemplate.getForObject(url, String.class);
}
}
其中,target-service是目标微服务的服务名在进行微服务调用的时候Spring Cloud LoadBalancer会自动解析为实际的实例地址。
基于 WebClient 的示例
WebClient是在Spring WebFlux提供的接口访问支持,它也支持通过@LoadBalanced注解开启客户端负载均衡操作。如下所示。
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
在调用服务的时候,通过服务名称就可以调用对应的微服务。如下所示。
@RestController
public class WebClientController {
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/invoke-service-webclient")
public String invokeService() {
String url = "http://target-service/api/endpoint";
return webClientBuilder.build()
.get()
.uri(url)
.retrieve()
.bodyToMono(String.class)
.block();
}
}
上面我们演示了如何通过默认的负载均衡策略来实现客户端负载均衡的操作,当然Spring Cloud LoadBalancer提供的功能远远不止这些,下面我们就来看看如何通过自定义的配置来改变默认的负载均衡策略。
自定义负载均衡策略
配置随机策略
我们可以在application.yml配置文件中将默认的策略改成随机,如下所示。
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
discovery:
client:
simple:
instances:
target-service:
- uri: http://localhost:8081
- uri: http://localhost:8082
loadbalancer:
default:
hint: random
当然我们还可以通过Java的配置类来进行配置,如下所示。
@Configuration
@LoadBalancerClients(defaultConfiguration = LoadBalancerClientConfiguration.class)
public class CustomLoadBalancerConfig {
@Bean
public ReactorLoadBalancer randomLoadBalancer() {
return new ReactorLoadBalancer<>() {
@Override
public ServiceInstance choose(Request request) {
List instances = discoveryClient.getInstances("target-service");
return instances.get(ThreadLocalRandom.current().nextInt(instances.size()));
}
};
}
}
总结
上面我们演示了如何在Spring Boot中整合Spring Cloud LoadBalancer,实现高效灵活的负载均衡解决方案,通过与Spring Cloud 的生态的整合,可以快速实现微服务之间的高可用调用。通过对上面实现的介绍,我们了解了在实际项目中如何去选择负载均衡策略以及如何实现负载均衡策略。有兴趣的读者可以自己上手操作,遇到问题可以在评论区留言一起讨论。
猜你喜欢
- 2025-04-01 Ribbon(ribbon可数吗)
- 2025-04-01 记一次Java语言Spring框架对接飞书原生审批流方案
- 2025-04-01 各个微服务之间,有哪些调用方式?
- 2025-04-01 2025年SpringBoot调用第三方接口深度解析:程序员实战案例与避坑
- 2025-04-01 Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign
- 2025-04-01 深度解析Spring Cloud Ribbon的实现源码及原理
- 2025-04-01 SpringBoot使用ElasticSearch做文档对象的持久化存储?
- 2025-04-01 SpringBoot2调用第三方接口时,考虑异常处理、安全性和超时重试
- 2025-04-01 Spring Cloud Kubernetes集成K8S,让你更快速的结合云原生
- 2025-04-01 速看!DeepSeek携手Kimi,解锁图文报表智能生成黑科技
你 发表评论:
欢迎- 374℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 369℃用AI Agent治理微服务的复杂性问题|QCon
- 360℃初次使用IntelliJ IDEA新建Maven项目
- 353℃Maven技术方案最全手册(mavena)
- 351℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 348℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 346℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 344℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)