You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.3 KiB
61 lines
2.3 KiB
# 介绍
|
|
|
|
基于proto文件可以快速生成`bm`框架对应的代码,提前需要准备以下工作:
|
|
|
|
* 安装`kratos tool protoc`工具,请看[kratos工具](kratos-tool.md)
|
|
* 编写`proto`文件,示例可参考[kratos-demon内proto文件](https://github.com/bilibili/kratos-demo/blob/master/api/api.proto)
|
|
|
|
# kratos工具说明
|
|
|
|
`kratos tool protoc`工具可以生成`warden` `bm` `swagger`对应的代码和文档,想要单独生成`bm`代码只需加上`--bm`如:
|
|
|
|
```shell
|
|
// generate BM HTTP
|
|
kratos tool protoc --bm api.proto
|
|
```
|
|
|
|
### proto文件说明
|
|
|
|
请注意想要生成`bm`代码,需要特别在`proto`的`service`内指定`google.api.http`配置,如下:
|
|
|
|
```proto
|
|
service Demo {
|
|
rpc SayHello (HelloReq) returns (.google.protobuf.Empty);
|
|
rpc SayHelloURL(HelloReq) returns (HelloResp) {
|
|
option (google.api.http) = { # 该配置指定SayHelloURL方法对应的url
|
|
get:"/kratos-demo/say_hello" # 指定url和请求方式为GET
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
# 使用
|
|
|
|
建议在项目`api`目录下编写`proto`文件及生成对应的代码,可参考[kratos-demo内的api目录](https://github.com/bilibili/kratos-demo/tree/master/api)。
|
|
|
|
执行命令后生成的`api.bm.go`代码,注意其中的`type DemoBMServer interface`和`RegisterDemoBMServer`,其中:
|
|
|
|
* `DemoBMServer`接口,包含`proto`文件内配置了`google.api.http`选项的所有方法
|
|
* `RegisterDemoBMServer`方法提供注册`DemoBMServer`接口的实现对象,和`bm`的`Engine`用于注册路由
|
|
* `DemoBMServer`接口的实现,一般为`internal/service`内的业务逻辑代码,需要实现`DemoBMServer`接口
|
|
|
|
使用`RegisterDemoBMServer`示例代码请参考[kratos-demo内的http](https://github.com/bilibili/kratos-demo/blob/master/internal/server/http/server.go)内的如下代码:
|
|
|
|
```go
|
|
engine = bm.DefaultServer(hc.Server)
|
|
pb.RegisterDemoBMServer(engine, svc)
|
|
initRouter(engine)
|
|
```
|
|
|
|
`internal/service`内的`Service`结构实现了`DemoBMServer`接口可参考[kratos-demo内的service](https://github.com/bilibili/kratos-demo/blob/master/internal/service/service.go)内的如下代码:
|
|
|
|
```go
|
|
// SayHelloURL bm demo func.
|
|
func (s *Service) SayHelloURL(ctx context.Context, req *pb.HelloReq) (reply *pb.HelloResp, err error) {
|
|
reply = &pb.HelloResp{
|
|
Content: "hello " + req.Name,
|
|
}
|
|
fmt.Printf("hello url %s", req.Name)
|
|
return
|
|
}
|
|
```
|
|
|