繁体   English   中英

Spring WebFlux:WebClient结合了2个反应式RESTful Web服务

[英]Spring WebFlux: WebClient combines 2 Reactive RESTful Web Service

我正在使用Spring WebFlux开发具有响应式支持的微服务应用程序。 让我们看一下,我有一个属于一个类别的问题列表和每个问题的选项列表。 我将问题和选项分为具有响应式支持的服务,并且我想拥有另一个服务,以使用Spring WebFlux的WebClient将它们组合在一起。 当然,它还需要支持Reactive。

QuestionServiceImpl:

public Flux<Question> getQuestions(String categoryId) {
    WebClient client = WebClient
        .builder()
        .baseUrl(getServiceUrl())
        .build();

    WebClient.ResponseSpec responseSpec = client
        .get()
        .uri("/questions/" + categoryId)
        .retrieve();

    return responseSpec.bodyToFlux(Question.class);
}

OptionServiceImpl:

public Flux<Option> getOptions(String questionId) {
    WebClient client = WebClient
            .builder()
            .baseUrl(getServiceUrl())
            .build();

        WebClient.ResponseSpec responseSpec = client
            .get()
            .uri("/options/" + questionId)
            .retrieve();

        return responseSpec.bodyToFlux(Option.class);
}

但是我不知道如何以反应式方式将问题及其选项结合起来。 谁能提出一些想法?

更新的解决方案:

我添加了一个名为CompositeQuestion的新类

@Data
@AllArgsConstructor 
public class CompositeQuestion {

    private String id;

    private String description;

    private String categoryId;

    private List<Option> options;

}

现在要获取问题的列表选项,我的代码如下:

Flux<CompositeQuestion> compositQuestion = questionsFromCoreQuestionService.flatMap(question ->
        optionService.getOptions(question.getId())
            .collectList()
            .map(options -> new CompositeQuestion(question.getId(), question.getDescription(), question.getCategoryId(), options)))
        .subscribeOn(Schedulers.elastic());

假设您有一个类似以下的类:

@Value
public class QuestionOptions {
     private Question question;
     private List<Option> options;
}

@Value注释来自Lombok

您可以使用以下选项检索问题:

Flux<String> categoryIds = Flux.just("1", "2", "3");
Flux<QuestionOptions> questionOptions = 
    categoryIds.flatMap(categoryId -> 
         // retrieve questions for each category
         questionService.getQuestions(categoryId)
              // get options for each question 
              .flatMap(question -> optionService.getOptions(question.getId())
              .collectList()
              .map(optionList -> new QuestionOptions(question, optionList))
         ))
    .subscribeOn(Schedulers.elastic()); // retrieve each question on a different thread.

请注意,如果类别的顺序可能与您要求的顺序不同。 如果这对您来说很concatMap() ,则可以考虑使用concatMap()而不是flatMap() ,尽管那样每个请求将依次运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM