git地址:GitHub - radmin-zhangjian/zhyu: go 根据gin创建的脚手架
实现go自定义rpc框架 (核心:服务端&客户端、自定义io流、编解码、服务发现)https://blog.csdn.net/qq_37200336/article/details/126564093
目录
框架具体内容可下载git 自己阅读
说明: gin的中间件堪称它的精髓
1.根据gin框架搭建的脚手架 自定义Context头 定义开发结构
2.实现了动态路由 (api开头) 支持版本
3.静态路由也可以匹配动态方法 支持版本
4.添加了一些基础中间件 (logger & JWT & contextKeys & limit & cors等)
5.setting 配置信息设置
6.开发结构分层 (api控制器层、service服务层、dao数据获取逻辑层、model层)
7.jwt-go 实例 & 简单用户验证
8.实现了自定义异步日志 & gorm自定义日志 & TraceId & 链路日志
9.自定义框架 劫持ServeHTTP方法 实现路由和中间件功能 (zhyu目录) 仅供学习
开始
- func main() {
- http := servers.NewHttp()
- // 启动gin服务
- router := http.GinNew()
- // 启动http服务
- http.HttpServer(router)
- }
- type Http struct {
- }
-
- func NewHttp() *Http {
- return &Http{}
- }
-
- // GinNew 初始化gin
- func (s *Http) GinNew() *gin.Engine {
- // 启动模式
- gin.SetMode(setting.Server.RunMode)
-
- if "debug" == setting.Server.RunMode {
- // 日志始终着色
- gin.ForceConsoleColor()
- // 将日志写入文件
- f, _ := os.Create(setting.Server.LogPath + "/see.log")
- gin.DefaultWriter = io.MultiWriter(f, os.Stdout) // 日志信息
- gin.DefaultErrorWriter = io.MultiWriter(f, os.Stdout) // 错误信息
- }
-
- // 没有中间件的引擎
- router := gin.New()
- if "debug" == setting.Server.RunMode {
- router.Use(gin.Logger())
- }
- router.Use(gin.Recovery())
-
- // Content Keys 需要放在路由前面进行初始化
- router.Use(middleware.ContentKeys())
- // 自定义Logger
- router.Use(middleware.Logger())
- go logger.LogHandlerFunc() // 异步处理日志
- // ip白名单
- router.Use(middleware.IpAuth())
- // 定义全局的CORS中间件
- router.Use(middleware.Cors())
-
- // 静态资源加载,css,js以及资源图片
- //router.StaticFS("/public", http.Dir("./website/static"))
- //router.StaticFile("/favicon.ico", "./resources/favicon.ico")
-
- // 导入所有模板
- //router.LoadHTMLGlob("website/tpl/*")
-
- // rate-limit 中间件
- router.Use(middleware.LimitHandler())
-
- // 注册静态路由
- routes.Routes(router)
-
- // 注册动态路由 以api开头
- routes.NewAny(router)
-
- // redis 初始化
- utils.InitRedis()
- // gorm 初始化
- utils.InitDB()
-
- //routes.Run(":9090") // listen and serve on 0.0.0.0:8080
- return router
- }
-
- // HttpServer 启动服务 & 优雅Shutdown(或重启)服务
- func (s *Http) HttpServer(router *gin.Engine) {
- srv := &http.Server{
- Addr: ":" + setting.Server.Port,
- Handler: router,
- ReadTimeout: time.Duration(setting.Server.ReadTimeout) * time.Second,
- WriteTimeout: time.Duration(setting.Server.WriteTimeout) * time.Second,
- }
- go func() {
- if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- log.Fatalf("listen: %s\n", err)
- }
- }()
-
- // 5秒后优雅Shutdown服务
- quit := make(chan os.Signal)
- signal.Notify(quit, os.Interrupt) //syscall.SIGKILL
- <-quit
- log.Println("Shutdown Server ...")
- ctx, cancel := context.WithTimeout(context.Background(), time.Duration(setting.Server.ShutdownTime)*time.Second)
- defer cancel()
- if err := srv.Shutdown(ctx); err != nil {
- log.Fatal("Server Shutdown:", err)
- }
- select {
- case <-ctx.Done():
- }
- log.Println("Server exiting")
- }
go env -w GOPROXY=https://goproxy.io,direct
go get -u github.com/gin-gonic/gin
go get -u github.com/petermattis/goid
go get -u github.com/didip/tollbooth
go get -u gopkg.in/yaml.v2
go get -u github.com/sony/sonyflake
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm/logger
go get -u gorm.io/gorm/schema
go get -u github.com/dgrijalva/jwt-go
go get -u github.com/go-redis/redis/v8
安装验证器
go get -u github.com/go-playground/locales/zh
go get -u github.com/go-playground/universal-translator
go get -u github.com/go-playground/validator/v10
go get -u github.com/go-playground/validator/v10/translations/zh
mysql user 数据结构
CREATE TABLE zhyu_user
(id
mediumint(6) unsigned NOT NULL AUTO_INCREMENT,username
varchar(20) DEFAULT NULL,password
varchar(32) DEFAULT NULL,roleid
smallint(5) DEFAULT '0',encrypt
varchar(6) DEFAULT NULL,lastloginip
varchar(15) DEFAULT NULL,lastlogintime
int(10) unsigned DEFAULT '0',email
varchar(40) DEFAULT NULL,realname
varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (userid
),
KEY username
(username
) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk
http://localhost:9090/api/v1/test
http://localhost:9090/api/v2/test