使用 Go 实现 gRPC 服务端和客户端
服务端
在服务端的实现中,我首先定义了一个结构体 MyInfo
,用于实现 MyInfoService
接口的方法。然后,创建一个 gRPC 服务实例,并注册我们实现的服务。接着,监听指定的端口,启动 gRPC 服务。
package main
import (
"context"
"net"
"goLearning/protobuf/proto"
"google.golang.org/grpc"
)
// MyInfo 结构体
type MyInfo struct {
proto.UnimplementedMyInfoServiceServer
}
// GetData 方法实现
func (m *MyInfo) GetData(ctx context.Context, req *proto.MyInfoRequest) (*proto.MyInfoResponse, error) {
return &proto.MyInfoResponse{
Name: req.Name,
Age: req.Age,
IsMarried: true,
}, nil
}
func main() {
// 创建 gRPC 服务实例
grpcServer := grpc.NewServer()
// 注册服务
proto.RegisterMyInfoServiceServer(grpcServer, &MyInfo{})
// 监听端口
listener, _ := net.Listen("tcp", ":8080")
// 启动 gRPC 服务
_ = grpcServer.Serve(listener)
}
客户端
在客户端,我通过拨号连接到 gRPC 服务端,然后实例化一个 gRPC 客户端,调用 GetData
方法,最后获取并输出响应信息。
package main
import (
"context"
"fmt"
"goLearning/protobuf/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
// 拨号连接服务端
conn, _ := grpc.Dial(":8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
// 实例化 gRPC 客户端
client := proto.NewMyInfoServiceClient(conn)
// 调用服务方法
response, _ := client.GetData(context.Background(), &proto.MyInfoRequest{
Name: "张三",
Age: 18,
IsMarried: false,
})
// 输出响应信息
fmt.Println(response)
}
注意事项
- 请确保已正确生成
.proto
文件对应的 Go 代码,并将导入路径替换为实际的路径。 - 建议添加错误处理,以捕获可能出现的异常,提升程序的健壮性。