记录下学习使用kratos的过程
Contents
学习源
主要是:Go-kratos 框架商城微服务实战之用户服务 (一) 初识 Kratos 框架 ,给出了写个微服务的流程、顺序
另一个是kratos的官方示例:Kratos/beer-shop
总地来说,kratos对于小白来说很多都是抛砖引玉的好知识,比如wire、proto、consul、测试及日志的使用。
步骤及总结
新建微服务模块、版本模块:
|
|
编写proto文件,记录下简单的使用,详情见官网
- message 定义结构体,其中的字段表示结构体的字段
- 先定义远程方法中的接收结构体以及响应结构体
- 再使用service 定义微服务接口,以及待实现的远程方法
输出微服务的go文件
|
|
- grpc.go中是定义了客户端的,可以把这个proto文件发到任意客户端,用protoc生成指定的语言,比如带上参数 –cpp_out生成cpp文件,可以明确知道这个微服务定义了哪些方法
- protoc的具体命令在Makefile中
- PS:输出proto文件中的rpc部分,需要带上参数参考
|
|
修改service/user/internal/conf/conf.proto,字段需与configs下面的配置保持一致
- 为什么是configs?这是main.go在调用的时候传的参数(写在init()中的)
- 先看下conf.proto,一个Bootstrap结构体中包含了两个字段,一个server,一个data,分别对应上层目录中相邻的模块目录,data模块主要是负责数据库的建立,以及数据表模型的CRUD;server则是决定rpc的连接方式。先这样,生成下config的go文件
|
|
- 然后更改下configs中的配置
现在该写下data层了
- data.go负责数据库连接生成
- user.go中定义数据表结构体,主要负责数据库层面的CRUD。定义字段类型时,要注意与user.proto生成中的类型是否一致,如果不一致的话,需要在返回类型中转换成user.proto中定义的类型,比如birthday字段
再看看biz层
- 这一层是业务逻辑层
- 根据data层返回的数据,进行业务整理
- 可以看出biz是依赖于data的
再看看server层
- grpc.go中定义了一个生成grpc服务的方法,关键参数是UserService,这指定了这次微服务的 主角
那就看看service层,UserService
- 这个接口是要实现由user.proto生成的v1.UserServer接口
- 需要继承v1.UnimplementedUserServer,这是一个针对客户端调取不存在的远程方法的错误处理
- 也是因为go是鸭子语言,在编写UserService时,对实现接口的方法不敏感,可能写的方法名与v1.UserServer接口定义的不一致;当然它的好处是,不妨碍调用已实现的方法
- 这个UserService是依赖于biz层的,主要是负责通过biz层处理结果整理相应远程函数的返回数据格式
那么这些层是怎么串起来的呢
- 先整理下依赖关系
server->service->biz->data
当然可以手动生成各部分依赖,不过有更简单地方式:wire
在各层中,server.go、service.go、biz.go、data.go中都将各自的逻辑放到了provider中
|
|
可以在cmd/user中看到wire.go(这个文件是不经过IDE校验的——无法ctl+鼠标点击到相应方法,这是由于前两行),通过在该文件夹下执行 wire 命令,可以自动生成wire_gen.go
在wire.go中,wire.build参数不仅有上面的各个ProviderSet,还有一个main.go中的函数newApp(),然后发起了一次依赖的自行实例化,返回一个kratos.App指针
入口文件main.go中就是获取配置,使kratos.App跑起来
|
|
测试相关
ginkgo 文档
先在需要测试的目录中,编写*_suit_test.go,比如:data层目录;在BeforeSuite方法中连接数据库,在AfterSuite可以打印一些结束标志吧;然后再user_test.go中编写user.go的相关测试用例
使用gomock,需要对指定接口生成mock文件,参考;这里需要注意下**“user/internal/biz”**,这个需要写完整,而不能写 . 。
|
|
- 为了方便,可以在UserRepo接口上添加这句,方法有变动,方便重新生成
|
|