• 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

  • 相关阅读:
    UDP传输rtp数据包丢帧
    Triple-shapelet Networks for Time SeriesClassification(ICDM2020)
    Vue基本知识
    Greenplum报错could not fork new process for connection: Cannot allocate memory
    使用FP8加速PyTorch训练
    引入指定字体
    Hudi Java Client总结|读取Hive写Hudi代码示例
    redis非关系型数据库
    Label 与 Label Selector
    【手撕STL】AVL树
  • 原文地址:https://blog.csdn.net/qq_37200336/article/details/126445356