spring - 使用 spring webflux WebClient 进行服务发现
问题描述
是否可以将 Ribbon 和 Eureka 服务发现与 spring webflux webclient 一起使用?
我尝试了此代码,但在集成测试期间出现错误。
reactor.core.Exceptions$ErrorCallbackNotImplemented:java.lang.IllegalArgumentException:URI 不是绝对的:/auth-service/auth-service/validate-manager-client-access
@Bean
@LoadBalanced
public WebClient loadBalancedWebClient() {
return WebClient.create(baseURL);
}
@Override
public Mono<Boolean> validateManagerClientAccess(Mono<LoginDTO> loginDTOMono) {
return webClient
.post()
.uri(validateManagerURL)
.body(loginDTOMono, LoginDTO.class)
.retrieve()
.bodyToMono(Boolean.class);
}
# Remote Services Configuration
remote:
auth-service:
service-id: auth-service
path:
validate-manager-client-access: /auth-service/validate-manager-client-access
解决方案
我自己调查一下...... Piotr Minkowski 在这里很好地回答了这个问题......
https://dzone.com/articles/reactive-microservices-with-spring-webflux-and-spr
为方便起见,我将在此答案中发布最相关的部分。
创建负载平衡的 Web 客户端构建器
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
然后可以像这样使用
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/{id}/with-accounts")
public Mono findByIdWithAccounts(@PathVariable("id") String id) {
LOGGER.info("findByIdWithAccounts: id={}", id);
Flux accounts= webClientBuilder.build().get().uri("http://accountservice/customer/{customer}", id).retrieve().bodyToFlux(Account.class);
return accounts
.collectList()
.map(a -> new Customer(a))
.mergeWith(repository.findById(id))
.collectList()
.map(CustomerMapper::map);
}
推荐阅读
- java - 使用 spring 从一个 api 向另一个 api 发出 post 请求
- haskell - 元组列表上的 Haskell 函数
- powershell - System.IO.FileSystemWatcher 只触发了一次
- sql-server - 如何将函数放在外键约束中?
- python-2.7 - 获取特定 python 解释器的 numpy (conda / pip)
- api - 使用带有 gitlab api 的 Ansibles URI 模块的 HTTP 错误 400
- docker - 如何判断logstash是否正在持久化队列
- jquery - 如何从 jquery 手风琴中删除本地 css?
- javascript - 向匿名函数添加参数
- vba - 具有相同“Click()”的不同报告工作方式不同 - 找不到原因