grpc
接口定义(IDL)
protobuf 如何定义接口
// service 声明一个接口定义 ---> type HelloService interface
service HelloService {
// Hello(HelloRequest, HelloResponse)
rpc Hello(HelloRequest) returns (HelloResponse);
}
插件安装与执行
需要安装grpc插件
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc -I=. --go_out=. --go_opt=module="gitee.com/go-course/go12/skills" --go-grpc_out=. --go-grpc_opt=module="gitee.com/go-course/go12/skills" grpc/hello/interface.proto
- pb.go: protoc-gen-go
- grpc.pb.go: protoc-gen-go-grpc
生成的代码
- 客户端接口约束
// HelloServiceClient is the client API for HelloService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type HelloServiceClient interface {
// Hello(HelloRequest, HelloResponse)
Hello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error)
}
- 客户端的具体的实现:
func NewHelloServiceClient(cc grpc.ClientConnInterface) HelloServiceClient {
return &helloServiceClient{cc}
}
- 服务端接口约束
// HelloServiceServer is the server API for HelloService service.
// All implementations must embed UnimplementedHelloServiceServer
// for forward compatibility
type HelloServiceServer interface {
// Hello(HelloRequest, HelloResponse)
Hello(context.Context, *HelloRequest) (*HelloResponse, error)
mustEmbedUnimplementedHelloServiceServer()
}
- 服务端的注册函数(把具体实现注册给grpc框架)
func RegisterHelloServiceServer(s grpc.ServiceRegistrar, srv HelloServiceServer) {
s.RegisterService(&HelloService_ServiceDesc, srv)
}
grpc 服务端实现
func (i *HelloServiceImpl) Hello(
ctx context.Context,
in *hello.HelloRequest) (
*hello.HelloResponse,
error) {
resp := &hello.HelloResponse{}
resp.Message = fmt.Sprintf("hello, %s", in.Name)
return resp, nil
}
grpc 客户端实现
自动生成
c := hello.NewHelloServiceClient(conn)
resp, err := c.Hello(context.Background(), &hello.HelloRequest{Name: "bob"})
if err != nil {
panic(err)
}