rpc模块的学习
如果会api模块的编写,rpc文件相差的并不是很多。
看这个目录,主要区别就是少了hander,多了server和最下边两个pb文件,以及client文件夹。
主要运行过程是,先将想要写的接口传入参数和传出参数写到proto文件中:
syntax = "proto3";
option go_package ="./pb"; //
package pb;
// 登录请求消息
message LoginRequest {
string userName = 1;
string password = 2;
}
// 登录响应消息
message UserLoginResponse {
string token = 1; // 修改为 token 而不是 Authorization 更符合常规
}
// 用户信息请求消息
message UserInfoRequest {
string authorization = 1; // 对应于请求头中的 Authorization
}
// 用户信息响应消息
message UserInfoResponse {
string userName = 1;
uint32 id = 2;
}
// 用户服务定义
service UserClient {
// 登录接口
rpc Login (LoginRequest) returns (UserLoginResponse);
// 获取用户信息接口
rpc GetUserInfo (UserInfoRequest) returns (UserInfoResponse);
}
// goctl rpc proto -src user.proto -dir .
具体写法可以去官方文档查看。
然后运行命令
goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
为了讲解明白,就用api层和rpc层接口一致来示例:
当我们生成rpc后,为了和api连接:先将rpc注册到etcd(能够让api发现)
为了让api连接,需要将api的config文件中加上rpc的etcd地址
(配置文件中添加etcd的地址和键,找指定的rpc的值)
还有最后一步,依赖注入。
由于我们要在api层调用rpc层的方法,肯定是要先声明userclient才能直接调用到里边的方法
至此,api和rpc的连接已经完成了,然后将api层的逻辑放入到rpc的logic中。
看一个示例:该方法为通过token获取用户信息的get请求。
api的logic层:
通过调用rpc层的方法返回该方法的响应info,返回info中的参数。
rpc层的logic:
具体的逻辑实现,解析token中的id和name,返回给api层的logic。
这个例子没有体现出数据库操作,具体的,当涉及到数据库时,将model层和rpc层与api层并列,让rpc调用到model层的方法,让api层调用rpc层的方法实现。