跳到主要内容

使用 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 代码,并将导入路径替换为实际的路径。
  • 建议添加错误处理,以捕获可能出现的异常,提升程序的健壮性。