文章目录

  • 1. 什么是Spring Cloud LoadBalancer
    • 1)RestTemplate
    • 2)WebClient
  • 2. RestTemplate整合LoadBalancer
    • 1)引入依赖
    • 2)使用@LoadBalanced注解配置RestTemplate
    • 3) 使用
  • 3. WebClient整合LoadBalancer
    • 1)引入依赖
    • 2) 配置WebClient作为负载均衡器的client
    • 3) 使用

1. 什么是Spring Cloud LoadBalancer

Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代Ribbon。
官网地址: https://spring.io/guides/gs/spring-cloud-loadbalancer/

Spring官方提供了两种负载均衡的客户端:

1)RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。

2)WebClient

WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。

2. RestTemplate整合LoadBalancer

1)引入依赖

<!-- LoadBalancer -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency><!-- 提供了RestTemplate支持 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- nacos服务注册与发现  移除ribbon支持-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions>
</dependency>

注意: nacos-discovery中引入了ribbon,需要移除ribbon的包
如果不移除,也可以在yml中配置不使用ribbon

spring:application:name: mall-user-loadbalancer-democloud:nacos:discovery:server-addr: 127.0.0.1:8848# 不使用ribbonloadbalancer:ribbon:enabled: false

原理:默认情况下,如果同时拥有RibbonLoadBalancerClient和BlockingLoadBalancerClient,为了保持向后兼容性,将使用RibbonLoadBalancerClient。要覆盖它,可以设置spring.cloud.loadbalancer.ribbon.enabled属性为false。

2)使用@LoadBalanced注解配置RestTemplate

@Configuration
public class RestConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

3) 使用

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping(value = "/findOrderByUserId/{id}")public R findOrderByUserId(@PathVariable("id") Integer id) {String url = "http://mall-order/order/findOrderByUserId/"+id;R result = restTemplate.getForObject(url,R.class);return result;}
}

3. WebClient整合LoadBalancer

1)引入依赖

<!-- LoadBalancer -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency><!-- webflux -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency><!-- nacos服务注册与发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions>
</dependency>

2) 配置WebClient作为负载均衡器的client

@Configuration
public class WebClientConfig {@LoadBalanced@BeanWebClient.Builder webClientBuilder() {return WebClient.builder();}@BeanWebClient webClient() {return webClientBuilder().build();}
}

3) 使用

@Autowired
private WebClient webClient;@RequestMapping(value = "/findOrderByUserId2/{id}")
public Mono<R> findOrderByUserIdWithWebClient(@PathVariable("id") Integer id) {String url = "http://mall-order/order/findOrderByUserId/"+id;//基于WebClientMono<R> result = webClient.get().uri(url).retrieve().bodyToMono(R.class);return result;
}

原理: 底层会使用ReactiveLoadBalancer

引入webFlux

@Autowired
private ReactorLoadBalancerExchangeFilterFunction lbFunction;@RequestMapping(value = "/findOrderByUserId3/{id}")
public Mono<R> findOrderByUserIdWithWebFlux(@PathVariable("id") Integer id) {String url = "http://mall-order/order/findOrderByUserId/"+id;//基于WebClient+webFluxMono<R> result = WebClient.builder().filter(lbFunction).build().get().uri(url).retrieve().bodyToMono(R.class);return result;
}

【LoadBalancer】SpringCloud微服务组件LoadBalancer相关推荐

  1. SpringCloud微服务组件:Sentinel限流熔断

    点击关注公众号,实用技术文章及时了解 前言 什么是雪崩问题? 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况. 解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请 ...

  2. SpringCloud微服务,euraka、feign、hystrix组件学习

    SpringCloud 1 eureka 1.1 eureka基本概念 eureka主要包含两个组件:Eureka Server 和 Eureka Client. eureka server(注册中心 ...

  3. SpringCloud微服务:基于Nacos组件,整合Dubbo框架

    源码地址:GitHub·点这里 || GitEE·点这里 一.基础组件简介 1.Dubbo框架 Dubbo服务化治理的核心框架,之前几年在国内被广泛使用,后续由于微服务的架构的崛起,更多的公司转向微服 ...

  4. SpringCloud微服务(07):Zipkin组件,实现请求链路追踪

    一.链路追踪简介 1.Sleuth组件简介 Sleuth是SpringCloud微服务系统中的一个组件,实现了链路追踪解决方案.可以定位一个请求到底请求了哪些具体的服务.在复杂的微服务系统中,如果请求 ...

  5. springcloud微服务系列之服务注册与发现组件Eureka

    一.Eurake的简介 二.使用Eureka进行服务的注册消费 1.创建一个服务注册中心 2.创建服务的提供者 3.创建服务的消费者 总结 一.Eurake的简介 今天我们来介绍下springclou ...

  6. Spring Cloud微服务之loadbalancer负载平衡

    Spring Cloud微服务之loadbalancer负载平衡 小学时候,曾经做过这样的数学题. 说有一个水池子,上面有一个排水管,下面有一个进水管,开一个进水管,6个小时灌满水池,开一个排水管,1 ...

  7. SpringCloud微服务(03):Hystrix组件,实现服务熔断

    写在前面:阅读本文前,你可能需要熟悉一下内容. 微服务组件:Eureka管理注册中心 微服务组件:Ribbon和Feign服务调用 SpringBoot系统异常映射处理 一.熔断器简介 微服务架构特点 ...

  8. SpringCloud微服务:Eureka组件之服务注册与发现

    一.Eureka基本架构 1.Eureka角色结构图 角色职责如下: 1).Register:服务注册中心,它是一个Eureka Server ,提供服务注册和发现功能. 2).Provider:服务 ...

  9. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

  10. SpringCloud 微服务

    一微服务架构概述 1.1 微服务特性以及优点 每个服务可以独立运行在自己的进程里 一系列独立运行的微服务(goods,order,pay,user,search-)共同构建了整个系统 每个服务为独立的 ...

最新文章

  1. python基础---元组、字典、函数、文件、异常
  2. R语言ggplot2可视化:可视化箱图、在箱图中添加抖动数据点(Dot + Box Plot)、自定义抖动数据点的大小、颜色、数据点分布在箱图中间、添加主标题、副标题、题注信息
  3. 从“架构师书单”讲开去
  4. 云炬随笔20211126(2)
  5. 致创业者:APP已死 服务永生
  6. word List 24
  7. tp5类的属性不存在_thinkPHP5.1框架中Request类四种调用方式示例
  8. PHP字符串转数字面试,浅谈php字符串反转 面试中经常遇到的问题
  9. 大数据Spark技术数据分析综合实验:出租车数据分析
  10. 华为NP课程笔记9-BGP 3
  11. 一文读懂应用市场的[发展简史]
  12. (2021系统架构设计师)个人对于软考的一些总结
  13. 第五次打卡 模型融合
  14. 定时炸弹?揭露AmazonBasics电池背后的秘密
  15. 关于利用Unity制作游戏登陆界面这件事
  16. css 压缩后出现了问题,觉得js或css压缩后不好调试?你应该认识一下source map了...
  17. 无线通信中存在的远近效应、多普勒效应、多径效应以及其应对策略
  18. c语言开头的作用是什么,C语言为什么开头都加;#includestdio.h有什么作用?
  19. The 2018 JUST Collegiate Programming Contest H题 Cube
  20. WinInet库之FTP通信

热门文章

  1. 【软件测试】——软件测试经验总结
  2. 【正点原子FPGA连载】第三十三章环境光传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  3. c语言三阶素数魔方阵,C语言 三阶魔方阵
  4. Pycharm debug时变量无法立即显示,正在评估(evaluating )...
  5. Java中易混淆问题总结
  6. 关于 nor it's doXxx() equivalent is defined in action class 的问题解决办法
  7. 科大奥锐密立根油滴实验数据_密立根油滴实验原始数据记录表
  8. 日常交通工具日语词汇
  9. html样式类collapse,[ CSS-CSS3 ] 史上最全CSS样式一览表
  10. Rasa NLU 示例