Alanxtl commented on code in PR #3502: URL: https://github.com/apache/dubbo-go/pull/3502#discussion_r3642891042
########## tools/benchmark/client/clients/grpc_client.go: ########## @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package clients + +import ( + "context" + "fmt" +) + +import ( + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +import ( + benchmark "dubbo.apache.org/dubbo-go/v3/tools/benchmark/proto/benchmark_gen" +) + +type GrpcClient struct { + conn *grpc.ClientConn + client benchmark.BenchmarkServiceClient + payload []byte + callMode string +} + +func NewGrpcClient(addr string, callMode string, payload []byte) (*GrpcClient, error) { + conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return nil, fmt.Errorf("连接gRPC服务失败: %v", err) Review Comment: do not use any Chinese ########## tools/benchmark/README.md: ########## Review Comment: convert this file to README_CN.md and add a English version of README.md ########## tools/benchmark/benchmark_report.md: ########## Review Comment: just put this report inside README ########## .github/workflows/github-actions.yml: ########## @@ -83,6 +88,11 @@ jobs: with: go-version-file: go.mod + - name: Set Go Proxy + run: | + go env -w GOPROXY=https://goproxy.cn,direct + go env -w GOSUMDB=sum.golang.google.cn + Review Comment: do not summit these ########## tools/benchmark/report/generator.go: ########## Review Comment: remove the whole report generator, we do not need this we just need to print the benchmark result in stdio ########## tools/benchmark/proto/benchmark_gen/benchmark.pb.go: ########## Review Comment: why the dir is tools/benchmark/proto/benchmark_gen/benchmark.pb.go I think just put it in tools/benchmark/proto/benchmark.pb.go is enough ########## tools/benchmark/README.md: ########## @@ -0,0 +1,306 @@ +# Dubbo-Go Benchmark Suite + +性能基准测试套件,用于横向对比 **Dubbo-Go / Dubbo-Java / gRPC** 三者性能。 + +## 功能特性 + +- 支持多种报文大小梯度:128B / 1KiB / 16KiB / 1MiB +- 支持多种压缩策略:gzip关闭 / 默认压缩 / 最高压缩速度 +- 支持多种序列化协议:protobuf / hessian2 / msgpack +- 支持多种调用模式:一元调用(unary) / 流式调用(streaming) +- 支持多档并发数:50/100/500/1000/2000 +- 完整的CI检查:许可证头验证、代码格式化、安全扫描、代码质量分析 + +## 输出指标 + +- **吞吐量**:QPS(每秒成功请求数) +- **延迟**:p50/p90/p95/p99平均耗时 +- **资源占用**:服务端CPU使用率、内存占用峰值 + +## 环境依赖 + +- **Go**: 1.23+ +- **Java**: 8+ +- **Maven**: 3.6+ +- **protoc**: 3.0+ + +## 默认端口配置 + +| 框架 | 默认端口 | +|------|---------| +| Dubbo-Go | 20000 | +| Dubbo-Java | 20001 | +| gRPC | 50051 | + +## 目录结构 + +``` +tools/benchmark +├── client/ # 压测客户端 +│ ├── main.go # 压测入口 +│ ├── clients/ # 客户端实现 +│ │ ├── dubbo_client.go # Dubbo-Go客户端 +│ │ └── grpc_client.go # gRPC客户端 +│ ├── engine/ # 压测引擎 +│ │ ├── engine.go # 引擎主逻辑 +│ │ ├── statistics.go # 统计计算 +│ │ └── metrics.go # 指标收集 +│ ├── monitor/ # 系统监控 +│ │ └── system_monitor.go # CPU/内存监控 +│ └── payload/ # 报文生成 +│ └── payload.go # 随机报文生成器 +├── server/ # 服务端Demo +│ ├── dubbo-go/ # Dubbo-Go服务端 +│ │ └── main.go +│ ├── dubbo-java/ # Dubbo-Java服务端 +│ │ └── pom.xml +│ └── grpc/ # gRPC服务端 +│ └── main.go +├── proto/ # 协议定义 +│ ├── benchmark.proto # Protobuf定义文件 +│ └── benchmark_gen/ # 生成的代码 +├── scripts/ # 自动化脚本 +│ ├── gen_code.sh # Protobuf代码生成 +│ ├── run_all.sh # 一键全量压测 +│ └── run_single.sh # 单场景压测 +├── report/ # 报告生成工具 +│ └── generator.go # 报告生成器 +├── configs/ # 压测配置 +│ └── benchmark.yaml # 测试矩阵配置 +├── data/ # 测试结果数据(自动生成) +├── logs/ # 测试日志(自动生成) +├── go.mod/go.sum # Go依赖 +└── README.md # 使用文档 +``` + +## 配置说明 + +测试配置位于 `configs/benchmark.yaml`,包含: + +- `payload_sizes`: 报文大小(单位:字节) +- `serializations`: 序列化协议 +- `compressions`: 压缩策略 +- `call_modes`: 调用模式 +- `concurrency_levels`: 并发数 +- `benchmark`: 压测参数(预热时间、测试时长、超时时间) + +## 代码生成 + +当需要修改 `proto/benchmark.proto` 后,需要重新生成代码: + +```bash +./scripts/gen_code.sh +``` + +该脚本会生成: +- `benchmark.pb.go` - Protobuf基础代码 +- `benchmark.triple.go` - Dubbo Triple协议代码 +- `benchmark_grpc.pb.go` - gRPC协议代码 + +## 使用方式 + +### 单场景压测 + +```bash +# 使用脚本运行 +./scripts/run_single.sh dubbo-go 1024 protobuf none 100 unary + +# 或者直接运行客户端 +go run client/main.go \ + --framework dubbo-go \ + --payload 1024 \ + --serialization protobuf \ + --compression none \ + --concurrency 100 \ + --mode unary +``` + +### 全量压测 + +```bash +./scripts/run_all.sh +``` + +### 生成报告 + +```bash +go run report/generator.go +``` + +报告将生成在 `report/benchmark_report.md`。 + +## 命令行参数 + +| 参数 | 说明 | 默认值 | +|------|------|--------| +| `--framework` | 测试框架 | dubbo-go | +| `--payload` | 报文大小(字节) | 1024 | +| `--serialization` | 序列化协议 | protobuf | +| `--compression` | 压缩策略 | none | +| `--concurrency` | 并发数 | 100 | +| `--mode` | 调用模式 | unary | +| `--duration` | 测试时长 | 60s | +| `--warmup` | 预热时长 | 10s | +| `--addr` | 服务端地址 | 自动选择 | +| `--pid` | 服务端PID(用于系统监控) | 0 | + +### 参数取值范围 + +| 参数 | 可选值 | +|------|--------| +| `--framework` | dubbo-go / dubbo-java / grpc | +| `--serialization` | hessian2 / protobuf / msgpack | +| `--compression` | none / default / fastest | +| `--mode` | unary / streaming | + +## 单独启动服务端 + +```bash +# Dubbo-Go 服务端 +cd server/dubbo-go +go run main.go --serialization protobuf --compression none --port 20000 + +# gRPC 服务端 +cd server/grpc +go run main.go --port 50051 + +# Dubbo-Java 服务端 +cd server/dubbo-java +mvn clean package +java -jar target/benchmark-dubbo-java.jar +``` + +## 测试结果示例 + +**128B 包体(Dubbo-Go):** +| 指标 | 值 | +|------|-----| +| QPS | 21,450 | +| 成功率 | 99.99% | +| P99延迟 | 5.53 ms | + +**1MiB 包体(Dubbo-Go):** +| 指标 | 值 | +|------|-----| +| QPS | 424 | +| 成功率 | 99.61% | +| P99延迟 | 588.68 ms | + +## 输出文件说明 + +### 数据文件 + +测试结果保存在 `data/` 目录,文件名格式: +``` +{framework}_{payload}_{serialization}_{compression}_{concurrency}_{mode}.json +``` + +JSON结构: +```json +{ + "framework": "dubbo-go", + "payload_size": 1024, + "serialization": "protobuf", + "compression": "none", + "concurrency": 100, + "call_mode": "unary", + "timestamp": "2026-07-23 15:00:00", + "qps": 21450.0, + "success_rate": 99.99, + "latency_p50_ms": 4.65, + "latency_p99_ms": 5.53, + "cpu_avg_percent": 45.2, + "memory_peak_mb": 128.5 +} +``` + +### 日志文件 + +日志保存在 `logs/` 目录,包含: +- `{场景}.log` - 客户端压测日志 +- `{场景}.server.log` - 服务端运行日志 + +## 代码质量 + +本项目已通过以下质量检查: + +- **SonarCloud**: 代码质量分析(代码异味、重复代码、复杂度检测) +- **CodeQL**: 安全漏洞扫描(敏感信息泄露、注入攻击检测) +- **License Header**: Apache-2.0 许可证验证(所有文件必须包含标准许可证头) +- **Code Format**: Go 官方格式化标准(`go fmt` + `imports-formatter`) + +## 代码规范 + +### 格式检查 + +在提交代码前,请确保通过格式检查: + +```bash +# 运行格式化命令 +cd tools/benchmark +go fmt ./... +imports-formatter ./... + +# 或者从项目根目录运行 +make check-fmt +``` + +### 许可证头 + +所有源代码文件(Go、Java、Proto、YAML、XML)必须包含标准的 Apache-2.0 许可证头。许可证头的格式必须与项目根目录下的 `.licenserc.yaml` 配置完全一致。 + +### Import 规范 + +- 所有 import 语句必须放在一个 import 块中,不允许使用多个独立的 import 块 +- import 语句按以下顺序排列,每组之间用空行分隔: + 1. 标准库(如 `fmt`, `net`, `context`) + 2. 第三方库(如 `google.golang.org/grpc`) + 3. 项目内部包(如 `dubbo.apache.org/dubbo-go/v3/...`) + +## 性能优化配置 + +### Dubbo-Go 客户端优化 + +为获得最佳性能,Dubbo-Go 客户端使用了以下优化配置: + +| 配置项 | 说明 | +|--------|------| +| `WithClientNoCheck()` | 跳过服务检查,减少不必要的开销 | +| `MaxCallRecvMsgSize: 16MB` | 最大接收消息大小,支持大报文测试 | +| `MaxCallSendMsgSize: 16MB` | 最大发送消息大小,支持大报文测试 | + +### Dubbo-Go 服务端优化 + +服务端配置了以下优化参数: + +| 配置项 | 说明 | +|--------|------| +| `WithMaxServerRecvMsgSize("16MB")` | 最大接收消息大小 | +| `WithMaxServerSendMsgSize("16MB")` | 最大发送消息大小 | + +## CI 配置 + +本项目在 GitHub Actions 中配置了国内 Go 镜像代理,以解决依赖下载不稳定的问题: + +```yaml +- name: Set Go Proxy + run: | + go env -w GOPROXY=https://goproxy.cn,direct + go env -w GOSUMDB=sum.golang.google.cn +``` + +## 注意事项 + +1. 每个测试场景会独立启动/停止服务端,避免缓存干扰 +2. 测试前会进行10秒预热,消除冷启动影响 +3. 建议关闭防火墙和后台进程,保证测试环境纯净 +4. 服务端进程会在测试结束后自动清理 +5. 测试结果会自动保存到 `data/` 目录 +6. 提交代码前请运行 `make check-fmt` 确保格式正确 +7. 如需监控服务端资源占用,请通过 `--pid` 参数传入服务端进程ID +8. 大报文测试(1MiB及以上)需要确保消息大小配置足够大 +9. 清理缓存后需要重新整理依赖:`go clean -modcache && go mod tidy` Review Comment: ditto ########## tools/benchmark/README.md: ########## @@ -0,0 +1,306 @@ +# Dubbo-Go Benchmark Suite + +性能基准测试套件,用于横向对比 **Dubbo-Go / Dubbo-Java / gRPC** 三者性能。 + +## 功能特性 + +- 支持多种报文大小梯度:128B / 1KiB / 16KiB / 1MiB +- 支持多种压缩策略:gzip关闭 / 默认压缩 / 最高压缩速度 +- 支持多种序列化协议:protobuf / hessian2 / msgpack +- 支持多种调用模式:一元调用(unary) / 流式调用(streaming) +- 支持多档并发数:50/100/500/1000/2000 +- 完整的CI检查:许可证头验证、代码格式化、安全扫描、代码质量分析 + +## 输出指标 + +- **吞吐量**:QPS(每秒成功请求数) +- **延迟**:p50/p90/p95/p99平均耗时 +- **资源占用**:服务端CPU使用率、内存占用峰值 + +## 环境依赖 + +- **Go**: 1.23+ +- **Java**: 8+ +- **Maven**: 3.6+ +- **protoc**: 3.0+ + +## 默认端口配置 + +| 框架 | 默认端口 | +|------|---------| +| Dubbo-Go | 20000 | +| Dubbo-Java | 20001 | +| gRPC | 50051 | + +## 目录结构 + +``` +tools/benchmark +├── client/ # 压测客户端 +│ ├── main.go # 压测入口 +│ ├── clients/ # 客户端实现 +│ │ ├── dubbo_client.go # Dubbo-Go客户端 +│ │ └── grpc_client.go # gRPC客户端 +│ ├── engine/ # 压测引擎 +│ │ ├── engine.go # 引擎主逻辑 +│ │ ├── statistics.go # 统计计算 +│ │ └── metrics.go # 指标收集 +│ ├── monitor/ # 系统监控 +│ │ └── system_monitor.go # CPU/内存监控 +│ └── payload/ # 报文生成 +│ └── payload.go # 随机报文生成器 +├── server/ # 服务端Demo +│ ├── dubbo-go/ # Dubbo-Go服务端 +│ │ └── main.go +│ ├── dubbo-java/ # Dubbo-Java服务端 +│ │ └── pom.xml +│ └── grpc/ # gRPC服务端 +│ └── main.go +├── proto/ # 协议定义 +│ ├── benchmark.proto # Protobuf定义文件 +│ └── benchmark_gen/ # 生成的代码 +├── scripts/ # 自动化脚本 +│ ├── gen_code.sh # Protobuf代码生成 +│ ├── run_all.sh # 一键全量压测 +│ └── run_single.sh # 单场景压测 +├── report/ # 报告生成工具 +│ └── generator.go # 报告生成器 +├── configs/ # 压测配置 +│ └── benchmark.yaml # 测试矩阵配置 +├── data/ # 测试结果数据(自动生成) +├── logs/ # 测试日志(自动生成) +├── go.mod/go.sum # Go依赖 +└── README.md # 使用文档 +``` + +## 配置说明 + +测试配置位于 `configs/benchmark.yaml`,包含: + +- `payload_sizes`: 报文大小(单位:字节) +- `serializations`: 序列化协议 +- `compressions`: 压缩策略 +- `call_modes`: 调用模式 +- `concurrency_levels`: 并发数 +- `benchmark`: 压测参数(预热时间、测试时长、超时时间) + +## 代码生成 + +当需要修改 `proto/benchmark.proto` 后,需要重新生成代码: + +```bash +./scripts/gen_code.sh +``` + +该脚本会生成: +- `benchmark.pb.go` - Protobuf基础代码 +- `benchmark.triple.go` - Dubbo Triple协议代码 +- `benchmark_grpc.pb.go` - gRPC协议代码 + +## 使用方式 + +### 单场景压测 + +```bash +# 使用脚本运行 +./scripts/run_single.sh dubbo-go 1024 protobuf none 100 unary + +# 或者直接运行客户端 +go run client/main.go \ + --framework dubbo-go \ + --payload 1024 \ + --serialization protobuf \ + --compression none \ + --concurrency 100 \ + --mode unary +``` + +### 全量压测 + +```bash +./scripts/run_all.sh +``` + +### 生成报告 + +```bash +go run report/generator.go +``` + +报告将生成在 `report/benchmark_report.md`。 + +## 命令行参数 + +| 参数 | 说明 | 默认值 | +|------|------|--------| +| `--framework` | 测试框架 | dubbo-go | +| `--payload` | 报文大小(字节) | 1024 | +| `--serialization` | 序列化协议 | protobuf | +| `--compression` | 压缩策略 | none | +| `--concurrency` | 并发数 | 100 | +| `--mode` | 调用模式 | unary | +| `--duration` | 测试时长 | 60s | +| `--warmup` | 预热时长 | 10s | +| `--addr` | 服务端地址 | 自动选择 | +| `--pid` | 服务端PID(用于系统监控) | 0 | + +### 参数取值范围 + +| 参数 | 可选值 | +|------|--------| +| `--framework` | dubbo-go / dubbo-java / grpc | +| `--serialization` | hessian2 / protobuf / msgpack | +| `--compression` | none / default / fastest | +| `--mode` | unary / streaming | + +## 单独启动服务端 + +```bash +# Dubbo-Go 服务端 +cd server/dubbo-go +go run main.go --serialization protobuf --compression none --port 20000 + +# gRPC 服务端 +cd server/grpc +go run main.go --port 50051 + +# Dubbo-Java 服务端 +cd server/dubbo-java +mvn clean package +java -jar target/benchmark-dubbo-java.jar +``` + +## 测试结果示例 + +**128B 包体(Dubbo-Go):** +| 指标 | 值 | +|------|-----| +| QPS | 21,450 | +| 成功率 | 99.99% | +| P99延迟 | 5.53 ms | + +**1MiB 包体(Dubbo-Go):** +| 指标 | 值 | +|------|-----| +| QPS | 424 | +| 成功率 | 99.61% | +| P99延迟 | 588.68 ms | + +## 输出文件说明 + +### 数据文件 + +测试结果保存在 `data/` 目录,文件名格式: +``` +{framework}_{payload}_{serialization}_{compression}_{concurrency}_{mode}.json +``` + +JSON结构: +```json +{ + "framework": "dubbo-go", + "payload_size": 1024, + "serialization": "protobuf", + "compression": "none", + "concurrency": 100, + "call_mode": "unary", + "timestamp": "2026-07-23 15:00:00", + "qps": 21450.0, + "success_rate": 99.99, + "latency_p50_ms": 4.65, + "latency_p99_ms": 5.53, + "cpu_avg_percent": 45.2, + "memory_peak_mb": 128.5 +} +``` + +### 日志文件 + +日志保存在 `logs/` 目录,包含: +- `{场景}.log` - 客户端压测日志 +- `{场景}.server.log` - 服务端运行日志 + +## 代码质量 + +本项目已通过以下质量检查: + +- **SonarCloud**: 代码质量分析(代码异味、重复代码、复杂度检测) +- **CodeQL**: 安全漏洞扫描(敏感信息泄露、注入攻击检测) +- **License Header**: Apache-2.0 许可证验证(所有文件必须包含标准许可证头) +- **Code Format**: Go 官方格式化标准(`go fmt` + `imports-formatter`) + +## 代码规范 + +### 格式检查 + +在提交代码前,请确保通过格式检查: + +```bash +# 运行格式化命令 +cd tools/benchmark +go fmt ./... +imports-formatter ./... + +# 或者从项目根目录运行 +make check-fmt +``` + +### 许可证头 + +所有源代码文件(Go、Java、Proto、YAML、XML)必须包含标准的 Apache-2.0 许可证头。许可证头的格式必须与项目根目录下的 `.licenserc.yaml` 配置完全一致。 + +### Import 规范 + +- 所有 import 语句必须放在一个 import 块中,不允许使用多个独立的 import 块 +- import 语句按以下顺序排列,每组之间用空行分隔: + 1. 标准库(如 `fmt`, `net`, `context`) + 2. 第三方库(如 `google.golang.org/grpc`) + 3. 项目内部包(如 `dubbo.apache.org/dubbo-go/v3/...`) Review Comment: remove these useless lines ########## tools/benchmark/benchmark_report.md: ########## @@ -0,0 +1,59 @@ +# Dubbo-Go Benchmark Report + +生成时间: 2026-07-22 18:29:11 + +## 测试环境 + +- **Go 版本**: 1.25+ +- **测试框架**: Dubbo-Go / gRPC +- **测试数据条数**: 3 + +## 测试配置 + +| 参数 | 值 | +|------|-----| +| 报文大小 | 128B / 1KiB / 16KiB / 1MiB | +| 序列化 | protobuf / hessian2 / msgpack | +| 压缩 | none / default / fastest | +| 并发数 | 50 / 100 / 500 / 1000 / 2000 | +| 调用模式 | unary / streaming | + + +## 128 bytes 报文 + +### QPS (每秒请求数) + +| 并发数 | dubbo-go | grpc | +|--------|--------|--------| +| 50 | 8077.1 | 133435.1 | + +### P99 延迟 (ms) + +| 并发数 | dubbo-go | grpc | +|--------|--------|--------| +| 50 | 11.97 | 0.78 | + +## 1048576 bytes 报文 + +### QPS (每秒请求数) + +| 并发数 | dubbo-go | grpc | +|--------|--------|--------| +| 50 | 0.0 | 2389.3 | + +### P99 延迟 (ms) + +| 并发数 | dubbo-go | grpc | +|--------|--------|--------| +| 50 | 0.00 | 31.44 | + +## 资源占用 + +| 框架 | 平均CPU (%) | 内存峰值 (MB) | +|------|-------------|---------------| +| dubbo-go | 0.00 | 0.00 | +| grpc | 0.00 | 0.00 | + +## 结论 + +待补充... Review Comment: where are the comparasions between dubbo-go dubbo-java gRPC? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
