Webflux: микросервисное сообщение для Microservice B

#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

Спасибо