• go开发脚手架 动态/静态路由 (根据gin框架)


    git地址:GitHub - radmin-zhangjian/zhyu: go 根据gin创建的脚手架

    实现go自定义rpc框架 (核心:服务端&客户端、自定义io流、编解码、服务发现)https://blog.csdn.net/qq_37200336/article/details/126564093

    目录

    设置代理

    安装gin 及 用到的组件

    测试用例 动态路由

    测试用例 静态路由


    框架具体内容可下载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目录) 仅供学习

    开始

    1. func main() {
    2. http := servers.NewHttp()
    3. // 启动gin服务
    4. router := http.GinNew()
    5. // 启动http服务
    6. http.HttpServer(router)
    7. }

    httpServer

    1. type Http struct {
    2. }
    3. func NewHttp() *Http {
    4. return &Http{}
    5. }
    6. // GinNew 初始化gin
    7. func (s *Http) GinNew() *gin.Engine {
    8. // 启动模式
    9. gin.SetMode(setting.Server.RunMode)
    10. if "debug" == setting.Server.RunMode {
    11. // 日志始终着色
    12. gin.ForceConsoleColor()
    13. // 将日志写入文件
    14. f, _ := os.Create(setting.Server.LogPath + "/see.log")
    15. gin.DefaultWriter = io.MultiWriter(f, os.Stdout) // 日志信息
    16. gin.DefaultErrorWriter = io.MultiWriter(f, os.Stdout) // 错误信息
    17. }
    18. // 没有中间件的引擎
    19. router := gin.New()
    20. if "debug" == setting.Server.RunMode {
    21. router.Use(gin.Logger())
    22. }
    23. router.Use(gin.Recovery())
    24. // Content Keys 需要放在路由前面进行初始化
    25. router.Use(middleware.ContentKeys())
    26. // 自定义Logger
    27. router.Use(middleware.Logger())
    28. go logger.LogHandlerFunc() // 异步处理日志
    29. // ip白名单
    30. router.Use(middleware.IpAuth())
    31. // 定义全局的CORS中间件
    32. router.Use(middleware.Cors())
    33. // 静态资源加载,css,js以及资源图片
    34. //router.StaticFS("/public", http.Dir("./website/static"))
    35. //router.StaticFile("/favicon.ico", "./resources/favicon.ico")
    36. // 导入所有模板
    37. //router.LoadHTMLGlob("website/tpl/*")
    38. // rate-limit 中间件
    39. router.Use(middleware.LimitHandler())
    40. // 注册静态路由
    41. routes.Routes(router)
    42. // 注册动态路由 以api开头
    43. routes.NewAny(router)
    44. // redis 初始化
    45. utils.InitRedis()
    46. // gorm 初始化
    47. utils.InitDB()
    48. //routes.Run(":9090") // listen and serve on 0.0.0.0:8080
    49. return router
    50. }
    51. // HttpServer 启动服务 & 优雅Shutdown(或重启)服务
    52. func (s *Http) HttpServer(router *gin.Engine) {
    53. srv := &http.Server{
    54. Addr: ":" + setting.Server.Port,
    55. Handler: router,
    56. ReadTimeout: time.Duration(setting.Server.ReadTimeout) * time.Second,
    57. WriteTimeout: time.Duration(setting.Server.WriteTimeout) * time.Second,
    58. }
    59. go func() {
    60. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
    61. log.Fatalf("listen: %s\n", err)
    62. }
    63. }()
    64. // 5秒后优雅Shutdown服务
    65. quit := make(chan os.Signal)
    66. signal.Notify(quit, os.Interrupt) //syscall.SIGKILL
    67. <-quit
    68. log.Println("Shutdown Server ...")
    69. ctx, cancel := context.WithTimeout(context.Background(), time.Duration(setting.Server.ShutdownTime)*time.Second)
    70. defer cancel()
    71. if err := srv.Shutdown(ctx); err != nil {
    72. log.Fatal("Server Shutdown:", err)
    73. }
    74. select {
    75. case <-ctx.Done():
    76. }
    77. log.Println("Server exiting")
    78. }

    设置代理

    go env -w GOPROXY=https://goproxy.io,direct

    安装gin 及 用到的组件

    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

    测试用例 静态路由

    http://localhost:9090/v1/test
    http://localhost:9090/v2/test

  • 相关阅读:
    144. 二叉树的前序遍历-C语言
    postgresql-管理数据表
    Python机器视觉--OpenCV入门--OpencCV的安装与图片加载显示
    xLua热更新(一)xLua基本使用
    统计学中关于自由度的详细解释以及求平均值为什么消耗自由度1
    Android Studio的笔记--Android API的方法和位置
    微擎模块 微教育-多校版小程序2.42.9
    kotlin协程withContext的使用
    Delphi使用JSON
    Matlab|考虑可再生能源消纳的电热综合能源系统日前经济调度模型
  • 原文地址:https://blog.csdn.net/qq_37200336/article/details/126445356