暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringCloud LoadBalancer 负载均衡器

李二狗搞程序 2021-08-05
2875

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;
}
复制

测试,验证

文章转载自李二狗搞程序,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论