一旦服务定义准备就绪,就可以使用 protocol buffers 编译器 protoc 来生成服务器端和客户端的代码了。借助 gRPC 的 protocol buffers 插件,可以生成 gRPC 服务器端代码、客户端代码以及常规的 protocol buffers 代码,从而填充、序列化和检索消息类型。
在服务器端,需要实现该服务定义,并运行 gRPC 服务器来处理客户端的调用。因此,为了让服务器端的 ProductInfo 服务完成其任务,需要先做以下两件事情。
- 通过重载服务基类,实现所生成的服务器端骨架的逻辑。
- 运行 gRPC 服务器,监听来自客户端的请求并返回服务响应。
要实现服务逻辑,首先要根据服务定义生成服务器端骨架。例如,在代码清单 1-2 中,可以看到使用 Go 语言为 ProductInfo 服务所生成的远程函数。在这些远程函数体中,我们可以实现每个函数的逻辑。
import (
...
"context"
pb "github.com/grpc-up-and-running/samples/ch02/productinfo/go/proto"
"google.golang.org/grpc"
...
)
// 使用Go语言的ProductInfo实现
// 添加商品的远程方法
func (s *server) AddProduct(ctx context.Context, in *pb.Product) (
*pb.ProductID, error) {
// 业务逻辑
}
// 获取商品的远程方法
func (s *server) GetProduct(ctx context.Context, in *pb.ProductID) (
*pb.Product, error) {
// 业务逻辑
}
当服务实现准备就绪之后,接下来需要运行 gRPC 服务器,从而监听来自客户端的请求,将这些请求分发到服务实现,并将服务的响应返回到客户端。代码清单 1-3 展示了 ProductInfo 服务用例,其中使用 Go 语言来编写 gRPC 服务器实现。另外,这里打开了一个 TCP 端口并启动了 gRPC 服务器,同时在该服务器上注册了 ProductInfo 服务。
func main() {
lis, _ := net.Listen("tcp", port)
s := grpc.NewServer()
pb.RegisterProductInfoServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
这就是服务器端要做的所有事情了。接下来看一下 gRPC 的客户端实
现。
文档更新时间: 2023-09-02 03:23 作者:Minho