go-grpc的使用

34 阅读2分钟

proto文件

编写proto文件

service XTimer {
  rpc CreateTimer (CreateTimerRequest) returns (CreateTimerReply){
   option (google.api.http) = {
    post: "/xtimer/create_timer",
    body: "*"
   };
  };
  rpc EnableTimer (EnableTimerRequest) returns (EnableTimerReply){
   option (google.api.http) = {
    post: "/xtimer/enable_timer",
    body: "*"
   };
  };
}

message CreateTimerRequest{
  string app = 1;
  string name = 2;
  int32 status = 3;
  string cron =4 ;
  NotifyHTTPParam notifyHTTPParam = 5;
}

如何理解里面的内容:

  rpc CreateTimer (CreateTimerRequest) returns (CreateTimerReply){
   option (google.api.http) = {
    post: "/xtimer/create_timer",
    body: "*"
   };
  };
  

其中:

  • rpc CreateTimer (...) : 定义一个远程过程调用方法。

    • 方法名: CreateTimer
    • 输入参数: (CreateTimerRequest),规定了调用此方法需要传入我们上一步定义的 CreateTimerRequest 消息。
    • 返回值: returns (CreateTimerReply),规定了此方法会返回一个 CreateTimerReply 消息。
  • option (google.api.http) : 这是一个注解。它不是gRPC的核心部分,而是对gRPC服务的扩展。它告诉特定的插件(这里是protoc-gen-go-http):“除了标准的gRPC接口,我希望你还为我生成一个HTTP/JSON接口,它的路由是POST /xtimer/create_timer”。

整个的输出结果是:

  1. xtimer.pb.go:提供对字段的get,set方法等
  2. xtimer_grpc.pb.go:提供一个client以及一个server供外部调用
  3. xtimer_http.pb.go:

grpc_pb.go

它为gRPC通信协议生成了服务端存根 (Server Stub)客户端存根 (Client Stub)

对服务端而言 (供我们实现)
  • XTimerServer 接口 :这是最重要的部分。它是一个 Go 接口,其中定义了所有.proto 文件中声明的 RPC 方法(如 CreateTimer, EnableTimer) 。 我们的业务逻辑代码必须实现这个接口

  • UnimplementedXTimerServer 结构体:一个辅助结构体,为 XTimerServer 接口的所有方法提供了默认的“未实现”错误返回。服务实现必须嵌入它,以确保向前兼容性——即未来在 .proto 中增加新方法时,旧的服务代码不会出现编译错误。

  • RegisterXTimerServer 函数 :这是一个注册函数。它的作用是将你实现的、包含了业务逻辑的服务(XTimerServer 接口的实现)“挂载”到 gRPC 服务器实例上。

  • 请求处理器 (_XTimer_..._Handler) :为每个 RPC 方法生成一个内部的处理器函数。它负责底层的请求分发、解码传入的请求数据、调用拦截器,并最终调用你实现的业务逻辑方法。

对客户端而言
  • XTimerClient 接口:定义了客户端可以调用的所有远程方法。
  • xTimerClient 结构体:这是 XTimerClient 接口的具体实现。它持有一个到服务器的 gRPC 连接,并封装了所有远程调用的底层细节。
  • NewXTimerClient 函数:一个构造函数。在客户端与服务器建立连接后,通过调用这个函数来创建一个可以发起 RPC 调用的客户端实例。
  • 方法实现 (例如 (c *xTimerClient) CreateTimer(...)) :这些是生成好的、可直接调用的方法。当你调用它时,它内部会自动将你的请求数据(如 CreateTimerRequest)序列化,通过网络连接发送到服务端,然后等待并解码服务端的响应。