RestTemplate 整合 LoadBalancer
项目 studyuser 添加loadBalancer 依赖 , 在nacos服务注册 上去除
netflix-ribbon 的支持
<!-- 添加loadBalancer 负载均衡器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</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>
在yml 上禁用ribbon , 其实你不引用ribbon 应该也行
spring: application: name: user-server cloud: nacos: discovery: server-addr: localhost:8848 namespace: 2a57e550-6295-4269-b1b4-268c46021020 # 不适用ribbon loadbalancer: ribbon: enabled: false
配置loadBalanced 的bean
@Configuration public class RestConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
在controller 层进行调用测试
@RequestMapping(value = "/findOrderByUserId/{id}") public R findOrderByUserId(@PathVariable("id") Integer id) { log.info("根据userId:" + id + "查询订单信息"); // 添加@LoadBalanced String url = "http://order-server/order/findOrderByUserId/" + id; R result = restTemplate.getForObject(url, R.class); return result; }
测试结果
2021-08-04 11:28:22.568 INFO 18236 --- [nio-8010-exec-1] c.jiuge.user.controller.UserController : 根据userId:2查询订单信息 2021-08-04 11:28:24.341 INFO 18236 --- [nio-8010-exec-2] c.jiuge.user.controller.UserController : 根据userId:2查询订单信息
WebClient 整合 LoadBalancer
引入依赖
<!-- 添加webflux 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
配置webClient作为负载均衡器的client
@Bean WebClient webClient(){ return WebClient.builder().build(); }
在UserController 中使用
@Autowired private WebClient webClient; @RequestMapping(value = "/findOrderByUserId/{id}") public Mono<R> findOrderByUserId(@PathVariable("id") Integer id) { log.info("根据userId:" + id + "查询订单信息"); String url = "http://localhost:8020/order/findOrderByUserId/"+id; Mono<R> result = webClient.get().uri(url).retrieve().bodyToMono(R.class); return result; }
测试,验证
使用WebClient 结合 WebFlux 使用
@Autowired private ReactorLoadBalancerExchangeFilterFunction lbfilter; @GetMapping(value = "/findOrderByUserIdWithWebFlux/{id}") public Mono<R> findOrderByUserIdWithWebFlux(@PathVariable("id")Integer id){ String url = "http://order-server/order/findOrderByUserId/"+id; // 基于WebClient + webFlux Mono<R> result = WebClient.builder().filter(lbfilter).build().get().uri(url).retrieve().bodyToMono(R.class); return result; }
测试,验证