当前位置: 首页 > 知识库问答 >
问题:

使用spring webflux和hystrix的并发调用

耿运浩
2023-03-14

对于后台,我有一个前面的函数,它将生成一个用户列表,然后将使用该列表为列表中的每个用户调用此getUser详细信息函数,并返回用户详细信息的映射或列表。

@HystrixCommand(commandKey = "getUserDetails")
  public getUserResponse getUserDetails(userRequest request) {
    getUserResponse response = webClient.post()
        .uri(uri)
        .body(BodyInserters.fromObject(request))
        .retrieve()
        .onStatus(HttpStatus::isError, resp -> resp.bodyToMono(getUserError.class).map(errorHandler::mapRequestErrors))
        .bodyToMono(getUserResponse.class).block();

    return response;
  }

理想情况下,我还会替换/删除错误映射,因为仅涉及记录返回的错误响应并继续。到目前为止,我已经想到了一些类似的东西,但我不确定 webflux/hystrix 会玩得很好吗?

@HystrixCommand(commandKey = "getUserDetails", fallbackMethod = "getUserFallback")
  public Mono<getUserResponse> getUserDetails(userRequest request) {
    return = webClient.post()
        .uri(uri)
        .body(BodyInserters.fromObject(request))
        .retrieve()
        .bodyToMono(getUserResponse.class);
  }

  @HystrixCommand
  public Mono<getUserResponse> getUserFallback(userRequest request, Throwable throwable) {
    log.error(//contents of error message returned)
    return mono.empty();
  }

public Flux<UserMap> fetchUserDetails(List<Integer> userIds) {
    return Flux.fromIterable(userIds)
        .parallel()
        .runOn(Schedulers.elastic())
    .flatMap(userDetailsRepository::getUserDetails);
}

共有1个答案

祖迪
2023-03-14

Hystrix已被弃用。如果有机会,请转到支持Webflux/Reactor的resilience4j。

Spring还专门支持弹性4j。

关于错误处理,您可以利用Mono/Flux API中丰富的运算符集,如< code>onErrorReturn或< code>onErrorResume。

 类似资料:
  • [//]: # ( 此处删除了setDefer特性,因为支持setDefer的客户端都推荐用一键协程化了。 ) 使用子协程(go)+通道(channel)实现并发请求。 !>建议先看概览,了解协程基本概念再看此节。 实现原理 在onRequest中需要并发两个http请求,可使用go函数创建2个子协程,并发地请求多个URL 并创建了一个chan,使用use闭包引用语法,传递给子协程 主协程循环调用

  • 我需要进行异步调用,并使用其中存在的一些值对同一服务进行多次调用。将这些调用的响应与第一个调用结合起来,然后返回。 例如,当我第一次调用时,我会在JSON下面看到一个ID列表。现在,我必须使用这些ID对一个服务进行多次调用,并列出它们的响应列表,然后通过在同一个JSON中添加它们将其发送到下游。 我试过使用zipWhen和 但是结果列表总是以空或空的形式出现。我们如何才能做到这一点?我是不是漏了什

  • 我正在使用RxJava和和操作符: 返回从缓存列表构建的可观察,而方法使用Retrofit获取实体。 除非两个用户快速订阅返回的可观察对象,否则这非常有效。我猜在进行第二次订阅时,第一次订阅的网络请求没有完成。在这种情况下,执行了两个网络请求。我想避免。 我尝试创建一个单线程调度程序,以便仅在第一次调用结束时执行第二次调用,但没有运气: 以及: 我曾尝试将subscribeOn调用放在可观察链的较

  • 我希望为每个请求生成唯一的traceId,并将其传递给所有服务。在SpringMVC中,使用MDC上下文并将traceId放在头文件中相当容易,但在反应式堆栈中,由于ThreadLocal,它根本不起作用。 一般来说,我希望使用单个traceId记录我拥有的每个服务上的每个请求和响应,该traceId可以识别整个系统中的特定操作。 我试图根据文章创建自定义过滤器:https://azizulhaq

  • 我有一个动态的对等网络,节点与grpc进行通信。每个节点都有自己的服务器和客户端。定义了一种用于登录新节点的grpc方法。我使用同步消息将登录信息传达给所有其他服务器,在这里我与其他服务器创建一个新通道,发送一条消息并等待响应。 如果我的网络中有一个节点(节点1),然后两个或多个节点同时进入,例如节点2和节点3,它们将在节点1的服务器上同时调用grpc方法“enter”。对于这种类型的方法,nod

  • 在oracle.jdbc.driver.t4cttioer.ProcessErr(t4cttioer.java:450)在oracle.jdbc.driver.t4cttioer.processErr(t4cttioer.java:399)在oracle.jdbc.driver.t4c8oall.processErr(t4c8oall.java:1017)在oracle.jdbc.driver.t

  • Turbine(由Spring Cloud Netflix项目提供))聚合多个实例Hystrix指标流,因此仪表板可以显示聚合视图。Turbine使用DiscoveryClient接口查找相关实例。要将Turbine与Spring Cloud Consul结合使用,请按以下示例配置Turbine应用程序:的pom.xml <dependency> <groupId>org.springfram

  • 我正在使用reactive mongodb开发简单的spring webflux演示应用程序,我想按姓名读取员工的所有数据,但不包括姓名字段“joe”、“Sara”、“joe”、“Sara”,我有如下代码: //仓库接口 //服务类