Skip to content

Commit 5b7f27b

Browse files
committed
feat:引入go的客户端
1 parent ef72b27 commit 5b7f27b

9 files changed

Lines changed: 575 additions & 15 deletions

File tree

README.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,9 @@ rpc:
257257

258258
---
259259

260-
## 🐍 Cross-Language gRPC Support (Python)
260+
## 🌐 Multi-Language gRPC Support (Python & Go)
261261

262-
This framework supports interoperability with standard gRPC clients (e.g., Python), allowing non-Java clients to invoke services hosted by the RPC framework.
262+
This framework supports interoperability with standard gRPC clients (e.g., Python, Go), allowing non-Java clients to invoke services hosted by the RPC framework.
263263

264264
### Features
265265

@@ -289,27 +289,28 @@ This framework supports interoperability with standard gRPC clients (e.g., Pytho
289289
java -cp rpc-provider/target/rpc-provider-1.0-SNAPSHOT.jar:rpc-transport-netty/target/rpc-transport-netty-1.0-SNAPSHOT.jar:rpc-core/target/rpc-core-1.0-SNAPSHOT.jar:rpc-common/target/rpc-common-1.0-SNAPSHOT.jar:rpc-api/target/rpc-api-1.0-SNAPSHOT.jar:$(mvn -q dependency:build-classpath -Dmdep.outputFile=/dev/stdout -pl rpc-provider -am) com.xiaoyu.rpc.provider.ProviderApp
290290
```
291291
3. **Run the Python Client**:
292-
Navigate to the `python_client` directory and set up the environment:
292+
Refer to [python_client/client.py](file:///Users/yaoyao/Dev/JAVA_Dev_Project/gRPC/python_client/client.py) for details.
293293

294294
```bash
295295
cd python_client
296+
# ... (existing steps)
297+
python3 client.py
298+
```
296299

297-
# Create and valid virtual environment
298-
python3 -m venv venv
299-
source venv/bin/activate
300-
301-
# Install dependencies
302-
pip install grpcio grpcio-tools protobuf
300+
4. **Run the Go Client**:
301+
Navigate to the `go_client` directory and run:
303302

304-
# Run the client
305-
python3 client.py
303+
```bash
304+
cd go_client
305+
go run main.go
306306
```
307307

308308
**Expected Output**:
309309

310310
```text
311+
Sending RpcRequest: interface=com.xiaoyu.rpc.api.HelloService, method=sayHello, param=World
311312
RpcResponse received:
312-
Data: Hello, World! (from Multi-Module Netty Server)
313+
Data: Hello, World!
313314
Message: Success
314315
```
315316
## 🔄 Continuous Integration & Delivery (CI/CD)

README_ZH.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ rpc:
260260

261261
---
262262

263-
## 🐍 跨语言 gRPC 支持 (Python)
263+
## 🌐 多语言 gRPC 支持 (Python & Go)
264264

265-
本框架支持与标准 gRPC 客户端(如 Python)互操作,允许非 Java 客户端调用本框架托管的服务。
265+
本框架支持与标准 gRPC 客户端(如 Python, Go)互操作,允许非 Java 客户端调用本框架托管的服务。
266266

267267
### 特性
268268

@@ -293,7 +293,7 @@ rpc:
293293
```
294294

295295
3. **运行 Python 客户端**:
296-
进入 `python_client` 目录并配置环境:
296+
详情请参考 [python_client/client.py](file:///Users/yaoyao/Dev/JAVA_Dev_Project/gRPC/python_client/client.py)。
297297

298298
```bash
299299
cd python_client
@@ -317,6 +317,23 @@ rpc:
317317
Message: Success
318318
```
319319

320+
4. **运行 Go 客户端**:
321+
进入 `go_client` 目录并运行:
322+
323+
```bash
324+
cd go_client
325+
go run main.go
326+
```
327+
328+
**预期输出**:
329+
330+
```text
331+
Sending RpcRequest: interface=com.xiaoyu.rpc.api.HelloService, method=sayHello, param=World
332+
RpcResponse received:
333+
Data: Hello, World!
334+
Message: Success
335+
```
336+
320337
## 🔄 持续集成与交付 (CI/CD)
321338

322339
为了确保系统可靠性和代码质量,本项目集成了一套基于 **GitHub Actions** 的健壮 CI/CD 流水线。

go_client/go.mod

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module go_client
2+
3+
go 1.25.6
4+
5+
require (
6+
google.golang.org/grpc v1.70.0
7+
google.golang.org/protobuf v1.36.11
8+
)
9+
10+
require (
11+
go.opentelemetry.io/otel v1.34.0 // indirect
12+
go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
13+
golang.org/x/net v0.38.0 // indirect
14+
golang.org/x/sys v0.31.0 // indirect
15+
golang.org/x/text v0.23.0 // indirect
16+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
17+
)

go_client/go.sum

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
2+
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
3+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
4+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
5+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
6+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
7+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
8+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
9+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
10+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
11+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
12+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
13+
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
14+
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
15+
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
16+
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
17+
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
18+
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
19+
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
20+
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
21+
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
22+
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
23+
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
24+
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
25+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
26+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
27+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
28+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
29+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI=
30+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
31+
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
32+
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
33+
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
34+
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=

go_client/main.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"time"
8+
9+
"go_client/pb"
10+
11+
"google.golang.org/grpc"
12+
"google.golang.org/grpc/credentials/insecure"
13+
"google.golang.org/protobuf/proto"
14+
"google.golang.org/protobuf/types/known/wrapperspb"
15+
)
16+
17+
func main() {
18+
// Connect to the Java gRPC server
19+
addr := "localhost:8080"
20+
conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
21+
if err != nil {
22+
log.Fatalf("did not connect: %v", err)
23+
}
24+
defer conn.Close()
25+
26+
client := pb.NewGrpcServiceClient(conn)
27+
28+
// Wrap the parameter in a Protobuf StringValue
29+
param := wrapperspb.String( "World")
30+
paramBytes, err := proto.Marshal(param)
31+
if err != nil {
32+
log.Fatalf("failed to marshal param: %v", err)
33+
}
34+
35+
// Prepare the RPC request
36+
req := &pb.RpcRequest{
37+
InterfaceName: "com.xiaoyu.rpc.api.HelloService",
38+
MethodName: "sayHello",
39+
ParamTypes: []string{"java.lang.String"},
40+
Parameters: [][]byte{paramBytes},
41+
RequestId: fmt.Sprintf("go-req-%d", time.Now().UnixNano()),
42+
}
43+
44+
// Set a timeout for the call
45+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
46+
defer cancel()
47+
48+
// Call the handle method
49+
fmt.Printf("Sending RpcRequest: interface=%s, method=%s, param=%s\n", req.InterfaceName, req.MethodName, "World")
50+
resp, err := client.Handle(ctx, req)
51+
if err != nil {
52+
log.Fatalf("could not call handle: %v", err)
53+
}
54+
55+
fmt.Println("RpcResponse received:")
56+
if resp.Message == "Success" {
57+
resultVal := &wrapperspb.StringValue{}
58+
if err := proto.Unmarshal(resp.Data, resultVal); err != nil {
59+
log.Printf("failed to unmarshal data: %v", err)
60+
fmt.Printf("Data (Raw): %v\n", resp.Data)
61+
} else {
62+
fmt.Printf("Data: %s\n", resultVal.Value)
63+
}
64+
} else {
65+
fmt.Printf("Data (Raw): %v\n", resp.Data)
66+
}
67+
fmt.Printf("Message: %s\n", resp.Message)
68+
fmt.Printf("RequestID: %s\n", resp.RequestId)
69+
}

0 commit comments

Comments
 (0)