#spring-boot #microservices #spring-webflux
#весенняя загрузка #микросервисы #весна-webflux
Вопрос:
Я предполагаю, что мой ответ уже есть на этом форуме (потому что я читал), но я не могу понять мою озабоченность…
Я хочу, чтобы микросервис A отправлял сообщение в микросервис B.
микросервисеА:
webClientBuilder.build().post().uri("http://localhost:9644/relever/add")
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(releve), Web.class)
.retrieve()
.bodyToMono(Web.class);
микросервис B (контроллер):
@RestController
@RequestMapping("/relever")
public class ReleverController {
@PostMapping("/add")
@ResponseStatus(HttpStatus.CREATED)
public void AjouteDunRelever(Relever relever) {
System.out.println("ok!!!");
}
}
Когда я использую POSTMAN в режиме POST для http://localhost:9644/relever/add
, микросервис B реагирует, но когда микросервисное сообщение для микросервиса B, микросервис B не реагирует, … почему?
Спасибо!
Комментарии:
1. Сначала я думаю, что запрос post от Postman должен быть
localhost:9644/relever/add
или я ошибаюсь? И вы получаете какие-либо ошибки или что-то еще? Вы уже прошли через руководство ?2. Да, URL-адрес POSTMAN такой (в post): [ localhost: 9644 / relever /add]
3. Хорошо, вот так: это работает: WebClient client = WebClient.create(localhost: 9644), но с webClientBuilder.build().post().uri() это не работает. Мне нужно использовать loadbalancer, потому что вместо localhost там будет имя microserviceB
Ответ №1:
Я думаю, вам нужно установить baseUrl перед сборкой клиента.
Попробуйте
webClientBuilder.baseUrl("http://localhost:9644").build().post().uri("/relever/add")
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(releve), Web.class)
.retrieve()
.bodyToMono(Web.class);
WebClient.create (baseUrl) в основном просто делает это за вас.
От: org.springframework.web.reactive.function.client.WebClient
* Variant of {@link #create()} that accepts a default base URL. For more
* details see {@link Builder#baseUrl(String) Builder.baseUrl(String)}.
* @param baseUrl the base URI for all requests
* @see #builder()
*/
static WebClient create(String baseUrl) {
return new DefaultWebClientBuilder().baseUrl(baseUrl).build();
}
Комментарии:
1. Спасибо, но либо я написал это неправильно, но webClientBuilder не работает (ни в localhost, ни с именем микросервиса), Но, прежде всего, я не понимаю, что с другим микросервисом в .get у меня нет проблем …. webClientBuilder.build().get() .uri(» mc-societes// societes/list» ) .exchange() .flatMapMany(ответ -> response. Отток крови от тела(Societe.class ))
2. Вы пытались отладить и посмотреть, какой код состояния вы получите обратно? Например, webClientBuilder.baseUrl(» localhost: 9644″).build().post().uri(«/ relever/… .ContentType(MediaType. APPLICATION_JSON) .body(Mono.just(releve), Web.class ) .exchange() .flatMap(res -> res.StatusCode) и устанавливает точку останова в res.StatusCode
3. Я не знаю, получили ли вы уведомление, но я создал здесь новый вопрос, чтобы лучше объяснить
Ответ №2:
Я изменил baseurl на localhost и с именем микросервиса, никакой реакции!
webClientBuilder.baseUrl("http://localhost:9644").build().post().uri("/relever/add")
.body(Mono.just(releve), Web.class)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> {
System.out.println(response.statusCode());
System.out.println(); **<---- Breakpoint Here**
return response.bodyToMono(Web.class);
});
в верхней части моего класса я делаю это:
@Autowired
private WebClient.Builder webClientBuilder;
и в другом пакете я загружаю балансировщик нагрузки
@Configuration
public class Config {
private static final org.apache.logging.log4j.Logger logger
= LogManager.getLogger(Config.class.getName());
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
}
Точка останова даже не останавливается (поэтому она никогда не переходит в flatmap), и никакой реакции в контроллере microserviceB
Спасибо