tonglin0325的个人主页

go学习笔记——Kratos框架

官方文档

1
2
https://go-kratos.dev/en/docs/getting-started/start/

1.安装Go#

参考:mac安装go1.20

2.安装Kratos框架#

kratos依赖protobuf grpc等框架,需要先进行安装

1
2
3
4
5
brew install grpc
brew install protobuf
brew install protoc-gen-go
brew install protoc-gen-go-grpc

验证

1
2
3
4
protoc --version
protoc-gen-go --version
protoc-gen-go-grpc --version

安装kratos框架

1
2
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest

3.创建项目#

1
2
3
4
5
# 创建项目
kratos new helloworld
# 也可以指定仓库
kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git

编译项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cd helloworld

# 安装依赖
make init

# 生成wire依赖注入
go generate ./...
# 或者使用make
make generate

# 生成bin执行文件
go build -o ./bin/ ./...
# 或者使用make
make build

# 运行
./bin/helloworld -conf ./configs
或者
kratos run

# 测试
curl 'http://127.0.0.1:8000/helloworld/kratos'
{"message":"Hello kratos"}%

项目结构

Kratos项目如果想要使用debug模式来运行

需要将run kind从File修改成Directory,并指定Directory为main.go和wire_gen.go所在的目录,否则会报

1
2
3
# command-line-arguments
./main.go:77:23: undefined: wireApp

同时还需要额外指定conf文件的路径,否则会报

1
2
panic: stat ../../configs: no such file or directory

配置如下

1
2
-conf ./configs/config.yaml

其中config.yaml的路径是相对于Working directory的,如果有多个config文件,也可以写文件夹,比如

1
2
-conf ./configs

或者修改成package,指定成package path

debug成功

如果想要添加额外的API,需要先添加proto文件

1
2
kratos proto add api/helloworld/demo.proto

编译proto文件生成model和grpc代码

1
2
kratos proto client api/helloworld/demo/demo.proto

或者使用make命令

1
2
make api

注意make api命令无法生成validate验证代码,需要额外使用make validate命令,但是kratos proto client命令是可以的

参考:https://go-kratos.dev/docs/component/middleware/validate/

生成service模板代码

1
2
kratos proto server api/helloworld/demo/demo.proto -t internal/service

参考文档:从0到1安装启动Kratos框架https://go-kratos.dev/en/docs/getting-started/usage

4.Example项目#

1
2
https://github.com/go-kratos/examples

5.Middleware#

区别于gin的middleware实现的是gin.HandlerFunc以及在gin中基于http.Handler的实现,参考:
 go学习笔记——gin框架

1.Kratos的middleware.Middleware#

kratos的middleware需要实现的是middleware.Middleware,可以参考官方例子:https://github.com/go-kratos/examples/blob/main/i18n/internal/pkg/middleware/localize/localize.go

可以通过context的transport中获得header等信息

在middleware之后执行某些逻辑使用

 

1
2
3
4
defer func() {
// Do something on exiting
}()

 

 参考:https://go-kratos.dev/docs/component/middleware/overview/

middleware中设置header,参考:go kratos框架跨域中间件实现(v2)

其他:go微服务框架Kratos笔记(七)使用jwt认证中间件

 

2.在middle.Middleware中使用白名单#

参考:https://github.com/go-kratos/beer-shop/blob/main/app/shop/interface/internal/server/http.go#L21

3.Kratos中使用net/http包的http.Handler#

如果想在kratos中使用http.Handler,可以参考官方例子:https://github.com/go-kratos/examples/blob/main/http/middlewares/middlewares.go

以及 https://github.com/tx7do/kratos-cms/blob/main/backend/pkg/middleware/auth/auth.go 或者 04-参数校验中间件

4.Kratos中使用kratos的http包的http.FilterFunc#

需要引入

1
2
kratos_http "github.com/go-kratos/kratos/v2/transport/http"

参考:kratos v2 基于http Filter 编写鉴权拦截器Go Kratos2.0 Http请求如何获取IP地址(Filter,Middleware)