性能测试测试后端开发者工具【免费下载链接】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),仅供参考