使用 Vert.x 异步发送HTTP长阻塞请求来提高并发响应

这篇具有很好参考价值的文章主要介绍了使用 Vert.x 异步发送HTTP长阻塞请求来提高并发响应。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

假设我们开发了一个必须与其他HTTP服务来交互的服务。不幸的是,这些HTTP服务速度慢且是阻塞的。

它可能是一个非常慢的遗留HTTP服务或我们必须使用的一些阻塞 API。无论如何,我们无法控制它。在这里,我们将调用两个HTTP API。其中一个将阻塞2秒钟,另一个将阻塞5秒钟。

一旦两个响应都可用,我们还需要打印响应状态代码。如果我们以老的、非异步反应性方式执行此操作,我们将阻塞调用线程5秒钟。阻塞线程 5 秒效率不高,不是吗?现在就叫你如何使用 Vert.x 异步发送HTTP长阻塞请求来提高并发响应!

服务

我使用“httpstat.us”作为网络服务。这是一个简单的服务,用于生成不同的HTTP代码来测试Web客户端。可以提供额外的参数,在本例中为 sleep ,在规定的时间内阻塞 HTTP 请求。

我将使用“httpie”来测试这两种服务。

服务 1 将阻塞5秒钟,并返回状态代码为 200 的响应:

http://httpstat.us/200?sleep=5000
_____________________________________________

HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/plain
Date: Tue, 08 Mar 2022 17:05:08 GMT
Request-Context: appId=cid-v1:1e93d241-20e4-4513-bbd7-f452a16a5d69
Server: Kestrel
Set-Cookie: ARRAffinity=e2c17206c539113795daf64bd958d003f2b29b9f62da53617beea05468875ba5;Path=/;HttpOnly;Domain=httpstat.us

200 OK

服务 2 与前一个相同,只是它阻塞了2秒而不是5秒:

http://httpstat.us/200?sleep=2000
_____________________________________________

HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/plain
Date: Tue, 08 Mar 2022 17:11:53 GMT
Request-Context: appId=cid-v1:1e93d241-20e4-4513-bbd7-f452a16a5d69
Server: Kestrel
Set-Cookie: ARRAffinity=e2c17206c539113795daf64bd958d003f2b29b9f62da53617beea05468875ba5;Path=/;HttpOnly;Domain=httpstat.us

200 OK

Web 客户端

我们已经了解了服务。现在,让我们讨论 Web 客户端。现在,我将使用 Vert.x Web 客户端。它是一个异步的,易于使用的 HTTPHTTP/2 客户端.

  private static Future<Integer> service1(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=5000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 1: response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

  private static Future<Integer> service2(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=2000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 2 response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

这两种方法非常相似。它们将 WebClient 作为参数并发送返回 Future<Integer> 的 HTTP 请求。其中整数是 HTTP 响应代码。返回的 Future<Integer> 向我们保证结果是异步的。状态代码在稍后可用时将给出回调。

我们需要组合两个Future。使用 Vert.x的 CompositeFuture 可以实现多个future的协调. 它支持并发组合(并行运行多个异步操作)和顺序组合(链式异步操作).

    Future<Integer> service1Code = service1(webClient);
    Future<Integer> service2Code = service2(webClient);

    CompositeFuture.all(service1Code, service2Code)
        .onSuccess(ar -> {
          printResult(ar);

          countDownLatch.countDown();
        });

合在一起

最后,我们可以将所有的点点滴滴放在一起,如下所示:

import java.text.MessageFormat;
import java.util.concurrent.CountDownLatch;

import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.ext.web.client.WebClient;

public class Services {
  public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(1);

    // Vertx instance and web client
    Vertx     vertx     = Vertx.vertx();
    WebClient webClient = WebClient.create(vertx);

    Future<Integer> service1Code = service1(webClient);
    Future<Integer> service2Code = service2(webClient);

    CompositeFuture.all(service1Code, service2Code)
        .onSuccess(ar -> {
          printResult(ar);

          countDownLatch.countDown();
        });

    vertx.setPeriodic(1000, l -> System.out.println("[" + Thread.currentThread().getName() + "] is released"));

    countDownLatch.await();
    vertx.close();
  }

  private static Future<Integer> service1(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=5000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 1: response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

  private static Future<Integer> service2(WebClient webClient) {
    return webClient.getAbs("http://httpstat.us/200?sleep=2000")
        .send()
        .onSuccess(response -> System.out.println(MessageFormat.format("[{0}] service 2 response received", Thread.currentThread().getName())))
        .compose(response -> Future.succeededFuture(response.statusCode()));
  }

  private static void printResult(CompositeFuture compositeFuture) {
    System.out.println(Thread.currentThread().getName() + " Result: service1:" + compositeFuture.resultAt(0) + " service2:" + compositeFuture.resultAt(1)
    );
  }
}

下面是运行代码后打印在控制台上的结果。这两个请求都是从同一个 vertx 事件循环线程调度的。该程序还会每秒打印线程未被阻止的消息。最后,它将打印两个状态代码作为最终结果。如您所见,一切都发生在同一个线程上:

[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] service 2 response received
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] is released
[vert.x-eventloop-thread-1] service 1: response received
[vert.x-eventloop-thread-1] Result: service1:200 service2:200

总结

这就是我目前所要讨论的全部内容。我希望这篇文章能帮助您现在对如何使用 Vert.x 异步发送长阻塞请求有了更好的理解。文章来源地址https://www.toymoban.com/news/detail-438293.html

到了这里,关于使用 Vert.x 异步发送HTTP长阻塞请求来提高并发响应的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【注意】Kafka生产者异步发送消息仍有可能阻塞

    Kafka是常用的消息中间件。在Spring Boot项目中,使用KafkaTemplate作为生产者发送消息。有时,为了不影响主业务流程,会采用 异步 发送的方式,如下所示。 本以为采用异步发送,必然不会影响到主业务流程。但实际使用时发现,在第一次发送消息时,如果Kafka Broker连接失败,

    2023年04月13日
    浏览(68)
  • Axios基本使用,为学习后续的Vue服务【发送请求+并发请求+前端拦截器】

    目录 1、项目中引入Axios 2、使用Axios发送请求 2.1、例:发送GET请求 2.2、例:发送POST请求 3、axios并发请求 4、拦截器 注:个人学习笔记,因自己学过后端,所以有关后端的代码,我在这里就不展示了~ 不了解后端的宝子,也不会耽误学习,因为公司里会有写好的接口文档,直

    2024年02月02日
    浏览(40)
  • AJAX 使用 JavaScript 的 `XMLHttpRequest` 对象来向服务器发送异步请求

    AJAX 是一种使用异步 HTTP (Ajax) 请求获取和发送数据的技术。它使得网页能够进行异步更新,而不需要重新加载整个页面。通过使用 AJAX,可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。 AJAX 使用 JavaScript 的 XMLHttpRequest 对象来向服务器发送异步请

    2024年01月16日
    浏览(44)
  • 并发测试工具 apache-jmeter使用发送post请求JSON数据

    目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告  为web请求添加token 添加Content-Type用于发送json 4 启动测试 5 查看结果 官网 Apache JMeter - Download Apache JMeter 解压运行 2   打开软件设置中文 效果 补充知识: 什么是Damp-up: Ramp-Up Perio

    2024年02月10日
    浏览(32)
  • NIFI使用InvokeHTTP发送http请求

    这里介绍四种平时常用的http请求方法:GET、POST、PUT、DELETE。 在官方的介绍文档中关于InvokeHTTP处理器的描述是这么说的: An HTTP client processor which can interact with a configurable HTTP Endpoint. The destination URL and HTTP Method are configurable. FlowFile attributes are converted to HTTP headers and the FlowFile

    2024年02月09日
    浏览(77)
  • 使用Go发送HTTP POST请求

    在Go语言中,我们可以使用 net/http 包来发送HTTP POST请求。以下是一个简单的示例,展示了如何使用Go发送HTTP POST请求并获取响应。 go 复制代码 package  main import  ( \\\"bytes\\\"   \\\"fmt\\\"   \\\"io/ioutil\\\"   \\\"net/http\\\"   ) func   main ()  { // 创建一个HTTP客户端 client := http.Client{} // 创建一个POST请求

    2024年01月23日
    浏览(36)
  • 使用Go发送HTTP GET请求

    在Go语言中,我们可以使用 net/http 包来发送HTTP GET请求。以下是一个简单的示例,展示了如何使用Go发送HTTP GET请求并获取响应。 go 复制代码 package  main import  ( \\\"fmt\\\"   \\\"io/ioutil\\\"   \\\"net/http\\\"   ) func   main ()  { // 创建一个HTTP客户端 client := http.Client{} // 创建一个GET请求 req, err :=

    2024年01月23日
    浏览(36)
  • C++使用HTTP库和框架轻松发送HTTP请求

    使用C++编程发送HTTP请求通常需要使用第三方的HTTP库或框架。在C++中,有几个受欢迎的HTTP库可供选择,例如Curl、Boost.Beast和cpp-httplib。另外,也可以自己实现socket来发送http请求。 (1)安装Curl库 。 对于Debian/Ubuntu系统: 对于RHEL/CentOS系统: 对于macOS系统: (2)编写Curl代码

    2024年02月02日
    浏览(35)
  • 使用浏览器发送HTTP POST请求

    HTTP请求有如下几个分类,其中最常见和常用的是GET和POST请求。  一般来说,使用浏览器地址栏访问域名或ip时能且仅能向浏览器服务端发送get请求,如果需要发送POST请求或其他类型http请求需要借助接口工具譬如postman。 如果某个web应用部署环境下缺少接口调试工具,该如何

    2024年02月11日
    浏览(45)
  • 使用 cURL 发送 HTTP 请求: 深入探讨与示例

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包