tangs b030ce89ca openbilibili | 5 лет назад | |
---|---|---|
.. | ||
bmgen | 5 лет назад | |
protoc-gen-bm | 5 лет назад | |
CHANGELOG.md | 5 лет назад | |
CONTRIBUTORS.md | 5 лет назад | |
OWNERS | 5 лет назад | |
README.md | 5 лет назад |
根据protobuf文件,生成grpc和blademaster框架http代码及文档
syntax = "proto3";
package department.app;
option go_package = "api";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service Greeter{
// api 标题
// api 说明
rpc SayHello(HelloRequest) returns (HelloResponse);
}
message HelloRequest {
// 请求参数说明
string param1 = 1 [(gogoproto.moretags) = 'form:"param1"'];
}
message HelloResponse {
// 返回字段说明
string ret_string = 1 [(gogoproto.jsontag) = 'ret_string'];
}
GET /department.app.Greeter/SayHello?param1=p1
响应
{
"code": 0,
"message": "ok",
"data": {
"ret_string": "anything"
}
}
路径 /department.app.Greeter/SayHello
go install go-common/app/tool/bmproto/...
import pb "path-to-project/api"
....
// 实现 pb.GreeterBMServer 和 grpc的 pb.GreeterServer
type GreeterService struct {
}
func (s *GreeterService) SayHello(ctx context.Context, req *pb.SayHelloRequest)
(resp *pb.SayHelloResp, err error) {
}
route
方法)里加入代码import pb "path-to-project/api"
import svc "path-to-project/internal/service"
......
pb.RegisterGreeterBMServer(engine, &svc.GreeterService{})
pb.RegisterGreeterServer(grpcServer, &svc.GreeterService{})
curl 127.0.0.1:8000/department.app.Greeter/SayHello
(默认路由规则为 /package.service/method
)project-
|------|--internal/service/greeter.go (使用bmgen -t 会生成,如果proto新增加方法,会自动往这里面添加模板代码)
|--api/
|--api.greeter.md (HTTP API文档)
|--api.bm.go
|--api.pb.go
|--api.proto
部门.服务
并且去掉中划线department.helloworld
, 文件目录为api/第二个版本package `department.helloworld.v2", 目录为api/v2
golang一般原则上保持包名和目录名一致
proto 可以指定option go_package = "xxx";
比如对于api/api.proto option go_package = "api";
对于api/v2/api.proto option go_package = "v2";
一个文件夹下面可以有多个proto文件,但是要满足以下约束
在RegisterXXBMServer之前加入代码
bm.Inject(pb.PathGreeterSayHello, middleware1, middleware2)
.....
package department.app;
....
import "google/api/annotations.proto";
....
service Greeter{
rpc SayHelloCustomUrl(HelloRequest) returns (HelloResponse) {
option (google.api.http) = {
get:"/say_hello" // GET /say_hello
};
};
rpc SayHelloPost(HelloRequest) returns (HelloResponse) {
option (google.api.http) = {
post:"" // POST /department.app.Greeter/SayHelloPost
};
};
}
bmgen -t
生成service模板代码在 internal/service/serviceName.go
对于HTTP接口
现在请求字段需要加上form tag以解析请求参数,
响应参数需要加上json tag 以避免 字段为0或者空字符串时不显示,
这两个tag都建议和字段名保持一致
现在是必须加,将来考虑维护一个自己的proto仓库,以移除这个多余的tag
...
import "github.com/gogo/protobuf/gogoproto/gogo.proto"
...
message Request {
int param1 = 1 [(gogoproto.moretags) = 'validate:"required"')]; // 参数必传,不能等于0
}
bmgen -l
curl 127.0.0.1:8000/department.app.Greeter/SayHello -H "Content-Type: application/json" -d "{"param1":"p1"}" -X POST
对于以下"兼容直播服务列表中的服务"有效
api/api.proto
service Greeter {
// `method:"POST"` // 表示请求方法为POST
// `midware:"user"`
rpc SayHello(A) returns (B);
}
// server/http/http.go
import bm "go-common/library/net/http/blademaster"
....
userAuthMiddleware := xxxxx
pb.RegisterXXService(e, svc, map[string]bm.HandlerFunc{"user":userAuthMiddleware})
注解列表:
| key | 位置 | 说明 | | ------------ | --------------------- | ------------------------------------------------------------ | | midware | rpc method上方 | midware:"auth,verify" 中间件,auth 是验证登录态,verify是校验签名, | | method | rpc method上方 | method:"POST" 指定http请求方法 | | mock | 响应message的字段上方 | mock:"mockdata" mock数据,生成文档的时候有用 | | internal | 不建议继续使用 | 不建议继续使用 | | dynamic | 不建议继续使用 | 不建议继续使用 | | dynamic_resp | 不建议继续使用 | 不建议继续使用 |