经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
go-admin在线开发平台学习-3[细节解析]
来源:cnblogs  作者:happlyfox  时间:2021/2/18 16:54:52  对本文有异议

本章节主要的内容是对go-admin中的一些有趣编码进行分析,为自己以后提供一些借鉴

使用cli方式启动项目

使用cobra[眼镜蛇]完成强壮cli的工具,确保稳定。

使用cli的方式启动项目的好处显而易见,可以在进行配置的自定义化,而不是固定的使用某个配置文件中的信息。在一些需要频繁更换命令参数的场景下尤为有效。

cobra的使用有一个默认的规定,即新建一个cmd文件夹,基于这个文件夹定义自己的命令结构

1、小型项目

cmd 文件夹

-- root.go 根命令

-- version.go 版本命令【子命令】

2、中/大型项目

cmd 文件夹

--version 文件夹

? --server.go

--config 文件夹

? --server.go

-- root.go 入口指令

不同的项目选用不同的方式进行命令的定义。

监听中断信号

  1. // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
  2. quit := make(chan os.Signal)
  3. signal.Notify(quit, os.Interrupt)
  4. <-quit
  5. fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrentTimeStr())
  6. if err := srv.Shutdown(ctx); err != nil {
  7. log.Fatal("Server Shutdown:", err)
  8. }
  9. log.Info("Server exiting")

信号监听,当遇到ctrl+c的时候当前服务结束,打印结束日志

配置文件Viper的使用

viper的使用,配置文件路径,获取viper根类

  1. //数据库配置
  2. cfgDatabase = viper.Sub("settings.database")
  3. DatabaseConfig = InitDatabase(cfgDatabase)
  4. //应用程序配置
  5. cfgApplication = viper.Sub("settings.application")
  6. ApplicationConfig = InitApplication(cfgApplication)

其他的内容与此方式类似

viper.Sub获取对应分类的内容,然后使用自定义的Init***函数初使化类


/tools/config文件夹中定义实体类,对应config.yml中的分类

举例:application.go对应图二的application分类内容,其他的也是同样意思

image-20210218155728868

image-20210218155808880

此目录下的内容,package包名为config。config下的配置信息使用大写表示【对外暴露】。如果其他地方要调用,引用包后使用config.分类名称.参数

即可得到配置文件的内容

初始化数据库

配置文件 dirver:mysql,定义不同的数据库字符串,程序启动时case 连接字符串,对不同的数据库类型做不同的配置

数据库日志开关作为单独配置区分,如果开启,数据库日志单独启用

现在程序的数据库.go都需要实现接口如下

  1. type Database interface {
  2. Setup()
  3. Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error)
  4. GetConnect() string
  5. GetDriver() string
  6. }

image-20210218161101421

interface定义接口,其他的go文件实现接口-使用不同的开源数据库驱动

接口访问控制

casbin

轻量级开源访问控制框架,采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等

策略文件

  1. // Initialize the model from a string.
  2. var text = `
  3. [request_definition]
  4. r = sub, obj, act
  5. [policy_definition]
  6. p = sub, obj, act
  7. [policy_effect]
  8. e = some(where (p.eft == allow))
  9. [matchers]
  10. m = r.sub == p.sub && (keyMatch2(r.obj, p.obj) || keyMatch(r.obj, p.obj)) && (r.act == p.act || p.act == "*")
  11. `

使用 github.com/casbin/gorm-adapter/v3作为casbin的数据库适配器即可

数据库上下文集成gin

gin一次请求共用一个数据库实例

image-20210218162726796

image-20210218162715014

r.Use()是gin的中间件扩展方法,WithContextDb方法说明的是,如果每次请求到来会打开一次数据库链接,获得数据库链接实例,将实例返回后作为参数传递给方法。如果有此实例,c.Set()方法执行,将此实例保存到gin执行上下文中。

全局异常处理

使用一个异常捕获方法recover()补获未知晓的异常

如果异常消息符合定义的规则,打印后返回给前台。

如果无异常,正常执行下一个定义的中间件

  1. r.Use(CustomError)
  1. func CustomError(c *gin.Context) {
  2. defer func() {
  3. if err := recover(); err != nil {
  4. if c.IsAborted() {
  5. c.Status(200)
  6. }
  7. switch errStr := err.(type) {
  8. case string:
  9. p := strings.Split(errStr, "#")
  10. if len(p) == 3 && p[0] == "CustomError" {
  11. statusCode, e := strconv.Atoi(p[1])
  12. if e != nil {
  13. break
  14. }
  15. c.Status(statusCode)
  16. fmt.Println(
  17. time.Now().Format("2006-01-02 15:04:05"),
  18. "[ERROR]",
  19. c.Request.Method,
  20. c.Request.URL,
  21. statusCode,
  22. c.Request.RequestURI,
  23. c.ClientIP(),
  24. p[2],
  25. )
  26. c.JSON(http.StatusOK, gin.H{
  27. "code": statusCode,
  28. "msg": p[2],
  29. })
  30. }
  31. default:
  32. panic(err)
  33. }
  34. }
  35. }()
  36. c.Next()
  37. }

web服务运行区分ssl和正常

从配置文件中获取内容,定义addr

得到对应的web执行引擎,当前使用gin

启动一个协程,判断如果ssl,使用TlS方法。否则使用正常模式

  1. srv := &http.Server{
  2. Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
  3. Handler: global.Cfg.GetEngine(),
  4. }
  5. go func() {
  6. // 服务连接
  7. if config.SslConfig.Enable {
  8. if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
  9. log.Fatal("listen: ", err)
  10. }
  11. } else {
  12. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  13. log.Fatal("listen: ", err)
  14. }
  15. }
  16. }()

原文链接:http://www.cnblogs.com/foxhappy/p/14412473.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号