支持JDK19虚拟线程的web框架,之一:体验( 二 )

部署quarkus应用

  • 登录用于部署quarkus应用的服务器,确保服务器上已经成功部署了docker
  • 新建名为application.properties的配置文件,内容是数据库相关的参数,如下所示
quarkus.datasource.db-kind=postgresqlquarkus.datasource.username=quarkusquarkus.datasource.password=123456quarkus.datasource.reactive.url=postgresql://192.168.0.99:5432/quarkus_test
  • 我这里,application.properties的路径是:/home/lighthouse/config/quarkus/application.properties
  • 检查application.properties文件的可读性,执行以下命令设置
sudo chmod a+r application.properties
  • 执行以下命令即可部署和启动quarkus应用,注意application.properties文件的位置要换成您自己的配置文件路径
docker run -idt \--name quarkus \-p 8080:8080 \-v /home/lighthouse/config/quarkus/application.properties:/application/config/application.properties \bolingcavalry/quarkus-virual-threads-demo:x64-0.0.3
  • 上述命令中 , quarkus应用的镜像bolingcavalry/quarkus-virual-threads-demo:x64-0.0.3是我提前准备好的 , 本篇只管使用即可,至于如何制作此镜像,接下来的文章会有详细说明
  • 用sudo docker logs quarkus命令查看启动日志 , 如果启动成功,信息如下所示
__________________ __________ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \--\___\_\____/_/ |_/_/|_/_/|_|\____/___/2022-10-16 11:46:41,406 INFO[io.quarkus] (main) quarkus-virual-threads-demo 1.0-SNAPSHOT on JVM (powered by Quarkus 2.13.2.Final) started in 0.804s. Listening on: http://0.0.0.0:80802022-10-16 11:46:41,414 INFO[io.quarkus] (main) Profile prod activated.2022-10-16 11:46:41,414 INFO[io.quarkus] (main) Installed features: [cdi, reactive-pg-client, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]验证基本功能
  • 假设quarkus所在宿主机的IP地址是192.168.0.1,那么在浏览器上访问地址http://192.168.0.1:8080/vt/persons/1,如下图 , 应用成功从数据库取得数据,并且将当前线程信息也返回给浏览器

支持JDK19虚拟线程的web框架,之一:体验

文章插图
  • 作为对比,该服务器上还有个使用虚拟线程的常规web服务,地址是:http://192.168.0.1:8080/pool/persons/1,如下图,该接口也能从数据库取得数据,并且将当前线程信息也返回给浏览器,注意两个接口线程信息的差异

支持JDK19虚拟线程的web框架,之一:体验

文章插图
  • 对于虚拟线程的接口http://192.168.0.1:8080/vt/persons/1,可以尝试多次访问,可见每次返回的虚拟线程Id都不一样 , 而使用线程池的接口http://192.168.0.1:8080/pool/persons/1,多次访问,返回的始终是同一个线程的id
  • 基本功能似乎没有问题,接下来可以压测了,用数据说话
压测使用虚拟线程的接口
  • 这次使用的压测工具名为k6,选它的原因只有两个字:简单
  • 在执行压测的电脑上,确保docker可以正常使用
  • 新建名为k6-vt-docker.js的文件,内容如下,可见非常简单,发请求再校验响应,只要返回码是200,并且body大小大于0就算一次成功 , 要注意的事两个参数,其中vus是并发数,duration是测试持续时间,可见这里设置的是模拟30用户并发请求 , 持续时间是60秒
import http from 'k6/http';import { sleep, check } from 'k6';export let options = {vus: 30,duration: '60s',};export default function () {let r = Math.floor(Math.random() * 6) + 1;const res = http.get(`http://192.168.0.1:8080/vt/persons/${r}`);check(res, {'is status 200': (res) => res.status === 200,'body size is > 0': (r) => r.body.length > 0,});sleep(1);}
  • 一行命令即可开始压测 , 如下
docker run --rm -i loadimpact/k6 run - < k6-vt-docker.js
  • 等待一分钟,压测完成,得到以下数据

支持JDK19虚拟线程的web框架,之一:体验

文章插图
  • 这里将几个重要参数介绍一下
  1. checks : 通过率,如果满足返回码200且包体大小大于0的条件,就表示本次请求成功,这里显示100.00%,表示全部通过
  2. http_req_waiting:等待响应的事件,这里avg=33.83ms,表示平均等待时间为33.83毫秒
  3. http_reqs:每秒处理请求数,即常说的QPS,这里是28个每秒
  • 接下来将并发数调整为300(即vue参数),如下图

支持JDK19虚拟线程的web框架,之一:体验

文章插图

推荐阅读