Contents

记录下学习使用kratos的过程

学习源

步骤及总结

新建微服务模块、版本模块:

1
2
kratos new user
kratos proto add api/user/v1/user.proto

编写proto文件,记录下简单的使用,详情见官网

  • message 定义结构体,其中的字段表示结构体的字段
  • 先定义远程方法中的接收结构体以及响应结构体
  • 再使用service 定义微服务接口,以及待实现的远程方法

输出微服务的go文件

1
make api
  • grpc.go中是定义了客户端的,可以把这个proto文件发到任意客户端,用protoc生成指定的语言,比如带上参数 –cpp_out生成cpp文件,可以明确知道这个微服务定义了哪些方法
  • protoc的具体命令在Makefile中
  • PS:输出proto文件中的rpc部分,需要带上参数参考
1
protoc --go_out=plugins=grpc:. *.proto

修改service/user/internal/conf/conf.proto,字段需与configs下面的配置保持一致

  • 为什么是configs?这是main.go在调用的时候传的参数(写在init()中的)
  • 先看下conf.proto,一个Bootstrap结构体中包含了两个字段,一个server,一个data,分别对应上层目录中相邻的模块目录,data模块主要是负责数据库的建立,以及数据表模型的CRUD;server则是决定rpc的连接方式。先这样,生成下config的go文件
1
make config
  • 然后更改下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中

1
var  ProviderSet = wire.NewSet(NewUserUsecase)
  • 可以在cmd/user中看到wire.go(这个文件是不经过IDE校验的——无法ctl+鼠标点击到相应方法,这是由于前两行),通过在该文件夹下执行 wire 命令,可以自动生成wire_gen.go

  • 在wire.go中,wire.build参数不仅有上面的各个ProviderSet,还有一个main.go中的函数newApp(),然后发起了一次依赖的自行实例化,返回一个kratos.App指针

  • 入口文件main.go中就是获取配置,使kratos.App跑起来

1
kratos run

测试相关

ginkgo 文档

  • 先在需要测试的目录中,编写*_suit_test.go,比如:data层目录;在BeforeSuite方法中连接数据库,在AfterSuite可以打印一些结束标志吧;然后再user_test.go中编写user.go的相关测试用例

  • 使用gomock,需要对指定接口生成mock文件,参考;这里需要注意下**“user/internal/biz”**,这个需要写完整,而不能写 .

1
mockgen -destination=../mock/mrepo/user.go -package=mrepo "user/internal/biz" UserRepo
  • 为了方便,可以在UserRepo接口上添加这句,方法有变动,方便重新生成
1
//go:generate mockgen -destination=../mock/mrepo/user.go -package=mrepo "user/internal/biz" UserRepo

使用kratos封装的consul的一些坑, 官方示例

shop/configs/config.yaml ;写成 “discovery:///shop.user.service” , 会报 “endpoint found,refused to write” ;还是得改成"127.0.0.1:50052",才能调用。

coffee