- 确定好负责开发模块,起一个模块名称:如 hello
- 在 项目 idl 目录下 创建一个 **hello.thrift **idl 文件
创建的 idl 文件名称 为 模块名称 这里你要学会 thrift 语法使用 Apache Thrift - Home
- 定义服务 接口信息, 生成服务端客户端代码
namespace go hello
struct pingRequest {
1: string ping;
}
struct pingResponse {
1: string pong;
}
service HelloService {
pingResponse echo(1: pingRequest req)
}
项目根目录下生成客户端代码:kitex -module github.com/jjeejj/Hertz-Kitex-Micro-Service-Template ./idl/hello.thrift
进入到 server/cmd/ 目录下 先创建 对应的服务名称执行kitex -service hello -module github.com/jjeejj/Hertz-Kitex-Micro-Service-Template -use github.com/jjeejj/Hertz-Kitex-Micro-Service-Template/kitex_gen ../../idl/hello.thrift
-use 参数 生成服务端代码的时候不进行客户端生成,并且指定客户端的 import path 如果 thrift 文件如果有更新,就重新执行上面的 2 条命令
- 编写业务逻辑
默认生成的服务端代码格式为:
.
├── build.sh
├── handler.go
├── main.go
└── script
└── bootstrap.sh
如果逻辑比较简单直接在 handler.go 里面进行实现
如果比较复杂,进行**分包处理 **在 服务目录创建对应的包 services/【这里面在根据需求决定是否在创建新的包】,然后再 handler.go 中使用
我们不限制分包,但是一定要注意不能相互调用,有层级关系
- 编写更多的业务接口
当 **thrift **文件里面 一个 **service **里面的方法过多的时候 可以在创建一个新的 service
struct worldRequest {
1: string ping;
}
struct worldResponse {
1: string pong;
}
service WorldService {
worldRequest echo1(1: worldResponse req)
}
这个时候就不能执行上面的命令了,需要进行修改
参考官方文档:Combine Service
客户端生成代码:kitex --combine-service -module github.com/jjeejj/Hertz-Kitex-Micro-Service-Template ./idl/hello.thrift
服务端生成代码:kitex --combine-service -service hello -module github.com/jjeejj/Hertz-Kitex-Micro-Service-Template -use github.com/jjeejj/Hertz-Kitex-Micro-Service-Template/kitex_gen ../../idl/hello.thrift
这里需要注意的是:如果之前当 Service 有生成文件,需要手动处理一下 handler.go 文件
- 数据库Model 操作
首先在 hello.thrift 文件里面 定义 Model 文件
struct ModelHello {
1: i32 id (go.tag="mysql:\"primaryKey;column:id,index:idx_member,priority:1\"")
2: i32 deleteAt (go.tag="mysql:\"primaryKey;column:id;index:idx_member,priority:1\" json:\"id,omitempty\"")
}
后面的标签是对应的 gorm 的标签,字段如果有需要可以进行标记
执行生成客户端代码的命令 就会生成对应的 Model struct
type ModelHello struct {
Id int32 `thrift:"id,1" gorm:"primaryKey;column:id;index:idx_member,priority:1"`
DeleteAt int32 `thrift:"deleteAt,2" gorm:"primaryKey;column:delete_at;index:idx_member,priority:1" json:"id,omitempty"`
}
最后把生成的表结构创建到数据库中, 项目中 script/init/model.go 文件, 在下面的位置增加对应的 Model 然后执行就可以了
_ = db.AutoMigrate(
// 这里新增创建的 model
&hello.ModelHello{},
&model.User{},
)
目前我们一个对外暴露的API 服务 ,对应的 idl 文件为 **./idl/api.proto **定义对应的接口
message EchoRequest {
string ping = 1;
}
message EchoResponse {
string pong = 1;
}
service helloService {
rpc echo (EchoRequest) returns (EchoResponse) {option (api.get) = "/hello/echo";}
rpc echo1 (EchoRequest) returns (EchoResponse) {option (api.get) = "/hello/echo1";}
}
进入到对应的 APi 服务目录下执行下面的命令:hz update --idl ./../../../idl/api.proto --module github.com/jjeejj/Hertz-Kitex-Micro-Service-Template/server/cmd/api
会在 **biz/handler/api **目录下生成 生成对应的 **hello_service.go 文件 **
如果想在 api 服务中使用 hello rpc 服务,需要在 api 服务下的 **global/global.go **注册对应的客户端
package global
import (
"github.com/jjeejj/Hertz-Kitex-Micro-Service-Template/kitex_gen/auth/authservice"
helloservice "github.com/jjeejj/Hertz-Kitex-Micro-Service-Template/kitex_gen/hello/combineservice"
"github.com/jjeejj/Hertz-Kitex-Micro-Service-Template/server/cmd/api/config"
)
var (
ServerConfig = &config.ServerConfig{}
NacosConfig = &config.NacosConfig{}
AuthClient authservice.Client
HelloClient helloservice.Client
)
后面就可以在 hello_service.go 直接调用 rpc 方法了
func Echo(ctx context.Context, c *app.RequestContext) {
var err error
var req api.EchoRequest
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resPong, err := global.HelloClient.Echo(ctx, &hello.PingRequest{
Ping: req.Ping,
})
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(api.EchoResponse)
resp.Pong = resPong.Pong
c.JSON(consts.StatusOK, resp)
}