Kratos 集成Gin
Kratos 集成 Gin
- 规范项目分层
- 处理请求处理、响应
- 编写路由route
- Kratos 集成gin
- 注入 wire set中
源码
Kratos 可以在 .proto
文件定义请求类型,URL,响应等等,如官方示例:
service BlogService {rpc CreateArticle (CreateArticleRequest) returns (CreateArticleReply) {option (google.api.http) = {post: "/v1/article/"body: "*"};}rpc UpdateArticle (UpdateArticleRequest) returns (UpdateArticleReply) {option (google.api.http) = {put: "/v1/article/{id}"body: "*"};}rpc DeleteArticle (DeleteArticleRequest) returns (DeleteArticleReply) {option (google.api.http) = {delete: "/v1/article/{id}"};}rpc GetArticle (GetArticleRequest) returns (GetArticleReply) {option (google.api.http) = {get: "/v1/article/{id}"};}rpc ListArticle (ListArticleRequest) returns (ListArticleReply) {option (google.api.http) = {get: "/v1/article/"};}
}
通过使用命令行工具 kratos 可以生成相关 http 请求处理、路由定义等,省略了自己去处理请求、响应等过程。
Kratos 的项目分层借鉴了 DDD 的思想,在官方推荐的 project layout 中,用户接口层(interfaces)的作用体现在了 api 层。
如果我们不使用官方自带的 http 处理方案(通过 .proto
生成样板代码),而是使用 gin 框架的话,需要自己做如下事情:
- 规范项目分层,在
/internal
目录下,新增一个用户接口层/interfaces
(DDD思想) - 通过gin编写自己的请求处理、响应
- 通过gin定义路由
- kratos 集成 gin
- 注入 wire set 中
规范项目分层
PS :kratos 的 biz 层更多是DDD 中 domain + repo接口定义 ,但是官方该层给的后缀却是 XXUseCase,个人感觉不太对啊, 还是自己的知识错了?
在 /internal
目录下新建 /interfaces
目录
之后的处理请求、编写路由、wire Provider 都在该目录下定义,最终结果如图:
处理请求处理、响应
在用户接口层 /interfaces
编写请求处理的方法,写了个最简单的 SayHi
:
// user.go
package interfacesimport ("context""kratos-admin/internal/service""github.com/go-kratos/kratos/v2/log""github.com/gin-gonic/gin"
)type UserUseCase struct {userService *service.UserServicelog *log.Helper
}func NewUserUseCase(us *service.UserService, logger log.Logger) *UserUseCase {return &UserUseCase{userService: us, log: log.NewHelper(logger)}
}func (u *UserUseCase) SayHi(c *gin.Context) {c.JSON(200, gin.H{"msg": "hello world",})
}
编写路由route
// routes.go package interfacesimport ("github.com/gin-gonic/gin"
)func RegisterHTTPServer(us *UserUseCase) *gin.Engine {router := gin.New()rootGrp := router.Group("/api"){userGrp := rootGrp.Group("/user")userGrp.GET("/sayhi", us.Get)}return router
}
Kratos 集成gin
在 /server/http.go
中注册路由:
// server/http.go// NewHTTPServer new a HTTP server.
func NewHTTPServer(c *conf.Server,user *interfaces.UserUseCase, // 新增参数logger log.Logger) *transHttp.Server {var opts = []transHttp.ServerOption{transHttp.Middleware(recovery.Recovery(),tracing.Server(),logging.Server(logger),metrics.Server(),validate.Validator(),),}if c.Http.Network != "" {opts = append(opts, transHttp.Network(c.Http.Network))}if c.Http.Addr != "" {opts = append(opts, transHttp.Address(c.Http.Addr))}if c.Http.Timeout != nil {opts = append(opts, transHttp.Timeout(c.Http.Timeout.AsDuration()))}srv := transHttp.NewServer(opts...)// 调用 interfaces.RegisterHTTPServer 注入到 srv 中srv.HandlePrefix("/", interfaces.RegisterHTTPServer(user))return srv
}
注入 wire set中
1. 编写 ProviderSet
// interfaces.go
package interfacesimport "github.com/google/wire"// ProviderSet is interfaces providers.
var ProviderSet = wire.NewSet(NewUserUseCase)
2. 增加到 wire.go中
// initApp init kratos application.
func initApp(*conf.Server, *conf.Data, log.Logger) (*kratos.App, func(), error) {panic(wire.Build(server.ProviderSet,data.ProviderSet,biz.ProviderSet,service.ProviderSet,interfaces.ProviderSet, // 新增的 interfaces provider setnewApp))
}
3. 执行 wire 命令,生成新的 wire_gen.go 文件
# cd 到 mian.go 所在的目录中
cd cmd/XXXX # 执行 wire
wire
接下来自己启动项目,测试接口 : http://127.0.0.1:8000/api/user/sayhi 即可
亲测可以~
Kratos 集成Gin相关推荐
- 09|自研or借力(下):集成Gin替换已有核心
如何将 Gin 迁移进入我们的框架 在 Golang 中,要在一个项目中引入另外一个项目,一般有两种做法,一种做法是把要引用的项目通过 go mod 引入到目标库中,而另外一种做法则费劲的多,使用复制 ...
- 集成gin 、zap和lumberjack
/*** @author:David Ma* @date:2021-02-01*/package mylogimport ("go.uber.org/zap""go.ub ...
- go集成gin+swagger
1.安装 swag go get github.com/swaggo/swag/cmd/swag swag 用于生成 docs 文件夹(swagger文档程序使用)安装完成后会在 ${GOPATH}/ ...
- 飞书开放平台Go-Sdk使用指南
飞书开放平台提供了Go-Sdk,旨在让开发者便捷的调用飞书开放API.处理订阅的消息事件.处理服务端推送的卡片行为. 安装 go get -u github.com/larksuite/oapi-sd ...
- Java到Go的过渡(一篇足以)-应届23,Java实在太难了,来学Go叭
阅读前,读者需要掌握java的语法基础,最好有python和c++的基础. 方便理解. 参考: Golang官方: https://golang.google.cn/tour/welcome/1 bi ...
- gin 生成api文档_golang gin框架 集成swagger 自动生成文档
goswagger github仓库html https://github.com/swaggo/swag 安装 swag cligit 1.由于网络缘由,先安装gopm 管理工具github go ...
- 使用Gin框架集成JWT,源码、详解、面试问题
使用Gin框架集成JWT,源码.详解.面试问题 一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). ...
- go语言 gin框架中集成zap日志库
在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...
- gin+gorm 集成环境搭建
创建目录 online go mod init online 安装 gin go get -u github.com/gin-gonic/gin 安装 gorm go get -u gorm.io/ ...
最新文章
- 02-dispatch_barrier
- XP系统的用户头像是在那个文件夹里面
- java 类加载过程
- 线下报名 | NVIDIA JETSON 开发者交流会,走进哈工大!
- 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)...
- 在线ajax测试,在线测试 - SosoApi,简单强大的api接口文档管理平台
- mysql gui 修改密码_MySQL修改root密码的各种方法整理
- 2011(信息学奥赛一本通-T1234)
- entity什么类型_「知否」知识地图和知识图谱是什么?
- Android中使用FragmentManager获得控件
- @protocol 和 category 中如何使用 @property
- gtx1050ti最稳定的驱动_最便宜图灵吃鸡卡 华硕GTX 1650评测
- 黑莓7100刷机及修改PIN,完美破解超越输入法
- 新萝卜家园 GhostXP_SP3 五一纪念版
- 【sketchup 2021】草图大师中CAD文件的导入与建模(利用cad图纸在草图大师中建立立面模型)、草图大师导出成品为dwg格式的二维、三维、立面效果到cad中打开预览】
- 「公众号吸粉神级插件」实现网站下载文件需要公众号获取验证码
- 阮杰:从散户到身价过亿的私募掌门人
- AV1代码学习:encoder_encode函数
- 山东科技大学计算机科学与技术学硕,2021年山东科技大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
- 2020年全国大学生电子设计大赛赛后总结
热门文章
- TYVJ1338 QQ农场
- Android FaceBook原生广告接入教程(精简版)
- 离开学校如何成为网页设计师1
- Android校园打车拼车系统 java python 小程序uni-app
- 发那科syst178_共享:发那科机器人常规维修,故障简析全套流程
- 发那科机器人电柜没电怎么回事_「维修篇」发那科FANUC机器人电路板维修步骤及注意事项...
- 【idea】Command line is too long. Shorten command line for XXXApplication
- vue中禁止页面滚动/滚动事件穿透-弹出蒙版时弹出层下面还可以滚动问题解决
- 盒子卡在android正在升级,手机开机一直显示android正在升级怎么处理
- Fonts (简体中文)