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 框架的话,需要自己做如下事情:

  1. 规范项目分层,在 /internal 目录下,新增一个用户接口层 /interfaces (DDD思想)
  2. 通过gin编写自己的请求处理、响应
  3. 通过gin定义路由
  4. kratos 集成 gin
  5. 注入 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相关推荐

  1. 09|自研or借力(下):集成Gin替换已有核心

    如何将 Gin 迁移进入我们的框架 在 Golang 中,要在一个项目中引入另外一个项目,一般有两种做法,一种做法是把要引用的项目通过 go mod 引入到目标库中,而另外一种做法则费劲的多,使用复制 ...

  2. 集成gin 、zap和lumberjack

    /*** @author:David Ma* @date:2021-02-01*/package mylogimport ("go.uber.org/zap""go.ub ...

  3. go集成gin+swagger

    1.安装 swag go get github.com/swaggo/swag/cmd/swag swag 用于生成 docs 文件夹(swagger文档程序使用)安装完成后会在 ${GOPATH}/ ...

  4. 飞书开放平台Go-Sdk使用指南

    飞书开放平台提供了Go-Sdk,旨在让开发者便捷的调用飞书开放API.处理订阅的消息事件.处理服务端推送的卡片行为. 安装 go get -u github.com/larksuite/oapi-sd ...

  5. Java到Go的过渡(一篇足以)-应届23,Java实在太难了,来学Go叭

    阅读前,读者需要掌握java的语法基础,最好有python和c++的基础. 方便理解. 参考: Golang官方: https://golang.google.cn/tour/welcome/1 bi ...

  6. gin 生成api文档_golang gin框架 集成swagger 自动生成文档

    goswagger github仓库html https://github.com/swaggo/swag 安装 swag cligit 1.由于网络缘由,先安装gopm 管理工具github go ...

  7. 使用Gin框架集成JWT,源码、详解、面试问题

    使用Gin框架集成JWT,源码.详解.面试问题 一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). ...

  8. go语言 gin框架中集成zap日志库

    在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...

  9. gin+gorm 集成环境搭建

    创建目录  online go mod init online 安装 gin go get -u github.com/gin-gonic/gin 安装 gorm go get -u gorm.io/ ...

最新文章

  1. 02-dispatch_barrier
  2. XP系统的用户头像是在那个文件夹里面
  3. java 类加载过程
  4. 线下报名 | NVIDIA JETSON 开发者交流会,走进哈工大!
  5. 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)...
  6. 在线ajax测试,在线测试 - SosoApi,简单强大的api接口文档管理平台
  7. mysql gui 修改密码_MySQL修改root密码的各种方法整理
  8. 2011(信息学奥赛一本通-T1234)
  9. entity什么类型_「知否」知识地图和知识图谱是什么?
  10. Android中使用FragmentManager获得控件
  11. @protocol 和 category 中如何使用 @property
  12. gtx1050ti最稳定的驱动_最便宜图灵吃鸡卡 华硕GTX 1650评测
  13. 黑莓7100刷机及修改PIN,完美破解超越输入法
  14. 新萝卜家园 GhostXP_SP3 五一纪念版
  15. 【sketchup 2021】草图大师中CAD文件的导入与建模(利用cad图纸在草图大师中建立立面模型)、草图大师导出成品为dwg格式的二维、三维、立面效果到cad中打开预览】
  16. 「公众号吸粉神级插件」实现网站下载文件需要公众号获取验证码
  17. 阮杰:从散户到身价过亿的私募掌门人
  18. AV1代码学习:encoder_encode函数
  19. 山东科技大学计算机科学与技术学硕,2021年山东科技大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  20. 2020年全国大学生电子设计大赛赛后总结

热门文章

  1. TYVJ1338 QQ农场
  2. Android FaceBook原生广告接入教程(精简版)
  3. 离开学校如何成为网页设计师1
  4. Android校园打车拼车系统 java python 小程序uni-app
  5. 发那科syst178_共享:发那科机器人常规维修,故障简析全套流程
  6. 发那科机器人电柜没电怎么回事_「维修篇」发那科FANUC机器人电路板维修步骤及注意事项...
  7. 【idea】Command line is too long. Shorten command line for XXXApplication
  8. vue中禁止页面滚动/滚动事件穿透-弹出蒙版时弹出层下面还可以滚动问题解决
  9. 盒子卡在android正在升级,手机开机一直显示android正在升级怎么处理
  10. Fonts (简体中文)