go学习笔记——Kratos框架
官方文档
1 | https: //go-kratos .dev /en/docs/getting-started/start/ |
1.安装Go
参考:mac安装go1.20
2.安装Kratos框架
kratos依赖protobuf grpc等框架,需要先进行安装
1 2 3 4 | brew install grpc brew install protobuf brew install protoc-gen-go brew install protoc-gen-go-grpc |
验证
1 2 3 | protoc --version protoc-gen-go --version protoc-gen-go-grpc --version |
安装kratos框架
1 | go install github.com /go-kratos/kratos/cmd/kratos/v2 @latest |
3.创建项目
1 2 3 4 | # 创建项目 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 | 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 | # command-line-arguments . /main .go:77:23: undefined: wireApp |
同时还需要额外指定conf文件的路径,否则会报
1 | panic: stat ../.. /configs : no such file or directory |
配置如下
1 | -conf . /configs/config .yaml |
其中config.yaml的路径是相对于Working directory的,如果有多个config文件,也可以写文件夹,比如
1 | -conf . /configs |
或者修改成package,指定成package path
debug成功
如果想要添加额外的API,需要先添加proto文件
1 | kratos proto add api /helloworld/demo .proto |
编译proto文件生成model和grpc代码
1 | kratos proto client api /helloworld/demo/demo .proto |
或者使用make命令
1 | make api |
注意make api命令无法生成validate验证代码,需要额外使用make validate命令,但是kratos proto client命令是可以的
参考:https://go-kratos.dev/docs/component/middleware/validate/
生成service模板代码
1 | 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 | 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 | 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 | kratos_http "github.com/go-kratos/kratos/v2/transport/http" |
参考:kratos v2 基于http Filter 编写鉴权拦截器 和 Go Kratos2.0 Http请求如何获取IP地址(Filter,Middleware)
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/18183178
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步