紧接着上一篇,本文我们对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. Hive on MR调优

    当HiveQL跑不出来时,基本上是数据倾斜了,比如出现count(distinct),groupby,join等情况,理解 MR 底层原理,同时结合实际的业务,数据的类型,分布,质量状况等来实际的考虑 ...

  2. 查看Linux用的桌面是GNOME、KDE或者其他(转)

    http://superuser.com/questions/96151/how-do-i-check-whether-i-am-using-kde-or-gnome 1) pgrep -l &quo ...

  3. vim自动添加C C++ sh文件头

    set foldenable set foldmethod=manual set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set ...

  4. Python: 捕获正在运行的CMD窗口内容

    最近需要捕获已经在运行的CMD窗口内容,并且需要根据指定输出内容来判断下一步的行动(输入指定内容). 尝试了很多次后,想到一个思路: 通过inspect.exe来获取CMD窗口Name信息通过uiau ...

  5. 关于数位DP的学习

    ---恢复内容开始--- 因为最近做比赛经常会出现数位DP,便尝试着去学学看数位DP. 先给出两篇论文的链接: <数位计数问题解法研究> <浅谈数位类统计问题> 然后也是寻找了 ...

  6. Windows10 ping通 虚拟机上的Linux-CentOS7操作系统

    我是按照Oracle VM VirtualBox 安装CentOS7操作系统这个博客安装Linux操作系统的. 我们这里只关心网卡的配置,网卡一: 网卡二: 我按照上面那个博客安装Linux操作系统之 ...

  7. HDU5589 Tree【分块 01字典树】

    HDU5589 Tree 题意: 给出一棵\(N\)个点的树,每条边有边权,每次询问下标为\([L,R]\)区间内的点能选出多少点对,点对之间的路径上的边权异或和大于\(M\) 题解: 对于两点\(u ...

  8. hdu1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  9. Educational Codeforces Round 94 (Rated for Div. 2) C. Binary String Reconstruction (构造)

    题意:给你一个字符串\(s\),原字符串为\(w\),如果\(i>x\)且\(w_{i-x}=1\),那么\(s_{i}=1\),如果\(i+x\le n\)且\(w_{i+x}=1\),那么\ ...

  10. 被收费绘图工具 PUA 了怎么办?来看看这个老实工具吧

    本文非常适合 Electron 入门选手,墙裂推荐! 本文作者:HelloGitHub-蔡文心 大家好!这里是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来的一款基于 ...