紧接着上一篇,本文我们对go-admin下载后的源码进行分析。

首先对项目所使用的第三方库进行分析,了解作者使用的库是否是通用的官方库可以有助于我们更快地阅读程序。接着对项目的main()方法进行分析,因为程序使用cli的方式启动,对cli不同的命令进行分析。基于此俩点开始工作。

go-admin中使用的第三方库

cobra

强大的cli封装,支持命令嵌套

cast

简单安全的类型转换

casbin

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

gorm

一个神奇的,对开发人员友好的 Golang ORM 库

sentinel-golang

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

opentracing-go

分布式追踪库

cron

定时任务库,支持cron表达式

启动分析

main.go作为程序第一个入口文件,main()方法作为程序入口

使用corboa命令行的方式进行启动,有多个不同的命令,如下所示

  • 查看系统版本

go-admin version

  • 查看系统配置

go-admin config

  • 服务启动

go-admin server

  • 数据库迁移

go-admin migrate

不同的命令有不同的参数进行配置

命令的代码在根目录cmd下分文件保存,通过cobra.go作为统一入口

corbora的使用遵循一个通用的规则。首先创建一个cmd文件夹,在其中定义一个分支命令即是定义一个新的go文件。本项目所使用的方式也类似,每一个命令都 定义一个文件夹,分别管理自己命令的内容,最后通过cobra.go这个上层入口暴露出来。

go-admin version 命令

定义指令 version,runE执行调用run方法,控制台打印版本号

go-admin config 命令

与上一个version指令类似,只是多一个输入参数,用来指定路径。

init初始化方法定义输入的flag参数,当执行go-admin config -c 路径,进入run()方法。

run方法中

1、config.Setup(configYml),将yml配置文件转为不同的实体类

2、打印不同的分类内容

go-admin migrate 命令

数据库迁移指令

基于gorm的migrate方法,定义自己的initdata内容,执行指令完成数据库迁移工具。

有点类似.net core中的code first模式

go-admin server命令

重点!!!

我们直接进行 server 命令的分析

api文件夹下的server.go文件,对应服务启动指令

Init方法

init() 方法中是对 命令行参数的解析和初始化路由方法的绑定

以上代码分为俩部门看

1、对server 指令的参数绑定

2、route.InitRouter方法添加到AppRouters中,等待后续执行


router.InitRouter方法来源于 /admin/router/initrouter.go文件

initrouter.go中包含多项内容

1、通过配置获取程序所用引擎,当前只支持gin,后续作者可能会进行添加。

2、通过配置判断是否使用ssl加密,如果使用""注册tls处理中间件"

3、读取配置获取数据库类型,连接字符串获取gorm具体数据库的接口实现,自定义中间件设置数据库上下文,集成到gin使用

4、配置Sentinel限流规则

阿里开源的一套东西,需要研究研究

5、通用的系统中间件载入

中间件的业务逻辑包含在 /admin/middleware中

日志处理 logger.go

作者自己生态的日志封装,基于logrus和zap的实现,具体没看

逻辑是获取request的请求信息写入文件日志,如果包含特定请求写入数据库(后期可能会废弃)

全局异常处理

当出现全局异常的时候捕获异常,避免程序直接挂掉

缓存

NoCache是一个附加头的中间件函数。防止客户端缓存HTTP响应。

意思是客户端不进行缓存,每次都要的请求向服务器发起

跨域

增加跨域请求头信息,允许所有请求的跨域

这块之后应该集成第三方,实现满足特定需要的跨域

安全

Secure是附加了security的中间件功能

链路追踪

链路追踪是实现每请求的时间线展示吗还是什么,这块还需要研究

6、 jwt认证方式实现

7、注册业务路由

区分俩种

需要认证的路由,基于上述jwt

不需要认证的路由

命令定义

我感觉这有点像是web core中的依赖注入的概念,首先进行各服务的注册注入然后启动服务的某些功能,当然实际上还是有很多不同的,只是突然这么想到了而已

PreRun

启动前的初始化配置

读取配置文件,配置三种全局日志,分别为

  • Logger 日志
  • JobLogger 定时任务日志
  • RequestLogger 请求日志

初始化数据库链接,通过配置文件得到不同的数据库,并执行不同的数据库驱动

驱动位于/go-admin/common/database/_driver后缀

已集成mysql,pgsql,sqlites的驱动

配置接口控制全局,基于casbin

RunE

启动配置

判断是否为开发环境,增加环境监控

将初始化配置的路由中间件载入

定义服务端口,ssl等信息

启动定时服务

打印启动日志

启动服务

srv := &http.Server{
Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
Handler: global.Cfg.GetEngine(),
}

定义启动服务的host+port

定义启动服务的句柄,当前支持的方式是gin

srv.ListenAndServe 启动服务,打印启动时的日志

命令的解析大体如下,接下来针对框架中的细节的进行描述,请等待作者的更新。

go-admin在线开发平台学习-2[程序结构分析]的更多相关文章

  1. go-admin在线开发平台学习-1[安装、配置、启动]

    项目介绍 go-admin 是一个中后台管理系统,基于(gin, gorm, Casbin, Vue, Element UI)实现.主要目的是为了让开发者更专注业务,减少重复代码的编写,节省时间,提升 ...

  2. go-admin在线开发平台学习-3[细节解析]

    本章节主要的内容是对go-admin中的一些有趣编码进行分析,为自己以后提供一些借鉴 使用cli方式启动项目 使用cobra[眼镜蛇]完成强壮cli的工具,确保稳定. 使用cli的方式启动项目的好处显 ...

  3. go-admin在线开发平台学习-4[细节解析]

    紧接着上一期的内容,继续对go-admin的一些细节进行解析. 通用的增删改查方法 在go-admin/common/actions下封装了通用的增删改查方法.在对这些方法进行说明前,先移步到另一个文 ...

  4. UCML快速开发平台学习1-UCML环境安装

           最近公司项目时间紧张,经过各位大神的PK,决定用多年前话10W采购过来,一直被雪藏的UCML来开发.为啥花了钱买回来不用我就不吐槽了. UCML安装         翻看安装手册,貌似不 ...

  5. 李洪强漫谈iOS开发[C语言-005]-程序结构分析

  6. EEPlat的基于浏览器的在线开发技术

    EEPlat的开发内容主要包含配置开发和基于API的扩展开发两块内容. EEPlat的配置开发基于后台的配置环境.直接通过界面操作配置就可以. EEPlat的配置平台是用EEPlat自解释构建的.本身 ...

  7. 高级PHP开发:利用PHPEMS搭建在线考试平台

    今天给大家分享一个小技巧,就是利用PHP ems搭建在线考试平台:希望能给你给予帮助: 在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛 ...

  8. SNF开发平台WinForm之十一-程序打包-SNF快速开发平台3.3-Spring.Net.Framework

    原来我们用的是微软自带的打包工具去打包,但感觉好像也是第三方做的打包并且很是麻烦,还有时不成功报错.那综合考虑就找一个简单实用的打包工具吧,就找到了NSIS这个.具体打包步骤如下: 1.安装NSIS ...

  9. SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...

随机推荐

  1. C#Process调用外部程序

    前言 使用C#调用外部程序,一种是通过Process类,一种是通过命令行,本文主要说一下使用C#中的Process类调用外部程序的方式. 过程: 1. 创建Process对象 2. 配置启动选项(输入 ...

  2. XCTF-phoenix100

    前期工作 查壳无壳,界面是普通的输入flag点击验证 逆向分析 文件结构只有一个MainActively,查看MainActively代码 public class MainActivity exte ...

  3. scala的隐式转换学习总结(详细)

    一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...

  4. linux常用命令(shell脚本常用命令)(grep、cut、sort、uniq、seq、tr、basename、dirname)

    本章命令: 1 2 3 4 5 6 grep cut sort uniq seq tr 1.grep 作用:过滤文本内容 选项 描述 -E :--extended--regexp 模式是扩展正则表达式 ...

  5. codeblocks输出中文乱码解决办法

    在使用codeblocks进行编程的时候我发现控制台输出会出现中文乱码,就像这样: 所以很快我就问了老师,解决步骤如下: 一:如果源码是用codeblock编写的,打开Setting->Edit ...

  6. BZOJ 3675: 序列分割 (斜率优化dp)

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  7. Codeforces Round #570 (Div. 3) G. Candy Box (hard version) (贪心,优先队列)

    题意:你有\(n\)个礼物,礼物有自己的种类,你想将它们按种类打包送人,但是打包的礼物数量必须不同(数量,与种类无关),同时,有些礼物你想自己留着,\(0\)表示你不想送人,问你在送出的礼物数量最大的 ...

  8. Redis全面解析

    1.什么是Redis? Redis是BSD协议,是一个高性能的key-value非关系型数据库. 2.redis单线程问题 所谓的单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一 ...

  9. Ansible 自动化部署

    参考 BLOG: Ansible 系列模块 Ansible 部署与使用 Ansible Book Ansible Ansible 是一个自动化统一配置管理工具,自动化主要体现在 Ansible 集成了 ...

  10. Linux-源码安装及FPM打包

    目录 源码安装 制作RPM包(使用FPM工具) 安装rpm后要执行的脚本(优化版) 源码安装 这里举例Nginx的源码安装,需要前往Nginx官网找到稳定版本源码安装包下载. ## 源码安装nginx ...