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”。
整个的输出结果是:
- xtimer.pb.go:提供对字段的get,set方法等
- xtimer_grpc.pb.go:提供一个
client以及一个server供外部调用 - 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)序列化,通过网络连接发送到服务端,然后等待并解码服务端的响应。