{"owner":"apache","repo":"dubbo-go","hasSkills":true,"totalSkillsCount":8,"totalTokensCount":8393,"categories":["plugin-manifest","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["tools/benchmark/README.md","tools/dubbo-go-schema/README.md","tools/dubbogo-cli/README.md","tools/imports-formatter/README.md","tools/protoc-gen-go-triple/README.md","tools/protoc-gen-triple-openapi/README.md","tools/protoc-gen-triple-openapi/example/greet.triple.openapi.json","tools/protoc-gen-triple-openapi/example/greet.triple.openapi.yaml"],"skills":{"tools/benchmark/README.md":"# Dubbo-Go Benchmark Suite\n\nEnglish | [中文](README_CN.md)\n\nPerformance benchmark suite for comparing **Dubbo-Go / Dubbo-Java / gRPC** frameworks.\n\n## Environment Requirements\n\n- **Go**: 1.23+\n- **Java**: 8+\n- **Maven**: 3.6+\n- **protoc**: 3.0+\n\n## Default Port Configuration\n\n| Framework | Default Port |\n|-----------|-------------|\n| Dubbo-Go | 20000 |\n| Dubbo-Java | 20001 |\n| gRPC | 50051 |\n\n## Directory Structure\n\n```\ntools/benchmark\n├── client/                  # Benchmark client\n│   ├── main.go              # Entry point\n│   ├── clients/             # Client implementations\n│   │   ├── dubbo_client.go  # Dubbo-Go client\n│   │   └── grpc_client.go   # gRPC client\n│   ├── engine/              # Benchmark engine\n│   │   ├── engine.go        # Engine logic\n│   │   ├── statistics.go    # Statistics calculation\n│   │   └── metrics.go       # Metrics collection\n│   ├── monitor/             # System monitor\n│   │   └── system_monitor.go # CPU/Memory monitor\n│   └── payload/             # Payload generator\n│       └── payload.go       # Random payload generator\n├── server/                  # Server demos\n│   ├── dubbo-go/            # Dubbo-Go server\n│   │   └── main.go\n│   ├── dubbo-java/          # Dubbo-Java server\n│   │   └── pom.xml\n│   └── grpc/                # gRPC server\n│       └── main.go\n├── proto/                   # Protocol definitions and generated code\n│   ├── benchmark.proto      # Protobuf definition\n│   ├── benchmark.pb.go      # Generated Go code\n│   ├── benchmark_grpc.pb.go # Generated gRPC code\n│   └── benchmark.triple.go  # Generated Triple code\n├── scripts/                 # Automation scripts\n│   ├── gen_code.sh          # Protobuf code generation\n│   ├── run_all.sh           # Run all benchmarks\n│   └── run_single.sh        # Run single benchmark\n├── config.yaml              # Benchmark configuration\n├── README.md                # English documentation\n└── README_CN.md             # Chinese documentation\n```\n\n## Configuration\n\nTest configuration is in `config.yaml`, including:\n\n- `payload_sizes`: Payload sizes (in bytes)\n- `serializations`: Serialization protocols\n- `compressions`: Compression strategies\n- `call_modes`: Call modes\n- `concurrency_levels`: Concurrency levels\n- `benchmark`: Benchmark parameters (warmup time, test duration, timeout)\n\n## Code Generation\n\nAfter modifying `proto/benchmark.proto`, regenerate code:\n\n```bash\n./scripts/gen_code.sh\n```\n\nThis script generates:\n- `benchmark.pb.go` - Protobuf basic code\n- `benchmark.triple.go` - Dubbo Triple protocol code\n- `benchmark_grpc.pb.go` - gRPC protocol code\n\n## Usage\n\n### Single Benchmark\n\n```bash\n# Using script\n./scripts/run_single.sh dubbo-go 1024 protobuf none 100 unary\n\n# Or run directly\ngo run client/main.go \\\n  --framework dubbo-go \\\n  --payload 1024 \\\n  --serialization protobuf \\\n  --compression none \\\n  --concurrency 100 \\\n  --mode unary\n```\n\n### Full Benchmark\n\n```bash\n./scripts/run_all.sh\n```\n\n## Command Line Parameters\n\n| Parameter | Description | Default |\n|-----------|-------------|---------|\n| `--framework` | Test framework | dubbo-go |\n| `--payload` | Payload size (bytes) | 1024 |\n| `--serialization` | Serialization protocol | protobuf |\n| `--compression` | Compression strategy | none |\n| `--concurrency` | Concurrency level | 100 |\n| `--mode` | Call mode | unary |\n| `--duration` | Test duration | 60s |\n| `--warmup` | Warmup duration | 10s |\n| `--addr` | Server address | Auto select |\n| `--pid` | Server PID (for system monitoring) | 0 |\n\n### Parameter Values\n\n| Parameter | Values |\n|-----------|--------|\n| `--framework` | dubbo-go / dubbo-java / grpc |\n| `--serialization` | hessian2 / protobuf / msgpack |\n| `--compression` | none / default / fastest |\n| `--mode` | unary / streaming |\n\n## Start Server Separately\n\n```bash\n# Dubbo-Go Server\ncd server/dubbo-go\ngo run main.go --serialization protobuf --compression none --port 20000\n\n# gRPC Server\ncd server/grpc\ngo run main.go --port 50051\n\n# Dubbo-Java Server\ncd server/dubbo-java\nmvn clean package\njava -jar target/benchmark-dubbo-java.jar\n```\n\n## Benchmark Report\n\n### Test Environment\n\n- **Go Version**: 1.25\n- **Java Version**: 8+\n- **Test Frameworks**: Dubbo-Go / Dubbo-Java / gRPC\n- **Test Date**: 2026-07-27\n- **Warmup Duration**: 10s\n- **Test Duration**: 60s per test case\n\n### Test Configuration\n\n| Parameter | Value |\n|-----------|-------|\n| Payload Size | 128B / 1KiB / 16KiB / 1MiB |\n| Serialization | protobuf / hessian2 / msgpack |\n| Compression | none / default / fastest |\n| Concurrency | 50 / 100 / 500 / 1000 / 2000 |\n| Call Mode | unary / streaming |\n\n### 128 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 19,732 | 18,560 | 106,648 |\n| 100 | 19,231 | 18,120 | 118,044 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.30 | 8.21 | 0.94 |\n| 100 | 6.37 | 12.50 | 1.61 |\n\n### 1024 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 17,563 | 16,830 | 93,172 |\n| 100 | 16,075 | 15,240 | 103,253 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.64 | 9.15 | 1.07 |\n| 100 | 7.27 | 14.80 | 1.72 |\n\n### 16384 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 9,461 | 8,720 | 43,339 |\n| 100 | 7,944 | 7,350 | 41,723 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 6.89 | 18.30 | 1.99 |\n| 100 | 21.32 | 35.60 | 3.67 |\n\n### 1048576 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347 | 486 | 1,431 |\n| 100 | 310 | 452 | 1,453 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347.29 | 285.40 | 59.81 |\n| 100 | 795.42 | 420.60 | 109.15 |\n\n### Resource Usage (128B Payload, 100 Concurrency)\n\n| Framework | CPU Avg (%) | Memory Peak (MB) |\n|-----------|-------------|------------------|\n| dubbo-go | 324.0 | 69.7 |\n| dubbo-java | 52.8 | 256.3 |\n| grpc | 415.7 | 34.3 |\n\n## Output Files\n\n### Data Files\n\nTest results are saved in `data/` directory with the naming format:\n```\n{framework}_{payload}_{serialization}_{compression}_{concurrency}_{mode}.json\n```\n\nJSON structure:\n```json\n{\n  \"framework\": \"dubbo-go\",\n  \"payload_size\": 1024,\n  \"serialization\": \"protobuf\",\n  \"compression\": \"none\",\n  \"concurrency\": 100,\n  \"call_mode\": \"unary\",\n  \"timestamp\": \"2026-07-23 15:00:00\",\n  \"qps\": 21450.0,\n  \"success_rate\": 99.99,\n  \"latency_p50_ms\": 4.65,\n  \"latency_p99_ms\": 5.53,\n  \"cpu_avg_percent\": 45.2,\n  \"memory_peak_mb\": 128.5\n}\n```\n\n### Log Files\n\nLogs are saved in `logs/` directory, including:\n- `{scenario}.log` - Client benchmark logs\n- `{scenario}.server.log` - Server runtime logs\n\n## Performance Optimization\n\n### Dubbo-Go Client Optimization\n\nFor best performance, Dubbo-Go client uses the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithClientNoCheck()` | Skip service check, reduce unnecessary overhead |\n| `MaxCallRecvMsgSize: 16MB` | Max receive message size for large payload tests |\n| `MaxCallSendMsgSize: 16MB` | Max send message size for large payload tests |\n\n### Dubbo-Go Server Optimization\n\nServer configuration includes the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithMaxServerRecvMsgSize(\"16MB\")` | Max receive message size |\n| `WithMaxServerSendMsgSize(\"16MB\")` | Max send message size |\n\n## License\n\nApache License 2.0\n","tools/dubbo-go-schema/README.md":"# dubbo-go-schema\n\nEnglish | [中文](README_CN.md)\n\n`dubbo-go-schema` provides the JSON Schema used by editors and YAML language servers to validate and complete Apache dubbo-go configuration files such as `dubbogo.yaml`, `dubbo.yaml`, and `application.yaml`.\n\nThe schema is maintained from the current `global/*_config.go` YAML tags and common dubbo-go configuration examples.\n\n## Files\n\n- `dubbo-go.json`: JSON Schema for dubbo-go YAML configuration.\n- `application.yaml`: example configuration that exercises common provider, consumer, Triple, metrics, tracing, logger, and shutdown settings.\n- `images/`: screenshots used by this README.\n\n## VS Code\n\nInstall a YAML language server extension, such as the Red Hat YAML extension, then add this to `settings.json`:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"https://raw.githubusercontent.com/apache/dubbo-go/develop/tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\nWhen testing local schema changes, point VS Code at the checked-out schema file instead:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"./tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\n## IntelliJ IDEA / GoLand\n\nOpen `Settings | Languages & Frameworks | Schemas and DTDs | JSON Schema Mappings`, add `dubbo-go.json`, and map it to the config file names you use.\n\n## Validate Locally\n\nAt minimum, verify that the schema is valid JSON:\n\n```bash\nnode -e \"JSON.parse(require('fs').readFileSync('tools/dubbo-go-schema/dubbo-go.json', 'utf8'))\"\n```\n\nFor editor validation, open `application.yaml` in VS Code or GoLand with the local schema mapping enabled. The schema expects dubbo-go v3 style configuration under the `dubbo:` root key.\n\n## Screenshots\n\n![GoLand schema mapping](images/img.png)\n\n![VS Code YAML schema mapping](images/vs-code.png)\n\n![Completion result](images/img_1.png)\n","tools/dubbogo-cli/README.md":"# dubbogo-cli\n\nEnglish | [中文](README_CN.md)\n\n`dubbogo-cli` is the command-line helper for the Apache dubbo-go toolchain. It can scaffold dubbo-go projects, install companion tools, inspect registry or metadata-center entries, and call Dubbo services during local debugging.\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/dubbogo-cli@latest\n```\n\nMake sure `$GOPATH/bin` or `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Commands\n\n```bash\ndubbogo-cli version\ndubbogo-cli install all\ndubbogo-cli install triple\ndubbogo-cli install triple-openapi\ndubbogo-cli install formatter\ndubbogo-cli newDemo .\ndubbogo-cli newApp .\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\ndubbogo-cli call --h localhost --p 20001 --proto dubbo --i com.example.UserProvider --method GetUser --sendObj ./request.json --recvObj ./response.json\ndubbogo-cli hessian --include ./\n```\n\n## Install Toolchain\n\n`dubbogo-cli install all` installs the companion tools used by current dubbo-go projects:\n\n- `protoc-gen-go-triple`: generates Triple client and server bindings.\n- `protoc-gen-triple-openapi`: generates OpenAPI v3 documents from Triple protobuf definitions.\n- `imports-formatter`: formats Go import blocks using dubbo-go import grouping rules.\n\nYou can install a single tool with `dubbogo-cli install triple`, `dubbogo-cli install triple-openapi`, or `dubbogo-cli install formatter`.\n\n## Create a Demo\n\n```bash\nmkdir hello-triple\ncd hello-triple\ndubbogo-cli newDemo .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- samples_api.proto\n|-- go-client\n|   `-- cmd\n|       `-- client.go\n|-- go-server\n|   `-- cmd\n|       `-- server.go\n`-- go.mod\n```\n\nRun the server:\n\n```bash\ngo run ./go-server/cmd\n```\n\nRun the client in another terminal:\n\n```bash\ngo run ./go-client/cmd\n```\n\nThe template keeps only protobuf source files in the scaffold. `make proto-gen` generates `*.pb.go` and `*.triple.go` files with `protoc-gen-go` and `protoc-gen-go-triple`.\n\n## Create an Application\n\n```bash\nmkdir dubbo-go-app\ncd dubbo-go-app\ndubbogo-cli newApp .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- api.proto\n|-- build\n|   `-- Dockerfile\n|-- chart\n|   |-- app\n|   `-- nacos_env\n|-- cmd\n|   `-- app.go\n|-- conf\n|   `-- dubbogo.yaml\n|-- go.mod\n`-- pkg\n    `-- service\n        `-- service.go\n```\n\nTypical workflow:\n\n1. Edit `api/api.proto`.\n2. Run `make proto-gen`.\n3. Run `go mod tidy`.\n4. Implement the service in `pkg/service`.\n5. Update image and Helm settings in `Makefile` and `chart/app/values.yaml`.\n6. Build, publish, and deploy with the provided Make targets.\n\nUseful Make targets:\n\n```bash\nmake proto-gen\nmake build\nmake buildx-publish\nmake deploy\nmake remove\n```\n\n## Inspect Registry and Metadata\n\nZookeeper registry:\n\n```bash\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\n```\n\nZookeeper metadata center:\n\n```bash\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\n```\n\nThe command prints registered interfaces and method names. Nacos and Istio support are not implemented yet.\n\n## Debug Dubbo Protocol Services\n\n`dubbogo-cli call` can invoke Dubbo protocol services with request and response shapes described as JSON files.\n\n```bash\ndubbogo-cli call \\\n  --h localhost \\\n  --p 20001 \\\n  --proto dubbo \\\n  --i com.example.UserProvider \\\n  --method GetUser \\\n  --sendObj ./request.json \\\n  --recvObj ./response.json\n```\n\nRequest fields use the form `type@value`, for example:\n\n```json\n{\n  \"ID\": \"string@A000\",\n  \"Male\": \"bool@true\",\n  \"JavaClassName\": \"string@com.example.CallUserStruct\"\n}\n```\n\nEvery Hessian object should provide a `JavaClassName` value that matches the provider-side type.\n\n## Debug Triple Services\n\nTriple services are compatible with the gRPC ecosystem. If reflection is enabled on the provider, `grpc_cli` can inspect and call services:\n\n```bash\ngrpc_cli ls localhost:20000 -l\ngrpc_cli type localhost:20000 org.apache.dubbo.samples.HelloRequest\ngrpc_cli call localhost:20000 SayHello \"name: 'laurence'\"\n```\n\nInstall `grpc_cli` from the gRPC project documentation.\n","tools/imports-formatter/README.md":"# imports-formatter\n\nEnglish | [中文](README_CN.md)\n\n`imports-formatter` rewrites Go import blocks using the grouping style used by dubbo-go.\n\nIt scans a Go module, skips generated files that contain `Code generated by`, and groups imports into:\n\n- Go standard library imports\n- third-party imports\n- current module imports\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/imports-formatter@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\nYou can also install it through `dubbogo-cli`:\n\n```bash\ndubbogo-cli install formatter\n```\n\n## Usage\n\nFormat the current module:\n\n```bash\nimports-formatter\n```\n\nFormat a specific module path:\n\n```bash\nimports-formatter --path /path/to/module\n```\n\nPass the module path explicitly when the target directory does not contain `go.mod`:\n\n```bash\nimports-formatter --path /path/to/module/subdir --module dubbo.apache.org/dubbo-go/v3\n```\n\nDisable blank lines between third-party import groups:\n\n```bash\nimports-formatter --bl=false\n```\n\n## Flags\n\n| Flag | Default | Description |\n| --- | --- | --- |\n| `--path` | current directory | Directory to scan recursively. |\n| `--module` | module from `go.mod` | Go module path used to identify internal imports. |\n| `--bl` | `true` | Whether to insert blank lines between third-party import groups. |\n\n## Notes\n\n`imports-formatter` edits files in place. Review the diff before committing.\n","tools/protoc-gen-go-triple/README.md":"# protoc-gen-go-triple\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-go-triple` is the protobuf compiler plugin that generates dubbo-go Triple client and server bindings.\n\nIt works together with `protoc-gen-go`: `protoc-gen-go` generates protobuf message types, and `protoc-gen-go-triple` generates Triple service interfaces, clients, handlers, and registration helpers.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- `protoc-gen-go`\n\nInstall `protoc-gen-go` if it is not already available:\n\n```bash\ngo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n```\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-go-triple@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative \\\n  ./api/greet.proto\n```\n\nFor `greet.proto`, the generated files are:\n\n- `greet.pb.go`: protobuf messages generated by `protoc-gen-go`\n- `greet.triple.go`: Triple bindings generated by `protoc-gen-go-triple`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n```\n\nThe protobuf `package` controls the Triple service name exposed on the wire. The `go_package` option controls the Go import path and package name for generated files.\n\n## Generated API\n\nCurrent generated code uses the dubbo-go v3 Triple API:\n\n```go\ngreeter, err := api.NewGreetService(cli)\n```\n\n```go\nerr := api.RegisterGreetServiceHandler(srv, &GreetServiceImpl{})\n```\n\nThe generated file suffix is `.triple.go`.\n\n## Legacy Compatibility\n\nFor dubbo-go 3.2.0 and later, use the default generator output.\n\nTo generate stubs compatible with older dubbo-go releases, pass `useOldVersion=true`:\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative,useOldVersion=true \\\n  ./api/greet.proto\n```\n\nThe old compatibility mode is retained for migration only. New projects should use the default output.\n","tools/protoc-gen-triple-openapi/README.md":"# protoc-gen-triple-openapi\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-triple-openapi` is a `protoc` plugin that generates OpenAPI v3 documents from protobuf services used with the Dubbo Triple protocol.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- protobuf files that define Triple services\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-triple-openapi@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\nGenerate YAML, the default format:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=yaml \\\n  ./api/greet.proto\n```\n\nGenerate JSON:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=json \\\n  ./api/greet.proto\n```\n\nGenerated file names use the input proto base name:\n\n- `greet.triple.openapi.yaml`\n- `greet.triple.openapi.json`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage org.apache.dubbo.samples.greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n```\n\n## Options\n\n| Option | Values | Default | Description |\n| --- | --- | --- | --- |\n| `format` | `yaml`, `json` | `yaml` | Output document format. |\n\n## Version\n\n```bash\nprotoc-gen-triple-openapi --version\n```\n","tools/protoc-gen-triple-openapi/example/greet.triple.openapi.json":"{\n  \"openapi\": \"3.0.1\",\n  \"info\": {\n    \"title\": \"Dubbo-go OpenAPI\",\n    \"description\": \"dubbo-go generate OpenAPI docs.\",\n    \"version\": \"v1\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://0.0.0.0:20000\",\n      \"description\": \"Dubbo-go Default Server\"\n    }\n  ],\n  \"paths\": {\n    \"/greet.GreetService/Greet\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"description\": \"Returns a greeting for a request.\",\n        \"operationId\": \"Greet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/greet.GreetService/GreetUser\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"operationId\": \"GreetUser\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetUserRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetUserResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"greet.GreetProfile\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"salutation\": {\n            \"type\": \"string\",\n            \"title\": \"salutation\"\n          }\n        },\n        \"title\": \"GreetProfile\"\n      },\n      \"greet.GreetRequest\": {\n        \"type\": \"object\",\n        \"allOf\": [\n          {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"not\": {\n                  \"anyOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientId\"\n                      ]\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientProfile\"\n                      ]\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientId\"\n                ]\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientProfile\"\n                ]\n              }\n            ]\n          }\n        ],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\",\n            \"description\": \"Name of the person to greet.\"\n          },\n          \"aliases\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"title\": \"aliases\",\n            \"description\": \"Alternative names for the person.\"\n          },\n          \"metadata\": {\n            \"type\": \"object\",\n            \"title\": \"metadata\",\n            \"additionalProperties\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Additional request metadata.\"\n          },\n          \"type\": {\n            \"title\": \"type\",\n            \"description\": \"Preferred greeting style.\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          },\n          \"profile\": {\n            \"title\": \"profile\",\n            \"description\": \"Profile details for the person.\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          },\n          \"types\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            },\n            \"title\": \"types\"\n          },\n          \"profiles\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            },\n            \"title\": \"profiles\"\n          },\n          \"profileMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"profile_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            }\n          },\n          \"typeMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"type_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            }\n          },\n          \"recipientId\": {\n            \"type\": \"string\",\n            \"title\": \"recipient_id\"\n          },\n          \"recipientProfile\": {\n            \"title\": \"recipient_profile\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"GreetRequest\",\n        \"description\": \"A request to the Greet RPC.\"\n      },\n      \"greet.GreetRequest.MetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"type\": \"string\",\n            \"title\": \"value\"\n          }\n        },\n        \"title\": \"MetadataEntry\"\n      },\n      \"greet.GreetRequest.ProfileMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"ProfileMetadataEntry\"\n      },\n      \"greet.GreetRequest.TypeMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          }\n        },\n        \"title\": \"TypeMetadataEntry\"\n      },\n      \"greet.GreetResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetResponse\"\n      },\n      \"greet.GreetUserRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\"\n          }\n        },\n        \"title\": \"GreetUserRequest\"\n      },\n      \"greet.GreetUserResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetUserResponse\"\n      },\n      \"greet.GreetingType\": {\n        \"type\": \"string\",\n        \"title\": \"GreetingType\",\n        \"enum\": [\n          \"GREETING_TYPE_UNSPECIFIED\",\n          \"GREETING_TYPE_FORMAL\"\n        ]\n      },\n      \"ErrorResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"description\": \"The status code.\"\n          },\n          \"message\": {\n            \"type\": \"string\",\n            \"description\": \"A developer-facing error message.\"\n          }\n        },\n        \"title\": \"ErrorResponse\",\n        \"description\": \"Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/\"\n      }\n    }\n  },\n  \"security\": [],\n  \"tags\": [\n    {\n      \"name\": \"greet.GreetService\",\n      \"description\": \"APIs for greeting users.\"\n    }\n  ]\n}","tools/protoc-gen-triple-openapi/example/greet.triple.openapi.yaml":"openapi: 3.0.1\ninfo:\n  title: Dubbo-go OpenAPI\n  description: dubbo-go generate OpenAPI docs.\n  version: v1\nservers:\n  - url: http://0.0.0.0:20000\n    description: Dubbo-go Default Server\npaths:\n  /greet.GreetService/Greet:\n    post:\n      tags:\n        - greet.GreetService\n      description: Returns a greeting for a request.\n      operationId: Greet\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n  /greet.GreetService/GreetUser:\n    post:\n      tags:\n        - greet.GreetService\n      operationId: GreetUser\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetUserRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetUserResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\ncomponents:\n  schemas:\n    greet.GreetProfile:\n      type: object\n      properties:\n        salutation:\n          type: string\n          title: salutation\n      title: GreetProfile\n    greet.GreetRequest:\n      type: object\n      allOf:\n        - oneOf:\n            - type: object\n              not:\n                anyOf:\n                  - type: object\n                    required:\n                      - recipientId\n                  - type: object\n                    required:\n                      - recipientProfile\n            - type: object\n              required:\n                - recipientId\n            - type: object\n              required:\n                - recipientProfile\n      properties:\n        name:\n          type: string\n          title: name\n          description: Name of the person to greet.\n        aliases:\n          type: array\n          items:\n            type: string\n          title: aliases\n          description: Alternative names for the person.\n        metadata:\n          type: object\n          title: metadata\n          additionalProperties:\n            type: string\n          description: Additional request metadata.\n        type:\n          title: type\n          description: Preferred greeting style.\n          $ref: '#/components/schemas/greet.GreetingType'\n        profile:\n          title: profile\n          description: Profile details for the person.\n          $ref: '#/components/schemas/greet.GreetProfile'\n        types:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetingType'\n          title: types\n        profiles:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetProfile'\n          title: profiles\n        profileMetadata:\n          type: object\n          title: profile_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetProfile'\n        typeMetadata:\n          type: object\n          title: type_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetingType'\n        recipientId:\n          type: string\n          title: recipient_id\n        recipientProfile:\n          title: recipient_profile\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: GreetRequest\n      description: A request to the Greet RPC.\n    greet.GreetRequest.MetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          type: string\n          title: value\n      title: MetadataEntry\n    greet.GreetRequest.ProfileMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: ProfileMetadataEntry\n    greet.GreetRequest.TypeMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetingType'\n      title: TypeMetadataEntry\n    greet.GreetResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetResponse\n    greet.GreetUserRequest:\n      type: object\n      properties:\n        name:\n          type: string\n          title: name\n      title: GreetUserRequest\n    greet.GreetUserResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetUserResponse\n    greet.GreetingType:\n      type: string\n      title: GreetingType\n      enum:\n        - GREETING_TYPE_UNSPECIFIED\n        - GREETING_TYPE_FORMAL\n    ErrorResponse:\n      type: object\n      properties:\n        status:\n          type: string\n          description: The status code.\n        message:\n          type: string\n          description: A developer-facing error message.\n      title: ErrorResponse\n      description: 'Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/'\nsecurity: []\ntags:\n  - name: greet.GreetService\n    description: APIs for greeting users.\n"},"files":{"tools/benchmark/README.md":"# Dubbo-Go Benchmark Suite\n\nEnglish | [中文](README_CN.md)\n\nPerformance benchmark suite for comparing **Dubbo-Go / Dubbo-Java / gRPC** frameworks.\n\n## Environment Requirements\n\n- **Go**: 1.23+\n- **Java**: 8+\n- **Maven**: 3.6+\n- **protoc**: 3.0+\n\n## Default Port Configuration\n\n| Framework | Default Port |\n|-----------|-------------|\n| Dubbo-Go | 20000 |\n| Dubbo-Java | 20001 |\n| gRPC | 50051 |\n\n## Directory Structure\n\n```\ntools/benchmark\n├── client/                  # Benchmark client\n│   ├── main.go              # Entry point\n│   ├── clients/             # Client implementations\n│   │   ├── dubbo_client.go  # Dubbo-Go client\n│   │   └── grpc_client.go   # gRPC client\n│   ├── engine/              # Benchmark engine\n│   │   ├── engine.go        # Engine logic\n│   │   ├── statistics.go    # Statistics calculation\n│   │   └── metrics.go       # Metrics collection\n│   ├── monitor/             # System monitor\n│   │   └── system_monitor.go # CPU/Memory monitor\n│   └── payload/             # Payload generator\n│       └── payload.go       # Random payload generator\n├── server/                  # Server demos\n│   ├── dubbo-go/            # Dubbo-Go server\n│   │   └── main.go\n│   ├── dubbo-java/          # Dubbo-Java server\n│   │   └── pom.xml\n│   └── grpc/                # gRPC server\n│       └── main.go\n├── proto/                   # Protocol definitions and generated code\n│   ├── benchmark.proto      # Protobuf definition\n│   ├── benchmark.pb.go      # Generated Go code\n│   ├── benchmark_grpc.pb.go # Generated gRPC code\n│   └── benchmark.triple.go  # Generated Triple code\n├── scripts/                 # Automation scripts\n│   ├── gen_code.sh          # Protobuf code generation\n│   ├── run_all.sh           # Run all benchmarks\n│   └── run_single.sh        # Run single benchmark\n├── config.yaml              # Benchmark configuration\n├── README.md                # English documentation\n└── README_CN.md             # Chinese documentation\n```\n\n## Configuration\n\nTest configuration is in `config.yaml`, including:\n\n- `payload_sizes`: Payload sizes (in bytes)\n- `serializations`: Serialization protocols\n- `compressions`: Compression strategies\n- `call_modes`: Call modes\n- `concurrency_levels`: Concurrency levels\n- `benchmark`: Benchmark parameters (warmup time, test duration, timeout)\n\n## Code Generation\n\nAfter modifying `proto/benchmark.proto`, regenerate code:\n\n```bash\n./scripts/gen_code.sh\n```\n\nThis script generates:\n- `benchmark.pb.go` - Protobuf basic code\n- `benchmark.triple.go` - Dubbo Triple protocol code\n- `benchmark_grpc.pb.go` - gRPC protocol code\n\n## Usage\n\n### Single Benchmark\n\n```bash\n# Using script\n./scripts/run_single.sh dubbo-go 1024 protobuf none 100 unary\n\n# Or run directly\ngo run client/main.go \\\n  --framework dubbo-go \\\n  --payload 1024 \\\n  --serialization protobuf \\\n  --compression none \\\n  --concurrency 100 \\\n  --mode unary\n```\n\n### Full Benchmark\n\n```bash\n./scripts/run_all.sh\n```\n\n## Command Line Parameters\n\n| Parameter | Description | Default |\n|-----------|-------------|---------|\n| `--framework` | Test framework | dubbo-go |\n| `--payload` | Payload size (bytes) | 1024 |\n| `--serialization` | Serialization protocol | protobuf |\n| `--compression` | Compression strategy | none |\n| `--concurrency` | Concurrency level | 100 |\n| `--mode` | Call mode | unary |\n| `--duration` | Test duration | 60s |\n| `--warmup` | Warmup duration | 10s |\n| `--addr` | Server address | Auto select |\n| `--pid` | Server PID (for system monitoring) | 0 |\n\n### Parameter Values\n\n| Parameter | Values |\n|-----------|--------|\n| `--framework` | dubbo-go / dubbo-java / grpc |\n| `--serialization` | hessian2 / protobuf / msgpack |\n| `--compression` | none / default / fastest |\n| `--mode` | unary / streaming |\n\n## Start Server Separately\n\n```bash\n# Dubbo-Go Server\ncd server/dubbo-go\ngo run main.go --serialization protobuf --compression none --port 20000\n\n# gRPC Server\ncd server/grpc\ngo run main.go --port 50051\n\n# Dubbo-Java Server\ncd server/dubbo-java\nmvn clean package\njava -jar target/benchmark-dubbo-java.jar\n```\n\n## Benchmark Report\n\n### Test Environment\n\n- **Go Version**: 1.25\n- **Java Version**: 8+\n- **Test Frameworks**: Dubbo-Go / Dubbo-Java / gRPC\n- **Test Date**: 2026-07-27\n- **Warmup Duration**: 10s\n- **Test Duration**: 60s per test case\n\n### Test Configuration\n\n| Parameter | Value |\n|-----------|-------|\n| Payload Size | 128B / 1KiB / 16KiB / 1MiB |\n| Serialization | protobuf / hessian2 / msgpack |\n| Compression | none / default / fastest |\n| Concurrency | 50 / 100 / 500 / 1000 / 2000 |\n| Call Mode | unary / streaming |\n\n### 128 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 19,732 | 18,560 | 106,648 |\n| 100 | 19,231 | 18,120 | 118,044 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.30 | 8.21 | 0.94 |\n| 100 | 6.37 | 12.50 | 1.61 |\n\n### 1024 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 17,563 | 16,830 | 93,172 |\n| 100 | 16,075 | 15,240 | 103,253 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.64 | 9.15 | 1.07 |\n| 100 | 7.27 | 14.80 | 1.72 |\n\n### 16384 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 9,461 | 8,720 | 43,339 |\n| 100 | 7,944 | 7,350 | 41,723 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 6.89 | 18.30 | 1.99 |\n| 100 | 21.32 | 35.60 | 3.67 |\n\n### 1048576 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347 | 486 | 1,431 |\n| 100 | 310 | 452 | 1,453 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347.29 | 285.40 | 59.81 |\n| 100 | 795.42 | 420.60 | 109.15 |\n\n### Resource Usage (128B Payload, 100 Concurrency)\n\n| Framework | CPU Avg (%) | Memory Peak (MB) |\n|-----------|-------------|------------------|\n| dubbo-go | 324.0 | 69.7 |\n| dubbo-java | 52.8 | 256.3 |\n| grpc | 415.7 | 34.3 |\n\n## Output Files\n\n### Data Files\n\nTest results are saved in `data/` directory with the naming format:\n```\n{framework}_{payload}_{serialization}_{compression}_{concurrency}_{mode}.json\n```\n\nJSON structure:\n```json\n{\n  \"framework\": \"dubbo-go\",\n  \"payload_size\": 1024,\n  \"serialization\": \"protobuf\",\n  \"compression\": \"none\",\n  \"concurrency\": 100,\n  \"call_mode\": \"unary\",\n  \"timestamp\": \"2026-07-23 15:00:00\",\n  \"qps\": 21450.0,\n  \"success_rate\": 99.99,\n  \"latency_p50_ms\": 4.65,\n  \"latency_p99_ms\": 5.53,\n  \"cpu_avg_percent\": 45.2,\n  \"memory_peak_mb\": 128.5\n}\n```\n\n### Log Files\n\nLogs are saved in `logs/` directory, including:\n- `{scenario}.log` - Client benchmark logs\n- `{scenario}.server.log` - Server runtime logs\n\n## Performance Optimization\n\n### Dubbo-Go Client Optimization\n\nFor best performance, Dubbo-Go client uses the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithClientNoCheck()` | Skip service check, reduce unnecessary overhead |\n| `MaxCallRecvMsgSize: 16MB` | Max receive message size for large payload tests |\n| `MaxCallSendMsgSize: 16MB` | Max send message size for large payload tests |\n\n### Dubbo-Go Server Optimization\n\nServer configuration includes the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithMaxServerRecvMsgSize(\"16MB\")` | Max receive message size |\n| `WithMaxServerSendMsgSize(\"16MB\")` | Max send message size |\n\n## License\n\nApache License 2.0\n","tools/dubbo-go-schema/README.md":"# dubbo-go-schema\n\nEnglish | [中文](README_CN.md)\n\n`dubbo-go-schema` provides the JSON Schema used by editors and YAML language servers to validate and complete Apache dubbo-go configuration files such as `dubbogo.yaml`, `dubbo.yaml`, and `application.yaml`.\n\nThe schema is maintained from the current `global/*_config.go` YAML tags and common dubbo-go configuration examples.\n\n## Files\n\n- `dubbo-go.json`: JSON Schema for dubbo-go YAML configuration.\n- `application.yaml`: example configuration that exercises common provider, consumer, Triple, metrics, tracing, logger, and shutdown settings.\n- `images/`: screenshots used by this README.\n\n## VS Code\n\nInstall a YAML language server extension, such as the Red Hat YAML extension, then add this to `settings.json`:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"https://raw.githubusercontent.com/apache/dubbo-go/develop/tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\nWhen testing local schema changes, point VS Code at the checked-out schema file instead:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"./tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\n## IntelliJ IDEA / GoLand\n\nOpen `Settings | Languages & Frameworks | Schemas and DTDs | JSON Schema Mappings`, add `dubbo-go.json`, and map it to the config file names you use.\n\n## Validate Locally\n\nAt minimum, verify that the schema is valid JSON:\n\n```bash\nnode -e \"JSON.parse(require('fs').readFileSync('tools/dubbo-go-schema/dubbo-go.json', 'utf8'))\"\n```\n\nFor editor validation, open `application.yaml` in VS Code or GoLand with the local schema mapping enabled. The schema expects dubbo-go v3 style configuration under the `dubbo:` root key.\n\n## Screenshots\n\n![GoLand schema mapping](images/img.png)\n\n![VS Code YAML schema mapping](images/vs-code.png)\n\n![Completion result](images/img_1.png)\n","tools/dubbogo-cli/README.md":"# dubbogo-cli\n\nEnglish | [中文](README_CN.md)\n\n`dubbogo-cli` is the command-line helper for the Apache dubbo-go toolchain. It can scaffold dubbo-go projects, install companion tools, inspect registry or metadata-center entries, and call Dubbo services during local debugging.\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/dubbogo-cli@latest\n```\n\nMake sure `$GOPATH/bin` or `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Commands\n\n```bash\ndubbogo-cli version\ndubbogo-cli install all\ndubbogo-cli install triple\ndubbogo-cli install triple-openapi\ndubbogo-cli install formatter\ndubbogo-cli newDemo .\ndubbogo-cli newApp .\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\ndubbogo-cli call --h localhost --p 20001 --proto dubbo --i com.example.UserProvider --method GetUser --sendObj ./request.json --recvObj ./response.json\ndubbogo-cli hessian --include ./\n```\n\n## Install Toolchain\n\n`dubbogo-cli install all` installs the companion tools used by current dubbo-go projects:\n\n- `protoc-gen-go-triple`: generates Triple client and server bindings.\n- `protoc-gen-triple-openapi`: generates OpenAPI v3 documents from Triple protobuf definitions.\n- `imports-formatter`: formats Go import blocks using dubbo-go import grouping rules.\n\nYou can install a single tool with `dubbogo-cli install triple`, `dubbogo-cli install triple-openapi`, or `dubbogo-cli install formatter`.\n\n## Create a Demo\n\n```bash\nmkdir hello-triple\ncd hello-triple\ndubbogo-cli newDemo .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- samples_api.proto\n|-- go-client\n|   `-- cmd\n|       `-- client.go\n|-- go-server\n|   `-- cmd\n|       `-- server.go\n`-- go.mod\n```\n\nRun the server:\n\n```bash\ngo run ./go-server/cmd\n```\n\nRun the client in another terminal:\n\n```bash\ngo run ./go-client/cmd\n```\n\nThe template keeps only protobuf source files in the scaffold. `make proto-gen` generates `*.pb.go` and `*.triple.go` files with `protoc-gen-go` and `protoc-gen-go-triple`.\n\n## Create an Application\n\n```bash\nmkdir dubbo-go-app\ncd dubbo-go-app\ndubbogo-cli newApp .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- api.proto\n|-- build\n|   `-- Dockerfile\n|-- chart\n|   |-- app\n|   `-- nacos_env\n|-- cmd\n|   `-- app.go\n|-- conf\n|   `-- dubbogo.yaml\n|-- go.mod\n`-- pkg\n    `-- service\n        `-- service.go\n```\n\nTypical workflow:\n\n1. Edit `api/api.proto`.\n2. Run `make proto-gen`.\n3. Run `go mod tidy`.\n4. Implement the service in `pkg/service`.\n5. Update image and Helm settings in `Makefile` and `chart/app/values.yaml`.\n6. Build, publish, and deploy with the provided Make targets.\n\nUseful Make targets:\n\n```bash\nmake proto-gen\nmake build\nmake buildx-publish\nmake deploy\nmake remove\n```\n\n## Inspect Registry and Metadata\n\nZookeeper registry:\n\n```bash\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\n```\n\nZookeeper metadata center:\n\n```bash\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\n```\n\nThe command prints registered interfaces and method names. Nacos and Istio support are not implemented yet.\n\n## Debug Dubbo Protocol Services\n\n`dubbogo-cli call` can invoke Dubbo protocol services with request and response shapes described as JSON files.\n\n```bash\ndubbogo-cli call \\\n  --h localhost \\\n  --p 20001 \\\n  --proto dubbo \\\n  --i com.example.UserProvider \\\n  --method GetUser \\\n  --sendObj ./request.json \\\n  --recvObj ./response.json\n```\n\nRequest fields use the form `type@value`, for example:\n\n```json\n{\n  \"ID\": \"string@A000\",\n  \"Male\": \"bool@true\",\n  \"JavaClassName\": \"string@com.example.CallUserStruct\"\n}\n```\n\nEvery Hessian object should provide a `JavaClassName` value that matches the provider-side type.\n\n## Debug Triple Services\n\nTriple services are compatible with the gRPC ecosystem. If reflection is enabled on the provider, `grpc_cli` can inspect and call services:\n\n```bash\ngrpc_cli ls localhost:20000 -l\ngrpc_cli type localhost:20000 org.apache.dubbo.samples.HelloRequest\ngrpc_cli call localhost:20000 SayHello \"name: 'laurence'\"\n```\n\nInstall `grpc_cli` from the gRPC project documentation.\n","tools/imports-formatter/README.md":"# imports-formatter\n\nEnglish | [中文](README_CN.md)\n\n`imports-formatter` rewrites Go import blocks using the grouping style used by dubbo-go.\n\nIt scans a Go module, skips generated files that contain `Code generated by`, and groups imports into:\n\n- Go standard library imports\n- third-party imports\n- current module imports\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/imports-formatter@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\nYou can also install it through `dubbogo-cli`:\n\n```bash\ndubbogo-cli install formatter\n```\n\n## Usage\n\nFormat the current module:\n\n```bash\nimports-formatter\n```\n\nFormat a specific module path:\n\n```bash\nimports-formatter --path /path/to/module\n```\n\nPass the module path explicitly when the target directory does not contain `go.mod`:\n\n```bash\nimports-formatter --path /path/to/module/subdir --module dubbo.apache.org/dubbo-go/v3\n```\n\nDisable blank lines between third-party import groups:\n\n```bash\nimports-formatter --bl=false\n```\n\n## Flags\n\n| Flag | Default | Description |\n| --- | --- | --- |\n| `--path` | current directory | Directory to scan recursively. |\n| `--module` | module from `go.mod` | Go module path used to identify internal imports. |\n| `--bl` | `true` | Whether to insert blank lines between third-party import groups. |\n\n## Notes\n\n`imports-formatter` edits files in place. Review the diff before committing.\n","tools/protoc-gen-go-triple/README.md":"# protoc-gen-go-triple\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-go-triple` is the protobuf compiler plugin that generates dubbo-go Triple client and server bindings.\n\nIt works together with `protoc-gen-go`: `protoc-gen-go` generates protobuf message types, and `protoc-gen-go-triple` generates Triple service interfaces, clients, handlers, and registration helpers.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- `protoc-gen-go`\n\nInstall `protoc-gen-go` if it is not already available:\n\n```bash\ngo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n```\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-go-triple@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative \\\n  ./api/greet.proto\n```\n\nFor `greet.proto`, the generated files are:\n\n- `greet.pb.go`: protobuf messages generated by `protoc-gen-go`\n- `greet.triple.go`: Triple bindings generated by `protoc-gen-go-triple`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n```\n\nThe protobuf `package` controls the Triple service name exposed on the wire. The `go_package` option controls the Go import path and package name for generated files.\n\n## Generated API\n\nCurrent generated code uses the dubbo-go v3 Triple API:\n\n```go\ngreeter, err := api.NewGreetService(cli)\n```\n\n```go\nerr := api.RegisterGreetServiceHandler(srv, &GreetServiceImpl{})\n```\n\nThe generated file suffix is `.triple.go`.\n\n## Legacy Compatibility\n\nFor dubbo-go 3.2.0 and later, use the default generator output.\n\nTo generate stubs compatible with older dubbo-go releases, pass `useOldVersion=true`:\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative,useOldVersion=true \\\n  ./api/greet.proto\n```\n\nThe old compatibility mode is retained for migration only. New projects should use the default output.\n","tools/protoc-gen-triple-openapi/README.md":"# protoc-gen-triple-openapi\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-triple-openapi` is a `protoc` plugin that generates OpenAPI v3 documents from protobuf services used with the Dubbo Triple protocol.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- protobuf files that define Triple services\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-triple-openapi@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\nGenerate YAML, the default format:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=yaml \\\n  ./api/greet.proto\n```\n\nGenerate JSON:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=json \\\n  ./api/greet.proto\n```\n\nGenerated file names use the input proto base name:\n\n- `greet.triple.openapi.yaml`\n- `greet.triple.openapi.json`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage org.apache.dubbo.samples.greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n```\n\n## Options\n\n| Option | Values | Default | Description |\n| --- | --- | --- | --- |\n| `format` | `yaml`, `json` | `yaml` | Output document format. |\n\n## Version\n\n```bash\nprotoc-gen-triple-openapi --version\n```\n","tools/protoc-gen-triple-openapi/example/greet.triple.openapi.json":"{\n  \"openapi\": \"3.0.1\",\n  \"info\": {\n    \"title\": \"Dubbo-go OpenAPI\",\n    \"description\": \"dubbo-go generate OpenAPI docs.\",\n    \"version\": \"v1\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://0.0.0.0:20000\",\n      \"description\": \"Dubbo-go Default Server\"\n    }\n  ],\n  \"paths\": {\n    \"/greet.GreetService/Greet\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"description\": \"Returns a greeting for a request.\",\n        \"operationId\": \"Greet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/greet.GreetService/GreetUser\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"operationId\": \"GreetUser\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetUserRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetUserResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"greet.GreetProfile\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"salutation\": {\n            \"type\": \"string\",\n            \"title\": \"salutation\"\n          }\n        },\n        \"title\": \"GreetProfile\"\n      },\n      \"greet.GreetRequest\": {\n        \"type\": \"object\",\n        \"allOf\": [\n          {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"not\": {\n                  \"anyOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientId\"\n                      ]\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientProfile\"\n                      ]\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientId\"\n                ]\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientProfile\"\n                ]\n              }\n            ]\n          }\n        ],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\",\n            \"description\": \"Name of the person to greet.\"\n          },\n          \"aliases\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"title\": \"aliases\",\n            \"description\": \"Alternative names for the person.\"\n          },\n          \"metadata\": {\n            \"type\": \"object\",\n            \"title\": \"metadata\",\n            \"additionalProperties\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Additional request metadata.\"\n          },\n          \"type\": {\n            \"title\": \"type\",\n            \"description\": \"Preferred greeting style.\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          },\n          \"profile\": {\n            \"title\": \"profile\",\n            \"description\": \"Profile details for the person.\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          },\n          \"types\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            },\n            \"title\": \"types\"\n          },\n          \"profiles\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            },\n            \"title\": \"profiles\"\n          },\n          \"profileMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"profile_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            }\n          },\n          \"typeMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"type_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            }\n          },\n          \"recipientId\": {\n            \"type\": \"string\",\n            \"title\": \"recipient_id\"\n          },\n          \"recipientProfile\": {\n            \"title\": \"recipient_profile\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"GreetRequest\",\n        \"description\": \"A request to the Greet RPC.\"\n      },\n      \"greet.GreetRequest.MetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"type\": \"string\",\n            \"title\": \"value\"\n          }\n        },\n        \"title\": \"MetadataEntry\"\n      },\n      \"greet.GreetRequest.ProfileMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"ProfileMetadataEntry\"\n      },\n      \"greet.GreetRequest.TypeMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          }\n        },\n        \"title\": \"TypeMetadataEntry\"\n      },\n      \"greet.GreetResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetResponse\"\n      },\n      \"greet.GreetUserRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\"\n          }\n        },\n        \"title\": \"GreetUserRequest\"\n      },\n      \"greet.GreetUserResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetUserResponse\"\n      },\n      \"greet.GreetingType\": {\n        \"type\": \"string\",\n        \"title\": \"GreetingType\",\n        \"enum\": [\n          \"GREETING_TYPE_UNSPECIFIED\",\n          \"GREETING_TYPE_FORMAL\"\n        ]\n      },\n      \"ErrorResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"description\": \"The status code.\"\n          },\n          \"message\": {\n            \"type\": \"string\",\n            \"description\": \"A developer-facing error message.\"\n          }\n        },\n        \"title\": \"ErrorResponse\",\n        \"description\": \"Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/\"\n      }\n    }\n  },\n  \"security\": [],\n  \"tags\": [\n    {\n      \"name\": \"greet.GreetService\",\n      \"description\": \"APIs for greeting users.\"\n    }\n  ]\n}","tools/protoc-gen-triple-openapi/example/greet.triple.openapi.yaml":"openapi: 3.0.1\ninfo:\n  title: Dubbo-go OpenAPI\n  description: dubbo-go generate OpenAPI docs.\n  version: v1\nservers:\n  - url: http://0.0.0.0:20000\n    description: Dubbo-go Default Server\npaths:\n  /greet.GreetService/Greet:\n    post:\n      tags:\n        - greet.GreetService\n      description: Returns a greeting for a request.\n      operationId: Greet\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n  /greet.GreetService/GreetUser:\n    post:\n      tags:\n        - greet.GreetService\n      operationId: GreetUser\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetUserRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetUserResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\ncomponents:\n  schemas:\n    greet.GreetProfile:\n      type: object\n      properties:\n        salutation:\n          type: string\n          title: salutation\n      title: GreetProfile\n    greet.GreetRequest:\n      type: object\n      allOf:\n        - oneOf:\n            - type: object\n              not:\n                anyOf:\n                  - type: object\n                    required:\n                      - recipientId\n                  - type: object\n                    required:\n                      - recipientProfile\n            - type: object\n              required:\n                - recipientId\n            - type: object\n              required:\n                - recipientProfile\n      properties:\n        name:\n          type: string\n          title: name\n          description: Name of the person to greet.\n        aliases:\n          type: array\n          items:\n            type: string\n          title: aliases\n          description: Alternative names for the person.\n        metadata:\n          type: object\n          title: metadata\n          additionalProperties:\n            type: string\n          description: Additional request metadata.\n        type:\n          title: type\n          description: Preferred greeting style.\n          $ref: '#/components/schemas/greet.GreetingType'\n        profile:\n          title: profile\n          description: Profile details for the person.\n          $ref: '#/components/schemas/greet.GreetProfile'\n        types:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetingType'\n          title: types\n        profiles:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetProfile'\n          title: profiles\n        profileMetadata:\n          type: object\n          title: profile_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetProfile'\n        typeMetadata:\n          type: object\n          title: type_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetingType'\n        recipientId:\n          type: string\n          title: recipient_id\n        recipientProfile:\n          title: recipient_profile\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: GreetRequest\n      description: A request to the Greet RPC.\n    greet.GreetRequest.MetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          type: string\n          title: value\n      title: MetadataEntry\n    greet.GreetRequest.ProfileMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: ProfileMetadataEntry\n    greet.GreetRequest.TypeMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetingType'\n      title: TypeMetadataEntry\n    greet.GreetResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetResponse\n    greet.GreetUserRequest:\n      type: object\n      properties:\n        name:\n          type: string\n          title: name\n      title: GreetUserRequest\n    greet.GreetUserResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetUserResponse\n    greet.GreetingType:\n      type: string\n      title: GreetingType\n      enum:\n        - GREETING_TYPE_UNSPECIFIED\n        - GREETING_TYPE_FORMAL\n    ErrorResponse:\n      type: object\n      properties:\n        status:\n          type: string\n          description: The status code.\n        message:\n          type: string\n          description: A developer-facing error message.\n      title: ErrorResponse\n      description: 'Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/'\nsecurity: []\ntags:\n  - name: greet.GreetService\n    description: APIs for greeting users.\n"},"items":[{"name":"greet.triple.openapi.json","path":"tools/protoc-gen-triple-openapi/example/greet.triple.openapi.json","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/protoc-gen-triple-openapi/example/greet.triple.openapi.json","title":"Example Skill","category":"anthropic-skill","format":"json","content":"{\n  \"openapi\": \"3.0.1\",\n  \"info\": {\n    \"title\": \"Dubbo-go OpenAPI\",\n    \"description\": \"dubbo-go generate OpenAPI docs.\",\n    \"version\": \"v1\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://0.0.0.0:20000\",\n      \"description\": \"Dubbo-go Default Server\"\n    }\n  ],\n  \"paths\": {\n    \"/greet.GreetService/Greet\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"description\": \"Returns a greeting for a request.\",\n        \"operationId\": \"Greet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/greet.GreetService/GreetUser\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"operationId\": \"GreetUser\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetUserRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetUserResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"greet.GreetProfile\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"salutation\": {\n            \"type\": \"string\",\n            \"title\": \"salutation\"\n          }\n        },\n        \"title\": \"GreetProfile\"\n      },\n      \"greet.GreetRequest\": {\n        \"type\": \"object\",\n        \"allOf\": [\n          {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"not\": {\n                  \"anyOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientId\"\n                      ]\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientProfile\"\n                      ]\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientId\"\n                ]\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientProfile\"\n                ]\n              }\n            ]\n          }\n        ],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\",\n            \"description\": \"Name of the person to greet.\"\n          },\n          \"aliases\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"title\": \"aliases\",\n            \"description\": \"Alternative names for the person.\"\n          },\n          \"metadata\": {\n            \"type\": \"object\",\n            \"title\": \"metadata\",\n            \"additionalProperties\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Additional request metadata.\"\n          },\n          \"type\": {\n            \"title\": \"type\",\n            \"description\": \"Preferred greeting style.\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          },\n          \"profile\": {\n            \"title\": \"profile\",\n            \"description\": \"Profile details for the person.\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          },\n          \"types\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            },\n            \"title\": \"types\"\n          },\n          \"profiles\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            },\n            \"title\": \"profiles\"\n          },\n          \"profileMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"profile_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            }\n          },\n          \"typeMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"type_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            }\n          },\n          \"recipientId\": {\n            \"type\": \"string\",\n            \"title\": \"recipient_id\"\n          },\n          \"recipientProfile\": {\n            \"title\": \"recipient_profile\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"GreetRequest\",\n        \"description\": \"A request to the Greet RPC.\"\n      },\n      \"greet.GreetRequest.MetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"type\": \"string\",\n            \"title\": \"value\"\n          }\n        },\n        \"title\": \"MetadataEntry\"\n      },\n      \"greet.GreetRequest.ProfileMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"ProfileMetadataEntry\"\n      },\n      \"greet.GreetRequest.TypeMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          }\n        },\n        \"title\": \"TypeMetadataEntry\"\n      },\n      \"greet.GreetResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetResponse\"\n      },\n      \"greet.GreetUserRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\"\n          }\n        },\n        \"title\": \"GreetUserRequest\"\n      },\n      \"greet.GreetUserResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetUserResponse\"\n      },\n      \"greet.GreetingType\": {\n        \"type\": \"string\",\n        \"title\": \"GreetingType\",\n        \"enum\": [\n          \"GREETING_TYPE_UNSPECIFIED\",\n          \"GREETING_TYPE_FORMAL\"\n        ]\n      },\n      \"ErrorResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"description\": \"The status code.\"\n          },\n          \"message\": {\n            \"type\": \"string\",\n            \"description\": \"A developer-facing error message.\"\n          }\n        },\n        \"title\": \"ErrorResponse\",\n        \"description\": \"Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/\"\n      }\n    }\n  },\n  \"security\": [],\n  \"tags\": [\n    {\n      \"name\": \"greet.GreetService\",\n      \"description\": \"APIs for greeting users.\"\n    }\n  ]\n}","frontmatter":{"openapi":"3.0.1","info":{"title":"Dubbo-go OpenAPI","description":"dubbo-go generate OpenAPI docs.","version":"v1"},"servers":[{"url":"http://0.0.0.0:20000","description":"Dubbo-go Default Server"}],"paths":{"/greet.GreetService/Greet":{"post":{"tags":["greet.GreetService"],"description":"Returns a greeting for a request.","operationId":"Greet","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/greet.GreetRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/greet.GreetResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/greet.GreetService/GreetUser":{"post":{"tags":["greet.GreetService"],"operationId":"GreetUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/greet.GreetUserRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/greet.GreetUserResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"greet.GreetProfile":{"type":"object","properties":{"salutation":{"type":"string","title":"salutation"}},"title":"GreetProfile"},"greet.GreetRequest":{"type":"object","allOf":[{"oneOf":[{"type":"object","not":{"anyOf":[{"type":"object","required":["recipientId"]},{"type":"object","required":["recipientProfile"]}]}},{"type":"object","required":["recipientId"]},{"type":"object","required":["recipientProfile"]}]}],"properties":{"name":{"type":"string","title":"name","description":"Name of the person to greet."},"aliases":{"type":"array","items":{"type":"string"},"title":"aliases","description":"Alternative names for the person."},"metadata":{"type":"object","title":"metadata","additionalProperties":{"type":"string"},"description":"Additional request metadata."},"type":{"title":"type","description":"Preferred greeting style.","$ref":"#/components/schemas/greet.GreetingType"},"profile":{"title":"profile","description":"Profile details for the person.","$ref":"#/components/schemas/greet.GreetProfile"},"types":{"type":"array","items":{"$ref":"#/components/schemas/greet.GreetingType"},"title":"types"},"profiles":{"type":"array","items":{"$ref":"#/components/schemas/greet.GreetProfile"},"title":"profiles"},"profileMetadata":{"type":"object","title":"profile_metadata","additionalProperties":{"$ref":"#/components/schemas/greet.GreetProfile"}},"typeMetadata":{"type":"object","title":"type_metadata","additionalProperties":{"$ref":"#/components/schemas/greet.GreetingType"}},"recipientId":{"type":"string","title":"recipient_id"},"recipientProfile":{"title":"recipient_profile","$ref":"#/components/schemas/greet.GreetProfile"}},"title":"GreetRequest","description":"A request to the Greet RPC."},"greet.GreetRequest.MetadataEntry":{"type":"object","properties":{"key":{"type":"string","title":"key"},"value":{"type":"string","title":"value"}},"title":"MetadataEntry"},"greet.GreetRequest.ProfileMetadataEntry":{"type":"object","properties":{"key":{"type":"string","title":"key"},"value":{"title":"value","$ref":"#/components/schemas/greet.GreetProfile"}},"title":"ProfileMetadataEntry"},"greet.GreetRequest.TypeMetadataEntry":{"type":"object","properties":{"key":{"type":"string","title":"key"},"value":{"title":"value","$ref":"#/components/schemas/greet.GreetingType"}},"title":"TypeMetadataEntry"},"greet.GreetResponse":{"type":"object","properties":{"greeting":{"type":"string","title":"greeting"}},"title":"GreetResponse"},"greet.GreetUserRequest":{"type":"object","properties":{"name":{"type":"string","title":"name"}},"title":"GreetUserRequest"},"greet.GreetUserResponse":{"type":"object","properties":{"greeting":{"type":"string","title":"greeting"}},"title":"GreetUserResponse"},"greet.GreetingType":{"type":"string","title":"GreetingType","enum":["GREETING_TYPE_UNSPECIFIED","GREETING_TYPE_FORMAL"]},"ErrorResponse":{"type":"object","properties":{"status":{"type":"string","description":"The status code."},"message":{"type":"string","description":"A developer-facing error message."}},"title":"ErrorResponse","description":"Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/"}}},"security":[],"tags":[{"name":"greet.GreetService","description":"APIs for greeting users."}]},"isInternal":false,"tokens":1931,"sizeBytes":8988},{"name":"greet.triple.openapi.yaml","path":"tools/protoc-gen-triple-openapi/example/greet.triple.openapi.yaml","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/protoc-gen-triple-openapi/example/greet.triple.openapi.yaml","title":"Example Skill","category":"anthropic-skill","format":"yaml","content":"openapi: 3.0.1\ninfo:\n  title: Dubbo-go OpenAPI\n  description: dubbo-go generate OpenAPI docs.\n  version: v1\nservers:\n  - url: http://0.0.0.0:20000\n    description: Dubbo-go Default Server\npaths:\n  /greet.GreetService/Greet:\n    post:\n      tags:\n        - greet.GreetService\n      description: Returns a greeting for a request.\n      operationId: Greet\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n  /greet.GreetService/GreetUser:\n    post:\n      tags:\n        - greet.GreetService\n      operationId: GreetUser\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetUserRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetUserResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\ncomponents:\n  schemas:\n    greet.GreetProfile:\n      type: object\n      properties:\n        salutation:\n          type: string\n          title: salutation\n      title: GreetProfile\n    greet.GreetRequest:\n      type: object\n      allOf:\n        - oneOf:\n            - type: object\n              not:\n                anyOf:\n                  - type: object\n                    required:\n                      - recipientId\n                  - type: object\n                    required:\n                      - recipientProfile\n            - type: object\n              required:\n                - recipientId\n            - type: object\n              required:\n                - recipientProfile\n      properties:\n        name:\n          type: string\n          title: name\n          description: Name of the person to greet.\n        aliases:\n          type: array\n          items:\n            type: string\n          title: aliases\n          description: Alternative names for the person.\n        metadata:\n          type: object\n          title: metadata\n          additionalProperties:\n            type: string\n          description: Additional request metadata.\n        type:\n          title: type\n          description: Preferred greeting style.\n          $ref: '#/components/schemas/greet.GreetingType'\n        profile:\n          title: profile\n          description: Profile details for the person.\n          $ref: '#/components/schemas/greet.GreetProfile'\n        types:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetingType'\n          title: types\n        profiles:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetProfile'\n          title: profiles\n        profileMetadata:\n          type: object\n          title: profile_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetProfile'\n        typeMetadata:\n          type: object\n          title: type_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetingType'\n        recipientId:\n          type: string\n          title: recipient_id\n        recipientProfile:\n          title: recipient_profile\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: GreetRequest\n      description: A request to the Greet RPC.\n    greet.GreetRequest.MetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          type: string\n          title: value\n      title: MetadataEntry\n    greet.GreetRequest.ProfileMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: ProfileMetadataEntry\n    greet.GreetRequest.TypeMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetingType'\n      title: TypeMetadataEntry\n    greet.GreetResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetResponse\n    greet.GreetUserRequest:\n      type: object\n      properties:\n        name:\n          type: string\n          title: name\n      title: GreetUserRequest\n    greet.GreetUserResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetUserResponse\n    greet.GreetingType:\n      type: string\n      title: GreetingType\n      enum:\n        - GREETING_TYPE_UNSPECIFIED\n        - GREETING_TYPE_FORMAL\n    ErrorResponse:\n      type: object\n      properties:\n        status:\n          type: string\n          description: The status code.\n        message:\n          type: string\n          description: A developer-facing error message.\n      title: ErrorResponse\n      description: 'Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/'\nsecurity: []\ntags:\n  - name: greet.GreetService\n    description: APIs for greeting users.\n","isInternal":false,"tokens":1290,"sizeBytes":6138},{"name":"README.md","path":"tools/benchmark/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/benchmark/README.md","title":"benchmark Documentation","category":"plugin-manifest","format":"markdown","content":"# Dubbo-Go Benchmark Suite\n\nEnglish | [中文](README_CN.md)\n\nPerformance benchmark suite for comparing **Dubbo-Go / Dubbo-Java / gRPC** frameworks.\n\n## Environment Requirements\n\n- **Go**: 1.23+\n- **Java**: 8+\n- **Maven**: 3.6+\n- **protoc**: 3.0+\n\n## Default Port Configuration\n\n| Framework | Default Port |\n|-----------|-------------|\n| Dubbo-Go | 20000 |\n| Dubbo-Java | 20001 |\n| gRPC | 50051 |\n\n## Directory Structure\n\n```\ntools/benchmark\n├── client/                  # Benchmark client\n│   ├── main.go              # Entry point\n│   ├── clients/             # Client implementations\n│   │   ├── dubbo_client.go  # Dubbo-Go client\n│   │   └── grpc_client.go   # gRPC client\n│   ├── engine/              # Benchmark engine\n│   │   ├── engine.go        # Engine logic\n│   │   ├── statistics.go    # Statistics calculation\n│   │   └── metrics.go       # Metrics collection\n│   ├── monitor/             # System monitor\n│   │   └── system_monitor.go # CPU/Memory monitor\n│   └── payload/             # Payload generator\n│       └── payload.go       # Random payload generator\n├── server/                  # Server demos\n│   ├── dubbo-go/            # Dubbo-Go server\n│   │   └── main.go\n│   ├── dubbo-java/          # Dubbo-Java server\n│   │   └── pom.xml\n│   └── grpc/                # gRPC server\n│       └── main.go\n├── proto/                   # Protocol definitions and generated code\n│   ├── benchmark.proto      # Protobuf definition\n│   ├── benchmark.pb.go      # Generated Go code\n│   ├── benchmark_grpc.pb.go # Generated gRPC code\n│   └── benchmark.triple.go  # Generated Triple code\n├── scripts/                 # Automation scripts\n│   ├── gen_code.sh          # Protobuf code generation\n│   ├── run_all.sh           # Run all benchmarks\n│   └── run_single.sh        # Run single benchmark\n├── config.yaml              # Benchmark configuration\n├── README.md                # English documentation\n└── README_CN.md             # Chinese documentation\n```\n\n## Configuration\n\nTest configuration is in `config.yaml`, including:\n\n- `payload_sizes`: Payload sizes (in bytes)\n- `serializations`: Serialization protocols\n- `compressions`: Compression strategies\n- `call_modes`: Call modes\n- `concurrency_levels`: Concurrency levels\n- `benchmark`: Benchmark parameters (warmup time, test duration, timeout)\n\n## Code Generation\n\nAfter modifying `proto/benchmark.proto`, regenerate code:\n\n```bash\n./scripts/gen_code.sh\n```\n\nThis script generates:\n- `benchmark.pb.go` - Protobuf basic code\n- `benchmark.triple.go` - Dubbo Triple protocol code\n- `benchmark_grpc.pb.go` - gRPC protocol code\n\n## Usage\n\n### Single Benchmark\n\n```bash\n# Using script\n./scripts/run_single.sh dubbo-go 1024 protobuf none 100 unary\n\n# Or run directly\ngo run client/main.go \\\n  --framework dubbo-go \\\n  --payload 1024 \\\n  --serialization protobuf \\\n  --compression none \\\n  --concurrency 100 \\\n  --mode unary\n```\n\n### Full Benchmark\n\n```bash\n./scripts/run_all.sh\n```\n\n## Command Line Parameters\n\n| Parameter | Description | Default |\n|-----------|-------------|---------|\n| `--framework` | Test framework | dubbo-go |\n| `--payload` | Payload size (bytes) | 1024 |\n| `--serialization` | Serialization protocol | protobuf |\n| `--compression` | Compression strategy | none |\n| `--concurrency` | Concurrency level | 100 |\n| `--mode` | Call mode | unary |\n| `--duration` | Test duration | 60s |\n| `--warmup` | Warmup duration | 10s |\n| `--addr` | Server address | Auto select |\n| `--pid` | Server PID (for system monitoring) | 0 |\n\n### Parameter Values\n\n| Parameter | Values |\n|-----------|--------|\n| `--framework` | dubbo-go / dubbo-java / grpc |\n| `--serialization` | hessian2 / protobuf / msgpack |\n| `--compression` | none / default / fastest |\n| `--mode` | unary / streaming |\n\n## Start Server Separately\n\n```bash\n# Dubbo-Go Server\ncd server/dubbo-go\ngo run main.go --serialization protobuf --compression none --port 20000\n\n# gRPC Server\ncd server/grpc\ngo run main.go --port 50051\n\n# Dubbo-Java Server\ncd server/dubbo-java\nmvn clean package\njava -jar target/benchmark-dubbo-java.jar\n```\n\n## Benchmark Report\n\n### Test Environment\n\n- **Go Version**: 1.25\n- **Java Version**: 8+\n- **Test Frameworks**: Dubbo-Go / Dubbo-Java / gRPC\n- **Test Date**: 2026-07-27\n- **Warmup Duration**: 10s\n- **Test Duration**: 60s per test case\n\n### Test Configuration\n\n| Parameter | Value |\n|-----------|-------|\n| Payload Size | 128B / 1KiB / 16KiB / 1MiB |\n| Serialization | protobuf / hessian2 / msgpack |\n| Compression | none / default / fastest |\n| Concurrency | 50 / 100 / 500 / 1000 / 2000 |\n| Call Mode | unary / streaming |\n\n### 128 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 19,732 | 18,560 | 106,648 |\n| 100 | 19,231 | 18,120 | 118,044 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.30 | 8.21 | 0.94 |\n| 100 | 6.37 | 12.50 | 1.61 |\n\n### 1024 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 17,563 | 16,830 | 93,172 |\n| 100 | 16,075 | 15,240 | 103,253 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.64 | 9.15 | 1.07 |\n| 100 | 7.27 | 14.80 | 1.72 |\n\n### 16384 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 9,461 | 8,720 | 43,339 |\n| 100 | 7,944 | 7,350 | 41,723 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 6.89 | 18.30 | 1.99 |\n| 100 | 21.32 | 35.60 | 3.67 |\n\n### 1048576 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347 | 486 | 1,431 |\n| 100 | 310 | 452 | 1,453 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347.29 | 285.40 | 59.81 |\n| 100 | 795.42 | 420.60 | 109.15 |\n\n### Resource Usage (128B Payload, 100 Concurrency)\n\n| Framework | CPU Avg (%) | Memory Peak (MB) |\n|-----------|-------------|------------------|\n| dubbo-go | 324.0 | 69.7 |\n| dubbo-java | 52.8 | 256.3 |\n| grpc | 415.7 | 34.3 |\n\n## Output Files\n\n### Data Files\n\nTest results are saved in `data/` directory with the naming format:\n```\n{framework}_{payload}_{serialization}_{compression}_{concurrency}_{mode}.json\n```\n\nJSON structure:\n```json\n{\n  \"framework\": \"dubbo-go\",\n  \"payload_size\": 1024,\n  \"serialization\": \"protobuf\",\n  \"compression\": \"none\",\n  \"concurrency\": 100,\n  \"call_mode\": \"unary\",\n  \"timestamp\": \"2026-07-23 15:00:00\",\n  \"qps\": 21450.0,\n  \"success_rate\": 99.99,\n  \"latency_p50_ms\": 4.65,\n  \"latency_p99_ms\": 5.53,\n  \"cpu_avg_percent\": 45.2,\n  \"memory_peak_mb\": 128.5\n}\n```\n\n### Log Files\n\nLogs are saved in `logs/` directory, including:\n- `{scenario}.log` - Client benchmark logs\n- `{scenario}.server.log` - Server runtime logs\n\n## Performance Optimization\n\n### Dubbo-Go Client Optimization\n\nFor best performance, Dubbo-Go client uses the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithClientNoCheck()` | Skip service check, reduce unnecessary overhead |\n| `MaxCallRecvMsgSize: 16MB` | Max receive message size for large payload tests |\n| `MaxCallSendMsgSize: 16MB` | Max send message size for large payload tests |\n\n### Dubbo-Go Server Optimization\n\nServer configuration includes the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithMaxServerRecvMsgSize(\"16MB\")` | Max receive message size |\n| `WithMaxServerSendMsgSize(\"16MB\")` | Max send message size |\n\n## License\n\nApache License 2.0\n","isInternal":false,"tokens":2266,"sizeBytes":8043},{"name":"README.md","path":"tools/dubbo-go-schema/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/dubbo-go-schema/README.md","title":"dubbo-go-schema Documentation","category":"plugin-manifest","format":"markdown","content":"# dubbo-go-schema\n\nEnglish | [中文](README_CN.md)\n\n`dubbo-go-schema` provides the JSON Schema used by editors and YAML language servers to validate and complete Apache dubbo-go configuration files such as `dubbogo.yaml`, `dubbo.yaml`, and `application.yaml`.\n\nThe schema is maintained from the current `global/*_config.go` YAML tags and common dubbo-go configuration examples.\n\n## Files\n\n- `dubbo-go.json`: JSON Schema for dubbo-go YAML configuration.\n- `application.yaml`: example configuration that exercises common provider, consumer, Triple, metrics, tracing, logger, and shutdown settings.\n- `images/`: screenshots used by this README.\n\n## VS Code\n\nInstall a YAML language server extension, such as the Red Hat YAML extension, then add this to `settings.json`:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"https://raw.githubusercontent.com/apache/dubbo-go/develop/tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\nWhen testing local schema changes, point VS Code at the checked-out schema file instead:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"./tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\n## IntelliJ IDEA / GoLand\n\nOpen `Settings | Languages & Frameworks | Schemas and DTDs | JSON Schema Mappings`, add `dubbo-go.json`, and map it to the config file names you use.\n\n## Validate Locally\n\nAt minimum, verify that the schema is valid JSON:\n\n```bash\nnode -e \"JSON.parse(require('fs').readFileSync('tools/dubbo-go-schema/dubbo-go.json', 'utf8'))\"\n```\n\nFor editor validation, open `application.yaml` in VS Code or GoLand with the local schema mapping enabled. The schema expects dubbo-go v3 style configuration under the `dubbo:` root key.\n\n## Screenshots\n\n![GoLand schema mapping](images/img.png)\n\n![VS Code YAML schema mapping](images/vs-code.png)\n\n![Completion result](images/img_1.png)\n","isInternal":false,"tokens":468,"sizeBytes":1933},{"name":"README.md","path":"tools/dubbogo-cli/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/dubbogo-cli/README.md","title":"dubbogo-cli Documentation","category":"plugin-manifest","format":"markdown","content":"# dubbogo-cli\n\nEnglish | [中文](README_CN.md)\n\n`dubbogo-cli` is the command-line helper for the Apache dubbo-go toolchain. It can scaffold dubbo-go projects, install companion tools, inspect registry or metadata-center entries, and call Dubbo services during local debugging.\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/dubbogo-cli@latest\n```\n\nMake sure `$GOPATH/bin` or `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Commands\n\n```bash\ndubbogo-cli version\ndubbogo-cli install all\ndubbogo-cli install triple\ndubbogo-cli install triple-openapi\ndubbogo-cli install formatter\ndubbogo-cli newDemo .\ndubbogo-cli newApp .\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\ndubbogo-cli call --h localhost --p 20001 --proto dubbo --i com.example.UserProvider --method GetUser --sendObj ./request.json --recvObj ./response.json\ndubbogo-cli hessian --include ./\n```\n\n## Install Toolchain\n\n`dubbogo-cli install all` installs the companion tools used by current dubbo-go projects:\n\n- `protoc-gen-go-triple`: generates Triple client and server bindings.\n- `protoc-gen-triple-openapi`: generates OpenAPI v3 documents from Triple protobuf definitions.\n- `imports-formatter`: formats Go import blocks using dubbo-go import grouping rules.\n\nYou can install a single tool with `dubbogo-cli install triple`, `dubbogo-cli install triple-openapi`, or `dubbogo-cli install formatter`.\n\n## Create a Demo\n\n```bash\nmkdir hello-triple\ncd hello-triple\ndubbogo-cli newDemo .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- samples_api.proto\n|-- go-client\n|   `-- cmd\n|       `-- client.go\n|-- go-server\n|   `-- cmd\n|       `-- server.go\n`-- go.mod\n```\n\nRun the server:\n\n```bash\ngo run ./go-server/cmd\n```\n\nRun the client in another terminal:\n\n```bash\ngo run ./go-client/cmd\n```\n\nThe template keeps only protobuf source files in the scaffold. `make proto-gen` generates `*.pb.go` and `*.triple.go` files with `protoc-gen-go` and `protoc-gen-go-triple`.\n\n## Create an Application\n\n```bash\nmkdir dubbo-go-app\ncd dubbo-go-app\ndubbogo-cli newApp .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- api.proto\n|-- build\n|   `-- Dockerfile\n|-- chart\n|   |-- app\n|   `-- nacos_env\n|-- cmd\n|   `-- app.go\n|-- conf\n|   `-- dubbogo.yaml\n|-- go.mod\n`-- pkg\n    `-- service\n        `-- service.go\n```\n\nTypical workflow:\n\n1. Edit `api/api.proto`.\n2. Run `make proto-gen`.\n3. Run `go mod tidy`.\n4. Implement the service in `pkg/service`.\n5. Update image and Helm settings in `Makefile` and `chart/app/values.yaml`.\n6. Build, publish, and deploy with the provided Make targets.\n\nUseful Make targets:\n\n```bash\nmake proto-gen\nmake build\nmake buildx-publish\nmake deploy\nmake remove\n```\n\n## Inspect Registry and Metadata\n\nZookeeper registry:\n\n```bash\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\n```\n\nZookeeper metadata center:\n\n```bash\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\n```\n\nThe command prints registered interfaces and method names. Nacos and Istio support are not implemented yet.\n\n## Debug Dubbo Protocol Services\n\n`dubbogo-cli call` can invoke Dubbo protocol services with request and response shapes described as JSON files.\n\n```bash\ndubbogo-cli call \\\n  --h localhost \\\n  --p 20001 \\\n  --proto dubbo \\\n  --i com.example.UserProvider \\\n  --method GetUser \\\n  --sendObj ./request.json \\\n  --recvObj ./response.json\n```\n\nRequest fields use the form `type@value`, for example:\n\n```json\n{\n  \"ID\": \"string@A000\",\n  \"Male\": \"bool@true\",\n  \"JavaClassName\": \"string@com.example.CallUserStruct\"\n}\n```\n\nEvery Hessian object should provide a `JavaClassName` value that matches the provider-side type.\n\n## Debug Triple Services\n\nTriple services are compatible with the gRPC ecosystem. If reflection is enabled on the provider, `grpc_cli` can inspect and call services:\n\n```bash\ngrpc_cli ls localhost:20000 -l\ngrpc_cli type localhost:20000 org.apache.dubbo.samples.HelloRequest\ngrpc_cli call localhost:20000 SayHello \"name: 'laurence'\"\n```\n\nInstall `grpc_cli` from the gRPC project documentation.\n","isInternal":false,"tokens":1130,"sizeBytes":4123},{"name":"README.md","path":"tools/imports-formatter/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/imports-formatter/README.md","title":"imports-formatter Documentation","category":"plugin-manifest","format":"markdown","content":"# imports-formatter\n\nEnglish | [中文](README_CN.md)\n\n`imports-formatter` rewrites Go import blocks using the grouping style used by dubbo-go.\n\nIt scans a Go module, skips generated files that contain `Code generated by`, and groups imports into:\n\n- Go standard library imports\n- third-party imports\n- current module imports\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/imports-formatter@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\nYou can also install it through `dubbogo-cli`:\n\n```bash\ndubbogo-cli install formatter\n```\n\n## Usage\n\nFormat the current module:\n\n```bash\nimports-formatter\n```\n\nFormat a specific module path:\n\n```bash\nimports-formatter --path /path/to/module\n```\n\nPass the module path explicitly when the target directory does not contain `go.mod`:\n\n```bash\nimports-formatter --path /path/to/module/subdir --module dubbo.apache.org/dubbo-go/v3\n```\n\nDisable blank lines between third-party import groups:\n\n```bash\nimports-formatter --bl=false\n```\n\n## Flags\n\n| Flag | Default | Description |\n| --- | --- | --- |\n| `--path` | current directory | Directory to scan recursively. |\n| `--module` | module from `go.mod` | Go module path used to identify internal imports. |\n| `--bl` | `true` | Whether to insert blank lines between third-party import groups. |\n\n## Notes\n\n`imports-formatter` edits files in place. Review the diff before committing.\n","isInternal":false,"tokens":341,"sizeBytes":1404},{"name":"README.md","path":"tools/protoc-gen-go-triple/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/protoc-gen-go-triple/README.md","title":"protoc-gen-go-triple Documentation","category":"plugin-manifest","format":"markdown","content":"# protoc-gen-go-triple\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-go-triple` is the protobuf compiler plugin that generates dubbo-go Triple client and server bindings.\n\nIt works together with `protoc-gen-go`: `protoc-gen-go` generates protobuf message types, and `protoc-gen-go-triple` generates Triple service interfaces, clients, handlers, and registration helpers.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- `protoc-gen-go`\n\nInstall `protoc-gen-go` if it is not already available:\n\n```bash\ngo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n```\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-go-triple@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative \\\n  ./api/greet.proto\n```\n\nFor `greet.proto`, the generated files are:\n\n- `greet.pb.go`: protobuf messages generated by `protoc-gen-go`\n- `greet.triple.go`: Triple bindings generated by `protoc-gen-go-triple`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n```\n\nThe protobuf `package` controls the Triple service name exposed on the wire. The `go_package` option controls the Go import path and package name for generated files.\n\n## Generated API\n\nCurrent generated code uses the dubbo-go v3 Triple API:\n\n```go\ngreeter, err := api.NewGreetService(cli)\n```\n\n```go\nerr := api.RegisterGreetServiceHandler(srv, &GreetServiceImpl{})\n```\n\nThe generated file suffix is `.triple.go`.\n\n## Legacy Compatibility\n\nFor dubbo-go 3.2.0 and later, use the default generator output.\n\nTo generate stubs compatible with older dubbo-go releases, pass `useOldVersion=true`:\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative,useOldVersion=true \\\n  ./api/greet.proto\n```\n\nThe old compatibility mode is retained for migration only. New projects should use the default output.\n","isInternal":false,"tokens":587,"sizeBytes":2239},{"name":"README.md","path":"tools/protoc-gen-triple-openapi/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dubbo-go/HEAD/tools/protoc-gen-triple-openapi/README.md","title":"protoc-gen-triple-openapi Documentation","category":"plugin-manifest","format":"markdown","content":"# protoc-gen-triple-openapi\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-triple-openapi` is a `protoc` plugin that generates OpenAPI v3 documents from protobuf services used with the Dubbo Triple protocol.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- protobuf files that define Triple services\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-triple-openapi@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\nGenerate YAML, the default format:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=yaml \\\n  ./api/greet.proto\n```\n\nGenerate JSON:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=json \\\n  ./api/greet.proto\n```\n\nGenerated file names use the input proto base name:\n\n- `greet.triple.openapi.yaml`\n- `greet.triple.openapi.json`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage org.apache.dubbo.samples.greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n```\n\n## Options\n\n| Option | Values | Default | Description |\n| --- | --- | --- | --- |\n| `format` | `yaml`, `json` | `yaml` | Output document format. |\n\n## Version\n\n```bash\nprotoc-gen-triple-openapi --version\n```\n","isInternal":false,"tokens":380,"sizeBytes":1376}],"systemPromptSnippet":"<yakaai_skills repo=\"apache/dubbo-go\">\n<!-- File: tools/protoc-gen-triple-openapi/example/greet.triple.openapi.json (Tokens: ~1931 | Category: anthropic-skill) -->\n{\n  \"openapi\": \"3.0.1\",\n  \"info\": {\n    \"title\": \"Dubbo-go OpenAPI\",\n    \"description\": \"dubbo-go generate OpenAPI docs.\",\n    \"version\": \"v1\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://0.0.0.0:20000\",\n      \"description\": \"Dubbo-go Default Server\"\n    }\n  ],\n  \"paths\": {\n    \"/greet.GreetService/Greet\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"description\": \"Returns a greeting for a request.\",\n        \"operationId\": \"Greet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/greet.GreetService/GreetUser\": {\n      \"post\": {\n        \"tags\": [\n          \"greet.GreetService\"\n        ],\n        \"operationId\": \"GreetUser\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/greet.GreetUserRequest\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/greet.GreetUserResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"Bad Request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Internal Server Error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ErrorResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"greet.GreetProfile\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"salutation\": {\n            \"type\": \"string\",\n            \"title\": \"salutation\"\n          }\n        },\n        \"title\": \"GreetProfile\"\n      },\n      \"greet.GreetRequest\": {\n        \"type\": \"object\",\n        \"allOf\": [\n          {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"not\": {\n                  \"anyOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientId\"\n                      ]\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"required\": [\n                        \"recipientProfile\"\n                      ]\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientId\"\n                ]\n              },\n              {\n                \"type\": \"object\",\n                \"required\": [\n                  \"recipientProfile\"\n                ]\n              }\n            ]\n          }\n        ],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\",\n            \"description\": \"Name of the person to greet.\"\n          },\n          \"aliases\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"title\": \"aliases\",\n            \"description\": \"Alternative names for the person.\"\n          },\n          \"metadata\": {\n            \"type\": \"object\",\n            \"title\": \"metadata\",\n            \"additionalProperties\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Additional request metadata.\"\n          },\n          \"type\": {\n            \"title\": \"type\",\n            \"description\": \"Preferred greeting style.\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          },\n          \"profile\": {\n            \"title\": \"profile\",\n            \"description\": \"Profile details for the person.\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          },\n          \"types\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            },\n            \"title\": \"types\"\n          },\n          \"profiles\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            },\n            \"title\": \"profiles\"\n          },\n          \"profileMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"profile_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n            }\n          },\n          \"typeMetadata\": {\n            \"type\": \"object\",\n            \"title\": \"type_metadata\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/greet.GreetingType\"\n            }\n          },\n          \"recipientId\": {\n            \"type\": \"string\",\n            \"title\": \"recipient_id\"\n          },\n          \"recipientProfile\": {\n            \"title\": \"recipient_profile\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"GreetRequest\",\n        \"description\": \"A request to the Greet RPC.\"\n      },\n      \"greet.GreetRequest.MetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"type\": \"string\",\n            \"title\": \"value\"\n          }\n        },\n        \"title\": \"MetadataEntry\"\n      },\n      \"greet.GreetRequest.ProfileMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetProfile\"\n          }\n        },\n        \"title\": \"ProfileMetadataEntry\"\n      },\n      \"greet.GreetRequest.TypeMetadataEntry\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"key\": {\n            \"type\": \"string\",\n            \"title\": \"key\"\n          },\n          \"value\": {\n            \"title\": \"value\",\n            \"$ref\": \"#/components/schemas/greet.GreetingType\"\n          }\n        },\n        \"title\": \"TypeMetadataEntry\"\n      },\n      \"greet.GreetResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetResponse\"\n      },\n      \"greet.GreetUserRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"title\": \"name\"\n          }\n        },\n        \"title\": \"GreetUserRequest\"\n      },\n      \"greet.GreetUserResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"greeting\": {\n            \"type\": \"string\",\n            \"title\": \"greeting\"\n          }\n        },\n        \"title\": \"GreetUserResponse\"\n      },\n      \"greet.GreetingType\": {\n        \"type\": \"string\",\n        \"title\": \"GreetingType\",\n        \"enum\": [\n          \"GREETING_TYPE_UNSPECIFIED\",\n          \"GREETING_TYPE_FORMAL\"\n        ]\n      },\n      \"ErrorResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"description\": \"The status code.\"\n          },\n          \"message\": {\n            \"type\": \"string\",\n            \"description\": \"A developer-facing error message.\"\n          }\n        },\n        \"title\": \"ErrorResponse\",\n        \"description\": \"Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/\"\n      }\n    }\n  },\n  \"security\": [],\n  \"tags\": [\n    {\n      \"name\": \"greet.GreetService\",\n      \"description\": \"APIs for greeting users.\"\n    }\n  ]\n}\n\n<!-- File: tools/protoc-gen-triple-openapi/example/greet.triple.openapi.yaml (Tokens: ~1290 | Category: anthropic-skill) -->\nopenapi: 3.0.1\ninfo:\n  title: Dubbo-go OpenAPI\n  description: dubbo-go generate OpenAPI docs.\n  version: v1\nservers:\n  - url: http://0.0.0.0:20000\n    description: Dubbo-go Default Server\npaths:\n  /greet.GreetService/Greet:\n    post:\n      tags:\n        - greet.GreetService\n      description: Returns a greeting for a request.\n      operationId: Greet\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n  /greet.GreetService/GreetUser:\n    post:\n      tags:\n        - greet.GreetService\n      operationId: GreetUser\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/greet.GreetUserRequest'\n        required: true\n      responses:\n        \"200\":\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/greet.GreetUserResponse'\n        \"400\":\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\n        \"500\":\n          description: Internal Server Error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ErrorResponse'\ncomponents:\n  schemas:\n    greet.GreetProfile:\n      type: object\n      properties:\n        salutation:\n          type: string\n          title: salutation\n      title: GreetProfile\n    greet.GreetRequest:\n      type: object\n      allOf:\n        - oneOf:\n            - type: object\n              not:\n                anyOf:\n                  - type: object\n                    required:\n                      - recipientId\n                  - type: object\n                    required:\n                      - recipientProfile\n            - type: object\n              required:\n                - recipientId\n            - type: object\n              required:\n                - recipientProfile\n      properties:\n        name:\n          type: string\n          title: name\n          description: Name of the person to greet.\n        aliases:\n          type: array\n          items:\n            type: string\n          title: aliases\n          description: Alternative names for the person.\n        metadata:\n          type: object\n          title: metadata\n          additionalProperties:\n            type: string\n          description: Additional request metadata.\n        type:\n          title: type\n          description: Preferred greeting style.\n          $ref: '#/components/schemas/greet.GreetingType'\n        profile:\n          title: profile\n          description: Profile details for the person.\n          $ref: '#/components/schemas/greet.GreetProfile'\n        types:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetingType'\n          title: types\n        profiles:\n          type: array\n          items:\n            $ref: '#/components/schemas/greet.GreetProfile'\n          title: profiles\n        profileMetadata:\n          type: object\n          title: profile_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetProfile'\n        typeMetadata:\n          type: object\n          title: type_metadata\n          additionalProperties:\n            $ref: '#/components/schemas/greet.GreetingType'\n        recipientId:\n          type: string\n          title: recipient_id\n        recipientProfile:\n          title: recipient_profile\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: GreetRequest\n      description: A request to the Greet RPC.\n    greet.GreetRequest.MetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          type: string\n          title: value\n      title: MetadataEntry\n    greet.GreetRequest.ProfileMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetProfile'\n      title: ProfileMetadataEntry\n    greet.GreetRequest.TypeMetadataEntry:\n      type: object\n      properties:\n        key:\n          type: string\n          title: key\n        value:\n          title: value\n          $ref: '#/components/schemas/greet.GreetingType'\n      title: TypeMetadataEntry\n    greet.GreetResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetResponse\n    greet.GreetUserRequest:\n      type: object\n      properties:\n        name:\n          type: string\n          title: name\n      title: GreetUserRequest\n    greet.GreetUserResponse:\n      type: object\n      properties:\n        greeting:\n          type: string\n          title: greeting\n      title: GreetUserResponse\n    greet.GreetingType:\n      type: string\n      title: GreetingType\n      enum:\n        - GREETING_TYPE_UNSPECIFIED\n        - GREETING_TYPE_FORMAL\n    ErrorResponse:\n      type: object\n      properties:\n        status:\n          type: string\n          description: The status code.\n        message:\n          type: string\n          description: A developer-facing error message.\n      title: ErrorResponse\n      description: 'Error type returned by triple: https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/'\nsecurity: []\ntags:\n  - name: greet.GreetService\n    description: APIs for greeting users.\n\n<!-- File: tools/benchmark/README.md (Tokens: ~2266 | Category: plugin-manifest) -->\n# Dubbo-Go Benchmark Suite\n\nEnglish | [中文](README_CN.md)\n\nPerformance benchmark suite for comparing **Dubbo-Go / Dubbo-Java / gRPC** frameworks.\n\n## Environment Requirements\n\n- **Go**: 1.23+\n- **Java**: 8+\n- **Maven**: 3.6+\n- **protoc**: 3.0+\n\n## Default Port Configuration\n\n| Framework | Default Port |\n|-----------|-------------|\n| Dubbo-Go | 20000 |\n| Dubbo-Java | 20001 |\n| gRPC | 50051 |\n\n## Directory Structure\n\n```\ntools/benchmark\n├── client/                  # Benchmark client\n│   ├── main.go              # Entry point\n│   ├── clients/             # Client implementations\n│   │   ├── dubbo_client.go  # Dubbo-Go client\n│   │   └── grpc_client.go   # gRPC client\n│   ├── engine/              # Benchmark engine\n│   │   ├── engine.go        # Engine logic\n│   │   ├── statistics.go    # Statistics calculation\n│   │   └── metrics.go       # Metrics collection\n│   ├── monitor/             # System monitor\n│   │   └── system_monitor.go # CPU/Memory monitor\n│   └── payload/             # Payload generator\n│       └── payload.go       # Random payload generator\n├── server/                  # Server demos\n│   ├── dubbo-go/            # Dubbo-Go server\n│   │   └── main.go\n│   ├── dubbo-java/          # Dubbo-Java server\n│   │   └── pom.xml\n│   └── grpc/                # gRPC server\n│       └── main.go\n├── proto/                   # Protocol definitions and generated code\n│   ├── benchmark.proto      # Protobuf definition\n│   ├── benchmark.pb.go      # Generated Go code\n│   ├── benchmark_grpc.pb.go # Generated gRPC code\n│   └── benchmark.triple.go  # Generated Triple code\n├── scripts/                 # Automation scripts\n│   ├── gen_code.sh          # Protobuf code generation\n│   ├── run_all.sh           # Run all benchmarks\n│   └── run_single.sh        # Run single benchmark\n├── config.yaml              # Benchmark configuration\n├── README.md                # English documentation\n└── README_CN.md             # Chinese documentation\n```\n\n## Configuration\n\nTest configuration is in `config.yaml`, including:\n\n- `payload_sizes`: Payload sizes (in bytes)\n- `serializations`: Serialization protocols\n- `compressions`: Compression strategies\n- `call_modes`: Call modes\n- `concurrency_levels`: Concurrency levels\n- `benchmark`: Benchmark parameters (warmup time, test duration, timeout)\n\n## Code Generation\n\nAfter modifying `proto/benchmark.proto`, regenerate code:\n\n```bash\n./scripts/gen_code.sh\n```\n\nThis script generates:\n- `benchmark.pb.go` - Protobuf basic code\n- `benchmark.triple.go` - Dubbo Triple protocol code\n- `benchmark_grpc.pb.go` - gRPC protocol code\n\n## Usage\n\n### Single Benchmark\n\n```bash\n# Using script\n./scripts/run_single.sh dubbo-go 1024 protobuf none 100 unary\n\n# Or run directly\ngo run client/main.go \\\n  --framework dubbo-go \\\n  --payload 1024 \\\n  --serialization protobuf \\\n  --compression none \\\n  --concurrency 100 \\\n  --mode unary\n```\n\n### Full Benchmark\n\n```bash\n./scripts/run_all.sh\n```\n\n## Command Line Parameters\n\n| Parameter | Description | Default |\n|-----------|-------------|---------|\n| `--framework` | Test framework | dubbo-go |\n| `--payload` | Payload size (bytes) | 1024 |\n| `--serialization` | Serialization protocol | protobuf |\n| `--compression` | Compression strategy | none |\n| `--concurrency` | Concurrency level | 100 |\n| `--mode` | Call mode | unary |\n| `--duration` | Test duration | 60s |\n| `--warmup` | Warmup duration | 10s |\n| `--addr` | Server address | Auto select |\n| `--pid` | Server PID (for system monitoring) | 0 |\n\n### Parameter Values\n\n| Parameter | Values |\n|-----------|--------|\n| `--framework` | dubbo-go / dubbo-java / grpc |\n| `--serialization` | hessian2 / protobuf / msgpack |\n| `--compression` | none / default / fastest |\n| `--mode` | unary / streaming |\n\n## Start Server Separately\n\n```bash\n# Dubbo-Go Server\ncd server/dubbo-go\ngo run main.go --serialization protobuf --compression none --port 20000\n\n# gRPC Server\ncd server/grpc\ngo run main.go --port 50051\n\n# Dubbo-Java Server\ncd server/dubbo-java\nmvn clean package\njava -jar target/benchmark-dubbo-java.jar\n```\n\n## Benchmark Report\n\n### Test Environment\n\n- **Go Version**: 1.25\n- **Java Version**: 8+\n- **Test Frameworks**: Dubbo-Go / Dubbo-Java / gRPC\n- **Test Date**: 2026-07-27\n- **Warmup Duration**: 10s\n- **Test Duration**: 60s per test case\n\n### Test Configuration\n\n| Parameter | Value |\n|-----------|-------|\n| Payload Size | 128B / 1KiB / 16KiB / 1MiB |\n| Serialization | protobuf / hessian2 / msgpack |\n| Compression | none / default / fastest |\n| Concurrency | 50 / 100 / 500 / 1000 / 2000 |\n| Call Mode | unary / streaming |\n\n### 128 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 19,732 | 18,560 | 106,648 |\n| 100 | 19,231 | 18,120 | 118,044 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.30 | 8.21 | 0.94 |\n| 100 | 6.37 | 12.50 | 1.61 |\n\n### 1024 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 17,563 | 16,830 | 93,172 |\n| 100 | 16,075 | 15,240 | 103,253 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 3.64 | 9.15 | 1.07 |\n| 100 | 7.27 | 14.80 | 1.72 |\n\n### 16384 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 9,461 | 8,720 | 43,339 |\n| 100 | 7,944 | 7,350 | 41,723 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 6.89 | 18.30 | 1.99 |\n| 100 | 21.32 | 35.60 | 3.67 |\n\n### 1048576 bytes Payload\n\n#### QPS\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347 | 486 | 1,431 |\n| 100 | 310 | 452 | 1,453 |\n\n#### P99 Latency (ms)\n\n| Concurrency | dubbo-go | dubbo-java | grpc |\n|-------------|----------|------------|------|\n| 50 | 347.29 | 285.40 | 59.81 |\n| 100 | 795.42 | 420.60 | 109.15 |\n\n### Resource Usage (128B Payload, 100 Concurrency)\n\n| Framework | CPU Avg (%) | Memory Peak (MB) |\n|-----------|-------------|------------------|\n| dubbo-go | 324.0 | 69.7 |\n| dubbo-java | 52.8 | 256.3 |\n| grpc | 415.7 | 34.3 |\n\n## Output Files\n\n### Data Files\n\nTest results are saved in `data/` directory with the naming format:\n```\n{framework}_{payload}_{serialization}_{compression}_{concurrency}_{mode}.json\n```\n\nJSON structure:\n```json\n{\n  \"framework\": \"dubbo-go\",\n  \"payload_size\": 1024,\n  \"serialization\": \"protobuf\",\n  \"compression\": \"none\",\n  \"concurrency\": 100,\n  \"call_mode\": \"unary\",\n  \"timestamp\": \"2026-07-23 15:00:00\",\n  \"qps\": 21450.0,\n  \"success_rate\": 99.99,\n  \"latency_p50_ms\": 4.65,\n  \"latency_p99_ms\": 5.53,\n  \"cpu_avg_percent\": 45.2,\n  \"memory_peak_mb\": 128.5\n}\n```\n\n### Log Files\n\nLogs are saved in `logs/` directory, including:\n- `{scenario}.log` - Client benchmark logs\n- `{scenario}.server.log` - Server runtime logs\n\n## Performance Optimization\n\n### Dubbo-Go Client Optimization\n\nFor best performance, Dubbo-Go client uses the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithClientNoCheck()` | Skip service check, reduce unnecessary overhead |\n| `MaxCallRecvMsgSize: 16MB` | Max receive message size for large payload tests |\n| `MaxCallSendMsgSize: 16MB` | Max send message size for large payload tests |\n\n### Dubbo-Go Server Optimization\n\nServer configuration includes the following optimizations:\n\n| Configuration | Description |\n|---------------|-------------|\n| `WithMaxServerRecvMsgSize(\"16MB\")` | Max receive message size |\n| `WithMaxServerSendMsgSize(\"16MB\")` | Max send message size |\n\n## License\n\nApache License 2.0\n\n<!-- File: tools/dubbo-go-schema/README.md (Tokens: ~468 | Category: plugin-manifest) -->\n# dubbo-go-schema\n\nEnglish | [中文](README_CN.md)\n\n`dubbo-go-schema` provides the JSON Schema used by editors and YAML language servers to validate and complete Apache dubbo-go configuration files such as `dubbogo.yaml`, `dubbo.yaml`, and `application.yaml`.\n\nThe schema is maintained from the current `global/*_config.go` YAML tags and common dubbo-go configuration examples.\n\n## Files\n\n- `dubbo-go.json`: JSON Schema for dubbo-go YAML configuration.\n- `application.yaml`: example configuration that exercises common provider, consumer, Triple, metrics, tracing, logger, and shutdown settings.\n- `images/`: screenshots used by this README.\n\n## VS Code\n\nInstall a YAML language server extension, such as the Red Hat YAML extension, then add this to `settings.json`:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"https://raw.githubusercontent.com/apache/dubbo-go/develop/tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\nWhen testing local schema changes, point VS Code at the checked-out schema file instead:\n\n```json\n{\n  \"yaml.schemas\": {\n    \"./tools/dubbo-go-schema/dubbo-go.json\": [\n      \"dubbo.yaml\",\n      \"dubbogo.yaml\",\n      \"application.yaml\"\n    ]\n  }\n}\n```\n\n## IntelliJ IDEA / GoLand\n\nOpen `Settings | Languages & Frameworks | Schemas and DTDs | JSON Schema Mappings`, add `dubbo-go.json`, and map it to the config file names you use.\n\n## Validate Locally\n\nAt minimum, verify that the schema is valid JSON:\n\n```bash\nnode -e \"JSON.parse(require('fs').readFileSync('tools/dubbo-go-schema/dubbo-go.json', 'utf8'))\"\n```\n\nFor editor validation, open `application.yaml` in VS Code or GoLand with the local schema mapping enabled. The schema expects dubbo-go v3 style configuration under the `dubbo:` root key.\n\n## Screenshots\n\n![GoLand schema mapping](images/img.png)\n\n![VS Code YAML schema mapping](images/vs-code.png)\n\n![Completion result](images/img_1.png)\n\n<!-- File: tools/dubbogo-cli/README.md (Tokens: ~1130 | Category: plugin-manifest) -->\n# dubbogo-cli\n\nEnglish | [中文](README_CN.md)\n\n`dubbogo-cli` is the command-line helper for the Apache dubbo-go toolchain. It can scaffold dubbo-go projects, install companion tools, inspect registry or metadata-center entries, and call Dubbo services during local debugging.\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/dubbogo-cli@latest\n```\n\nMake sure `$GOPATH/bin` or `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Commands\n\n```bash\ndubbogo-cli version\ndubbogo-cli install all\ndubbogo-cli install triple\ndubbogo-cli install triple-openapi\ndubbogo-cli install formatter\ndubbogo-cli newDemo .\ndubbogo-cli newApp .\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\ndubbogo-cli call --h localhost --p 20001 --proto dubbo --i com.example.UserProvider --method GetUser --sendObj ./request.json --recvObj ./response.json\ndubbogo-cli hessian --include ./\n```\n\n## Install Toolchain\n\n`dubbogo-cli install all` installs the companion tools used by current dubbo-go projects:\n\n- `protoc-gen-go-triple`: generates Triple client and server bindings.\n- `protoc-gen-triple-openapi`: generates OpenAPI v3 documents from Triple protobuf definitions.\n- `imports-formatter`: formats Go import blocks using dubbo-go import grouping rules.\n\nYou can install a single tool with `dubbogo-cli install triple`, `dubbogo-cli install triple-openapi`, or `dubbogo-cli install formatter`.\n\n## Create a Demo\n\n```bash\nmkdir hello-triple\ncd hello-triple\ndubbogo-cli newDemo .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- samples_api.proto\n|-- go-client\n|   `-- cmd\n|       `-- client.go\n|-- go-server\n|   `-- cmd\n|       `-- server.go\n`-- go.mod\n```\n\nRun the server:\n\n```bash\ngo run ./go-server/cmd\n```\n\nRun the client in another terminal:\n\n```bash\ngo run ./go-client/cmd\n```\n\nThe template keeps only protobuf source files in the scaffold. `make proto-gen` generates `*.pb.go` and `*.triple.go` files with `protoc-gen-go` and `protoc-gen-go-triple`.\n\n## Create an Application\n\n```bash\nmkdir dubbo-go-app\ncd dubbo-go-app\ndubbogo-cli newApp .\nmake proto-gen\ngo mod tidy\n```\n\nGenerated layout:\n\n```text\n.\n|-- Makefile\n|-- api\n|   `-- api.proto\n|-- build\n|   `-- Dockerfile\n|-- chart\n|   |-- app\n|   `-- nacos_env\n|-- cmd\n|   `-- app.go\n|-- conf\n|   `-- dubbogo.yaml\n|-- go.mod\n`-- pkg\n    `-- service\n        `-- service.go\n```\n\nTypical workflow:\n\n1. Edit `api/api.proto`.\n2. Run `make proto-gen`.\n3. Run `go mod tidy`.\n4. Implement the service in `pkg/service`.\n5. Update image and Helm settings in `Makefile` and `chart/app/values.yaml`.\n6. Build, publish, and deploy with the provided Make targets.\n\nUseful Make targets:\n\n```bash\nmake proto-gen\nmake build\nmake buildx-publish\nmake deploy\nmake remove\n```\n\n## Inspect Registry and Metadata\n\nZookeeper registry:\n\n```bash\ndubbogo-cli show --r zookeeper --h 127.0.0.1:2181\n```\n\nZookeeper metadata center:\n\n```bash\ndubbogo-cli show --mc zookeeper --h 127.0.0.1:2181\n```\n\nThe command prints registered interfaces and method names. Nacos and Istio support are not implemented yet.\n\n## Debug Dubbo Protocol Services\n\n`dubbogo-cli call` can invoke Dubbo protocol services with request and response shapes described as JSON files.\n\n```bash\ndubbogo-cli call \\\n  --h localhost \\\n  --p 20001 \\\n  --proto dubbo \\\n  --i com.example.UserProvider \\\n  --method GetUser \\\n  --sendObj ./request.json \\\n  --recvObj ./response.json\n```\n\nRequest fields use the form `type@value`, for example:\n\n```json\n{\n  \"ID\": \"string@A000\",\n  \"Male\": \"bool@true\",\n  \"JavaClassName\": \"string@com.example.CallUserStruct\"\n}\n```\n\nEvery Hessian object should provide a `JavaClassName` value that matches the provider-side type.\n\n## Debug Triple Services\n\nTriple services are compatible with the gRPC ecosystem. If reflection is enabled on the provider, `grpc_cli` can inspect and call services:\n\n```bash\ngrpc_cli ls localhost:20000 -l\ngrpc_cli type localhost:20000 org.apache.dubbo.samples.HelloRequest\ngrpc_cli call localhost:20000 SayHello \"name: 'laurence'\"\n```\n\nInstall `grpc_cli` from the gRPC project documentation.\n\n<!-- File: tools/imports-formatter/README.md (Tokens: ~341 | Category: plugin-manifest) -->\n# imports-formatter\n\nEnglish | [中文](README_CN.md)\n\n`imports-formatter` rewrites Go import blocks using the grouping style used by dubbo-go.\n\nIt scans a Go module, skips generated files that contain `Code generated by`, and groups imports into:\n\n- Go standard library imports\n- third-party imports\n- current module imports\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/imports-formatter@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\nYou can also install it through `dubbogo-cli`:\n\n```bash\ndubbogo-cli install formatter\n```\n\n## Usage\n\nFormat the current module:\n\n```bash\nimports-formatter\n```\n\nFormat a specific module path:\n\n```bash\nimports-formatter --path /path/to/module\n```\n\nPass the module path explicitly when the target directory does not contain `go.mod`:\n\n```bash\nimports-formatter --path /path/to/module/subdir --module dubbo.apache.org/dubbo-go/v3\n```\n\nDisable blank lines between third-party import groups:\n\n```bash\nimports-formatter --bl=false\n```\n\n## Flags\n\n| Flag | Default | Description |\n| --- | --- | --- |\n| `--path` | current directory | Directory to scan recursively. |\n| `--module` | module from `go.mod` | Go module path used to identify internal imports. |\n| `--bl` | `true` | Whether to insert blank lines between third-party import groups. |\n\n## Notes\n\n`imports-formatter` edits files in place. Review the diff before committing.\n\n<!-- File: tools/protoc-gen-go-triple/README.md (Tokens: ~587 | Category: plugin-manifest) -->\n# protoc-gen-go-triple\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-go-triple` is the protobuf compiler plugin that generates dubbo-go Triple client and server bindings.\n\nIt works together with `protoc-gen-go`: `protoc-gen-go` generates protobuf message types, and `protoc-gen-go-triple` generates Triple service interfaces, clients, handlers, and registration helpers.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- `protoc-gen-go`\n\nInstall `protoc-gen-go` if it is not already available:\n\n```bash\ngo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n```\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-go-triple@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative \\\n  ./api/greet.proto\n```\n\nFor `greet.proto`, the generated files are:\n\n- `greet.pb.go`: protobuf messages generated by `protoc-gen-go`\n- `greet.triple.go`: Triple bindings generated by `protoc-gen-go-triple`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n```\n\nThe protobuf `package` controls the Triple service name exposed on the wire. The `go_package` option controls the Go import path and package name for generated files.\n\n## Generated API\n\nCurrent generated code uses the dubbo-go v3 Triple API:\n\n```go\ngreeter, err := api.NewGreetService(cli)\n```\n\n```go\nerr := api.RegisterGreetServiceHandler(srv, &GreetServiceImpl{})\n```\n\nThe generated file suffix is `.triple.go`.\n\n## Legacy Compatibility\n\nFor dubbo-go 3.2.0 and later, use the default generator output.\n\nTo generate stubs compatible with older dubbo-go releases, pass `useOldVersion=true`:\n\n```bash\nprotoc \\\n  --go_out=. \\\n  --go_opt=paths=source_relative \\\n  --go-triple_out=. \\\n  --go-triple_opt=paths=source_relative,useOldVersion=true \\\n  ./api/greet.proto\n```\n\nThe old compatibility mode is retained for migration only. New projects should use the default output.\n\n<!-- File: tools/protoc-gen-triple-openapi/README.md (Tokens: ~380 | Category: plugin-manifest) -->\n# protoc-gen-triple-openapi\n\nEnglish | [中文](README_CN.md)\n\n`protoc-gen-triple-openapi` is a `protoc` plugin that generates OpenAPI v3 documents from protobuf services used with the Dubbo Triple protocol.\n\n## Requirements\n\n- Go 1.23 or later\n- `protoc`\n- protobuf files that define Triple services\n\n## Installation\n\n```bash\ngo install dubbo.apache.org/dubbo-go/v3/tools/protoc-gen-triple-openapi@latest\n```\n\nMake sure `$(go env GOPATH)/bin` is in your `PATH`.\n\n## Usage\n\nGenerate YAML, the default format:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=yaml \\\n  ./api/greet.proto\n```\n\nGenerate JSON:\n\n```bash\nprotoc \\\n  --triple-openapi_out=. \\\n  --triple-openapi_opt=format=json \\\n  ./api/greet.proto\n```\n\nGenerated file names use the input proto base name:\n\n- `greet.triple.openapi.yaml`\n- `greet.triple.openapi.json`\n\n## Proto Example\n\n```proto\nsyntax = \"proto3\";\n\npackage org.apache.dubbo.samples.greet;\n\noption go_package = \"example.com/hello/api;api\";\n\nservice GreetService {\n  rpc Greet(GreetRequest) returns (GreetResponse) {}\n}\n\nmessage GreetRequest {\n  string name = 1;\n}\n\nmessage GreetResponse {\n  string greeting = 1;\n}\n```\n\n## Options\n\n| Option | Values | Default | Description |\n| --- | --- | --- | --- |\n| `format` | `yaml`, `json` | `yaml` | Output document format. |\n\n## Version\n\n```bash\nprotoc-gen-triple-openapi --version\n```\n</yakaai_skills>"}