grpc/

directory
v0.0.0-...-f5108b3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 8, 2024 License: MIT

README

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
  1. pb.go: protoc-gen-go
  2. grpc.pb.go: protoc-gen-go-grpc

生成的代码

  1. 客户端接口约束
// 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)
}
  1. 客户端的具体的实现:
func NewHelloServiceClient(cc grpc.ClientConnInterface) HelloServiceClient {
	return &helloServiceClient{cc}
}
  1. 服务端接口约束
// 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()
}
  1. 服务端的注册函数(把具体实现注册给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)
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL