《从零单排Golang》系列,又重新开张了。后续会不定期更新自己学习Golang
的笔记跟心得。
这次的话,就介绍一款名为奎爷kratos
的微服务框架,以及讲述一下基础的使用机理。
kratos
是B站开源的微服务框架,不仅提供了grpc
、http
协议支持,而且有较为完善的层级架构、微服务中间件以及第三方组件的编写约定,可以说是非常方便上手跟扩展。
要上手kratos
,我们可以从两个地方入手:
- kratos-github
- kratos官方文档
通过kratos
的quickstart文档,我们可以创建一个名为kratostest
的项目。项目的目录结构遵循kratos-layout,具体如下:
api
:接口定义,主要是proto文件- 需要生成
go
文件给到internal
或者service
模块做请求处理实现的编写
- 需要生成
cmd
:main.go
与wire.go
configs
:配置yaml
internal
:biz
:业务逻辑- 若相较于
controller
或handler
,则类似于service
的概念 - 此
service
不是指kratos
的service
- 若相较于
conf
:配置data
:数据访问server
:对外服务service
:类似于controller
、handler
third_party
:第三方内容
kratostest
项目在启动之前,除了需要go-protobuf
环境把proto
文件编译成go
文件之外,默认还需要通过wire
模块自动初始化对象实例。wire
是一种在golang
里实现依赖注入的解决方案,可以参考以下文档,了解wire
的作用:
- wire-github
wire
介绍博客
从使用角度上来说,实际上经过了如下的步骤:
- 解析各个Provider接口出入参的实现
- 根据不同Provider出入参的依赖关系,生成实际的初始化代码,填充入参,实现注入的效果
以http-server
的基础greeter
接口为例,存在着这样的调用层次:
NewHTTPServer
:在internal/server/http.go
,生成HTTPServer
实例- 入参有
conf.Server
实例,是服务器启动的配置,可以通过internal/conf/conf.proto
生成configs/config.yaml
实际配置这些内容
- 入参
*service.GreeterService
,该实例需要实现GreeterHTTPServer
的接口定义 GreeterHTTPServer
的接口定义实际是由greeter.proto
定义之后自动生成的
- 入参有
NewGreeterService
:在internal/service/greeter.go
,生成GreeterService
实例- 在这里需要实现
GreeterHTTPServer
的接口定义 - 需要定义
biz
层成员*biz.GreeterUsecase
,在接口实现会调用这个成员方法执行实际业务
- 在这里需要实现
NewGreeterUsecase
:在internal/biz/greeter.go
,生成GreeterUsecase
实例- 需要定义
GreeterRepo
类型成员,用来做数据的CRUD
- 需要定义
NewGreeterRepo
:在internal/data/greeter.go
,生成GreeterRepo
实例- 需要定义
*Data
类型成员,用来做实际对接数据库的访问操作
- 需要定义
NewData
:在internal/data/data.go
,生成*Data
实例- 入参有
conf.Data
实例,是数据库的配置,可以通过internal/conf/conf.proto
生成 - 这些方法可以打包成
wire
的ProviderSet
,然后一并Build
起来
- 入参有
1 | // cmd/kratostest/main.go |
在cmd/kratostest
执行了wire
之后,就会把这些依赖注入,代码重新组装起来,最后生成wire_gen.go
文件。
1 | func wireApp(confServer *conf.Server, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) { |
wire_gen.go
的wireApp
,最终会在main.go
里实际执行,从而真正启动整个kratostest
服务和各层的对象实例。
1 | func main() { |
这样,整个kratos
服务的基础逻辑结构就顺起来了。