grpc初使用全攻略

grpc里的客户端可以像调用本地对象一样,直接调用另一台机器上服务端的应用

一、什么是gRPC

  • 在服务端实现一个接口,定义一个服务,指定能被远程调用的方法,并运行一个gRPC服务来处理客户端调用
  • 用proto files创建gRPC服务,用protocol buffers消息类型定义方法参数和返回类型。

1. 支持的语言:

  • Go、python、ruby、C++、Java、node.js、C#、PHP、Android Java、Objective-C

2. protocol buffers

  • 默认消息类型:protocol buffers(Google开源的一套结构数据序列化机制)
  • 也可用json
  • 现在常用proto3,因为proto3可以使用grpc支持的全部范围的语言,并且能避免proto2客户端与proto3服务端交互时出现的兼容问题

二、使用

1. 分为三步

  1. 通过protocol buffers定义一个RPC服务
  2. 创建一个实现这个接口的服务端
  3. 访问服务端

2. python实现

1) 定义一个服务
  • helloworld.proto

}
2) 生成grpc代码
  • 用定义的服务,使用protocol buffer编译器protoc生成创建应用所需的特定客户端和服务端代码
python

protoc -I …/…/protos --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=which grpc_python_plugin …/…/protos/helloworld.proto

  • 生成了helloworld_pb2.py
Go

protoc -I …/protos …/protos/helloworld.proto --go_out=plugins=grpc:helloworld

  • 生成了helloworld.pb.go
3)写服务来访问
python
  • greeter_server.py

    class Greeter(helloworld_pb2.BetaGreeterServicer)def SayHello(self, request, context)return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
    
  • 为了返回给客户端应答并且完成调用:

  1. 用我们的激动人心的消息构建并填充一个在我们接口定义的 HelloReply 应答对象。
  2. 将 HelloReply 返回给客户端。
Go
  • greeter_server/main.go 实现了 Greeter 服务所需要的行为。
  • 正如你所见,服务器有一个 server 结构。它通过实现 sayHello 方法,实现了从 proto 服务定义生成的GreeterServer 接口:
// server is used to implement helloworld.GreeterServer.
type server struct{}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
  return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
  • 为了返回给客户端应答并且完成调用:
  1. 用我们的激动人心的消息构建并填充一个在我们接口定义的 HelloReply 应答对象。
  2. 将 HelloReply 返回给客户端。
4) 服务端实现
  • 在这里我们创建了合理的 gRPC 服务器,将我们实现的 Greeter 服务绑定到一个端口。
  • 然后我们启动服务器:服务器准备好从 Greeter 服务客户端接收请求
python
- greeter_server.py
```python
server = helloworld_pb2.beta_create_Greeter_server(Greeter())
server.add_insecure_port('[::]:50051')
server.start()
try:
  while True:
    time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
  server.stop()
```
go
  • greeter_server/main.go
    const (
      port = ":50051"
    )
    ...
    func main() {
      lis, err := net.Listen("tcp", port)
      if err != nil {
          log.Fatalf("failed to listen: %v", err)
      }
      s := grpc.NewServer()
      pb.RegisterGreeterServer(s, &server{})
      s.Serve(lis)
    }
    
5) 写一个客户端
  • 用生成的代码写一个简单的客户程序来访问我们在上边创建的 Greeter 服务器
  • 连接服务器:
    • 需要创建一个 gRPC 频道,指定我们要连接的主机名和服务器端口。然后我们用这个频道创建存根实例
Python
  • 生成的 Python 代码有一个根据频道创建存根的帮助方法。
    channel = implementations.insecure_channel('localhost', 50051)
    stub = helloworld_pb2.beta_create_Greeter_stub(channel)
    ...
    
Go
const (
  address     = "localhost:50051"
  defaultName = "world"
)
func main() {
  // Set up a connection to the server.
  conn, err := grpc.Dial(address)
  if err != nil {
      log.Fatalf("did not connect: %v", err)
  }
  defer conn.Close()
  c := pb.NewGreeterClient(conn)
...
}
  • 在 gRPC Go 你是使用一个特殊的 Dial() 方法来创建频道。
6) 调用RPC
  • 联系服务并获得一个 greeting
  1. 创建并填充一个 HelloRequest 发送给服务。
  2. 我们用请求调用存根的 SayHello(),如果 RPC 成功,会得到一个填充的 HelloReply ,从其中我们可以获得 greeting
python
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), _TIMEOUT_SECONDS)
print "Greeter client received: " + response.message
Go
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
      log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值