FrameworkBenchmarks 中的 Jooby 基准测试:一套 Java 微框架如何跑满 TechEmpower 六类测试
性能测试测试后端开发者工具【免费下载链接】FrameworkBenchmarksSource for the TechEmpower Framework Benchmarks project项目地址https://gitcode.com/gh_mirrors/fr/FrameworkBenchmarks点击查看免费下载本文以 TechEmpower FrameworkBenchmarks 仓库中 Jooby 基准测试说明文档 为核心完整梳理 Jooby 框架在该项目中覆盖的六类测试端点、基于 Maven Profile 的三种 HTTP 平台构建方式与运行方式并结合仓库源码App.java、pom.xml 等解释各测试的实现细节帮助读者理解一个 Java 微 Web 框架如何被完整纳入基准测试套件。1. 文档定位Jooby 在基准套件中的角色Jooby 是一个面向 Java 与 Kotlin 的模块化微 Web 框架。仓库中的 README 给出的最小示例展示了其声明式风格——通过继承Jooby类直接在实例初始化块里注册路由public class App extends Jooby { { get(/, ctx - Hello, World!); } }该目录是基准测试套件中 Jooby 的测试模块。README 将六个测试Plain Text、JSON Encoding、Single Query、Multiple Queries、Database Update、Fortunes全部指向同一个源文件 src/main/java/com/techempower/App.java即六个端点集中在一个应用类中实现而不是拆分成多个程序。2. 六类测试端点Test URLsREADME 中列出的测试 URL 全部基于localhost:8080与 benchmark_config.json 及 config.toml 中登记的 URL 完全一致测试类型URL对应源码位置Plain Text Testhttp://localhost:8080/plaintextApp.javaJSON Encoding Testhttp://localhost:8080/jsonApp.javaSingle Query Testhttp://localhost:8080/dbApp.javaMultiple Queries Testhttp://localhost:8080/queriesApp.javaDatabase Update Testhttp://localhost:8080/updatesApp.javaFortunes Testhttp://localhost:8080/fortunesApp.java从源码结构看各端点的实现要点如下Plain TextHello, World!在类初始化时预先转成 UTF-8 字节数组并包装成可复用的Output对象MESSAGE_BYTES每个请求只做一次ctx.send(message)避免重复编码JSON通过Json.encode(new Message(MESSAGE))编码输出类型设置为MediaType.JSONSingle Query / Multiple Queries / Updates使用HikariModule提供的DataSource手写 JDBC 的PreparedStatement执行select * from world where id?其中/queries与/updates的查询次数由queries查询参数控制解析逻辑在 Util.queries() 中——缺省为 1并做Math.min(500, Math.max(1, ...))的边界钳制非法值回退为 1Updates采用单条批量 UPDATE 语句借助 Postgres 的VALUES子句一次更新多行UPDATE world SET randomNumber temp.randomNumber FROM (VALUES (?, ?), ...) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id world.idFortunes查询fortune表全部行后追加一条固定记录Additional fortune added at request time.排序后渲染 Rocker 模板 public/views/fortunes.rocker.html。一个值得注意的结构细节数据库相关的路由/db、/queries、/updates、/fortunes被包裹在dispatch(() - { ... })中。注释明确写着/** Go blocking: */即这些会阻塞的 JDBC 路由被放入独立的分发线程池避免在事件循环线程上执行阻塞 IO而/plaintext与/json则直接跑在事件循环上。应用入口main方法通过runApp(args, EVENT_LOOP, App::new)显式指定EVENT_LOOP执行模式见 App.java 末尾。3. JSON 编码编译期生成的 dsl-json 转换器/json等端点的序列化实现位于 Json.java。它基于dsl-json库并通过CompiledJson注解见 World.java 与 Message.java在编译期生成类型化的转换器例如_World_DslJsonConverter.ObjectFormatConverter。源码中的两个细节体现了性能取向JsonWriter以ThreadLocal池化复用初始容量 1024每次编码前reset()后复用减少对象分配编码结果直接以outputFactory.wrap(writer.getByteBuffer(), 0, writer.size())包成 Jooby 的Output绕开中间String拷贝。编译期转换器的生成依赖 pom.xml 中maven-compiler-plugin配置的注解处理器jooby-apt与dsl-json并且build-helper-maven-plugin会把生成的注解产物目录加入编译源路径pom.xml。4. 构建Maven Profile 切换 HTTP 平台README 给出的三条构建命令本质上是切换 pom.xml 中定义的 Maven Profile每个 Profile 引入不同的 Jooby 平台适配依赖构建命令Profile引入的依赖mvn clean package -P nettynettyjooby-nettymvn clean package -P undertowundertowjooby-undertowmvn clean package -P jettyjettyjooby-jetty除此之外pom.xml 中还定义了一个vertxProfile引入jooby-vertx对应基准套件里非 README 主线的pgclient变体见下一节。构建产物的组织方式由maven-shade-plugin完成打成 fat jarfinalName为jooby并通过ManifestResourceTransformer把主类写入清单主类来自属性application.class默认值即com.techempower.Apppom.xml。另外 Rocker 模板由rocker-maven-plugin在generate-sources阶段从public目录编译生成。pom.xml 中还有一些环境相关配置maven.compiler.source/target为 25基础依赖为jooby-hikari、jooby-rocker、postgresql42.7.7、jooby-vertx-pg-client与dsl-json统一版本由jooby-bom4.0.11导入管理针对 macOS 还有自动激活的macProfile追加netty-resolver-dns-native-macososx-aarch_64。5. 运行与数据库配置README 给出的运行命令为java -jar target/jooby-2x.jar而仓库中的 Dockerfile 实际运行的是 shade 插件产出的target/jooby.jar例如 jooby.dockerfile并附带了一组 JVM 参数java -server -Xms2g -Xmx2g -XX:UseNUMA -XX:UseParallelGC -jar target/jooby.jar各 Dockerfile 的构建与启动差异如下均以maven:3.9.11-eclipse-temurin-25-noble为构建镜像EXPOSE 8080jooby.dockerfilemvn package -q -P undertow普通 JVM 参数jooby-netty.dockerfilemvn package -q -P netty并追加 Netty 调优参数如-Dio.netty.disableHttpHeadersValidationtrue、-Dio.netty.buffer.checkBoundsfalse、-Dio.netty.eventLoopGroupsingle以及 JDK 侧的--enable-native-accessALL-UNNAMED、--add-opensjava.base/java.langALL-UNNAMED、--sun-misc-unsafe-memory-accessallowjooby-jetty.dockerfilemvn package -q -P jettyJVM 参数与普通版相同jooby-mvc.dockerfilemvn package -q -P netty但启动类换为com.techempower.MvcApp-cp target/jooby.jarjooby-pgclient.dockerfilemvn package -q -P vertx启动类为com.techempower.ReactivePg并传参vertx同时追加-Dvertx.disableMetricstrue、-Dvertx.disableContextTimingstrue、-Djava.lang.Integer.IntegerCache.high10000等参数。数据库连接信息通过 Jooby 的配置系统加载conf/application.conf 提供了 JDBC 数据源属性db.databaseName hello_world db.serverName tfb-database db.portNumber 5432 db.user benchmarkdbuser db.password benchmarkdbpass db.dataSourceClassName org.postgresql.ds.PGSimpleDataSource其中serverName指向基准套件的数据库容器tfb-databasedataSourceClassName指定 Postgres 的PGSimpleDataSource由HikariModule据此创建连接池。HikariModule的安装在 App.java 中随后通过require(DataSource.class)取出数据源。6. 多入口变体MvcApp 与 ReactivePg除了 README 主线对应的App目录内还有两个额外入口它们在 benchmark_config.json 中分别登记为mvcdisplay_name:jooby-jaxrs与pgclientdisplay_name:jooby-pgclient变体MvcApp.java演示 Jooby 的注解式 MVC 风格。入口不再是继承Jooby的类而是用runApp(args, EVENT_LOOP, app - { ... })以编程式安装模块HikariModule、RockerModule再注册资源类Resource_由jooby-apt注解处理器从 Resource.java 生成。Resource用GET、Path(/plaintext)等注解声明路由数据库路由标注Dispatch同样放入阻塞线程池ReactivePg.java把数据库访问换成 Vert.x 的响应式 PG 客户端VertxPgConnectionModuleSQL 占位符也随之从 JDBC 的?换成$1风格。它通过prepare(statements())预准备三类语句selectWorld、selectFortune以及 1~500 长度的批量updateWorldUPDATE WORLD SET RANDOMNUMBER CASE ID WHEN $1 THEN $2 ... ELSE RANDOMNUMBER END WHERE ID IN (...)见 buildAggregatedUpdateQuery()。/queries场景则通过sqlClient.group(client - {...})在同一连接组内并发发起 N 条 prepared queryselectWorlds()。对应的 Vert.x 客户端连接参数在 conf/application.vertx.conf 中给出db.cachePreparedStatements true db.preparedStatementCacheMaxSize 1024 db.pipeliningLimit 2567. 基准套件登记信息benchmark_config.json与 config.toml 内容对应为每个变体登记了完整元数据关键字段包括端口统一为8080query_url/update_url带?queries参数前缀压测时在其后追加查询次数approach Realistic、classification Fullstack、orm Raw、database Postgres、webserver None框架自带 HTTP 层不前置 nginxplatform字段按变体区分default为Undertow、netty/mvc/pgclient为Netty、jetty为Jettyversus字段则对应到基准结果页上的平台对比组pgclient变体只登记了db_url/query_url/update_url/fortune_url不跑/plaintext与/json。8. 小结Jooby 模块展示了基准套件对一个 Java 微框架的典型收录方式单一App入口集中实现六个标准测试端点通过 Maven Profile 在同一份源码上切换 Undertow/Netty/Jetty 三种平台再以注解式 MVC 入口和响应式 PG 客户端入口形成两个补充变体JVM 与 Netty 参数按平台差异化配置。所有 URL、端口、构建与运行方式均可在 README、pom.xml、benchmark_config.json 与五个 Dockerfile 中交叉验证。赞分享性能测试测试后端开发者工具【免费下载链接】FrameworkBenchmarksSource for the TechEmpower Framework Benchmarks project项目地址https://gitcode.com/gh_mirrors/fr/FrameworkBenchmarks点击查看免费下载相关推荐FrameworkBenchmarks 中的 HServer 基准测试Java 全栈框架的六类 TechEmpower 用例实现解析FrameworkBenchmarks 中的 HServer 基准测试Java 全栈框架的六类 TechEmpower 用例实现解析 导读 本文聚焦 Fram性能测试测试后端开发者工具Luminus 框架在 TechEmpower FrameworkBenchmarks 中的基准测试实现全解析Luminus 框架在 TechEmpower FrameworkBenchmarks 中的基准测试实现全解析 Luminus 是 Clojure 社区主流的全性能测试测试后端开发者工具FrameworkBenchmarks 中的 Hertz 基准测试Go 微服务框架的 TechEmpower 全栈实现解析FrameworkBenchmarks 中的 Hertz 基准测试Go 微服务框架的 TechEmpower 全栈实现解析 本文围绕 FrameworkBen性能测试测试后端开发者工具上一篇DLSS Swapper打破游戏性能优化壁垒的终极解决方案下一篇GetQzonehistory完整指南如何备份导出QQ空间历史说说创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

论文格式排版工具原理与实操:Paperxie如何一键套用高校模板

论文格式排版工具原理与实操:Paperxie如何一键套用高校模板

每年到毕业季,我都能在朋友圈里看到同一类哀嚎:论文写完了,格式改了一天一夜。页眉页脚不对、目录页码错位、参考文献中英混排、行距字号被导师画了一堆红圈……内容明明是自己一个字一个字敲出来的,最后却被“格式”这两个字折磨…

2026/10/15 20:42:19 阅读更多 →
Nginx三种安装方式详解:包管理器、源码编译与Docker容器化部署

Nginx三种安装方式详解:包管理器、源码编译与Docker容器化部署

搞服务器的人,没人绕得开Nginx。不管你是给个人博客做反向代理,还是替公司搭一套能扛住大流量的网关层,Nginx基本是首选。但就是这么个常用组件,光安装方式就有好几种,选错了后面运维全是坑。我这些年前前后后在几十台…

2026/10/15 20:42:19 阅读更多 →
appleboy/ssh-action 完全指南:用 GitHub Actions 安全执行远程 SSH 命令

appleboy/ssh-action 完全指南:用 GitHub Actions 安全执行远程 SSH 命令

CI/CD 【免费下载链接】ssh-action GitHub Actions for executing remote ssh commands. 项目地址: https://gitcode.com/gh_mirrors/ss/ssh-action 点击查看 免费下载 本篇技术指南以开源仓库 ssh-action(即 appleboy/ssh-action)为核心&am…

2026/10/15 20:41:18 阅读更多 →

最新新闻

vtstscripts.tgz部署避坑指南:Python版本、权限与YAML依赖详解

vtstscripts.tgz部署避坑指南:Python版本、权限与YAML依赖详解

简介:这是一套面向Linux运维工程师与服务器管理员的实用脚本工具集,聚焦系统监控、日志分析、服务管理、备份恢复及安全巡检等高频运维场景,助力提升日常操作效率与故障响应能力。资源包共152个文件,以Perl(104个.pl/.…

2026/10/15 21:27:43 阅读更多 →
手写C++词法分析器:从状态机到可调试Lexer实战

手写C++词法分析器:从状态机到可调试Lexer实战

1. 项目概述:为什么词法分析是编译器的“第一道安检门”你打开一个C源文件,敲下int main() { return 0; },按下编译键——几毫秒后,程序跑起来了。但你可能没意识到,就在你敲下回车的瞬间,这行代码已经悄悄…

2026/10/15 21:27:43 阅读更多 →
监控跑了一个月,出事时微信一声没响

监控跑了一个月,出事时微信一声没响

背景 服务器上跑着 Uptime Kuma,监控 3 个服务,接了 ServerChan 微信通知。某天 Nginx 配置改崩了,dashboard 挂了 20 分钟——微信安安静静。 原因 登服务器查数据库: sudo docker cp uptime-kuma:/app/data/kuma.db /tmp/kuma.d…

2026/10/15 21:27:43 阅读更多 →
Opus5.5的“弟弟”Sonnet5.5来了,GPT6变弟中弟!TaoToken统一Key实测

Opus5.5的“弟弟”Sonnet5.5来了,GPT6变弟中弟!TaoToken统一Key实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:27:43 阅读更多 →
密码明明一样,为什么 GPG 说“错的“?

密码明明一样,为什么 GPG 说“错的“?

背景 服务器上用 GPG 加密了一个备份包,密码存在 /root/.backup_pass。想在 Windows 上验证能不能解密,结果: gpg --passphrase-file backup_pass.txt --decrypt secrets.tar.gz.gpg # gpg: decryption failed: Bad session key密码是从服务器…

2026/10/15 21:27:43 阅读更多 →
【从零入门】爆火的 Vibe Coding 到底是什么?保姆级上手教程(TaoToken 统一 Key 版)

【从零入门】爆火的 Vibe Coding 到底是什么?保姆级上手教程(TaoToken 统一 Key 版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:26:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →