sqler sql 转rest api 源码解析(一)应用的启动入口
sqler sql 转rest api 的源码还是比较简单的,没有比较复杂的设计,大部分都是基于开源
模块实现的。
说明: 当前的版本为2.0,代码使用go mod 进行包管理,如果本地运行注意golang 版本,我使用docker 运行,
参考 https://github.com/rongfengliang/sqler-docker-compose/blob/master/Dockerfile
依赖的开源包
- 配置解析的(比如bind,exec,validates,include。。。) 使用hashicorp/hcl ,同时使用了text/template 主要是处理sql 的
- redis 协议支持的(包含了list,help) tidwall/redcon
- validate,bind ,authorizer 的指定解析 dop251/goja golang 版的js 包
- exec sql 参数传递,通过js 包解析的,dop251/goja
- rest 路由、请求处理 labstack/echo ,基于context 的宏解析参数传递
处理流程
入口
入口主要包含的数据库连接的检测,以及配置文件宏的解析,以及rest 、resp 支持协议的启动
- 启动参数的定义
vars.go,主要是对于启动参数的定义,包括dsn,driver,resp rest端口定义,同时定义了macrosManager
变量
这个变量在init 阶段进行初始化
- // 启动变量定义
- var (
- flagDBDriver = flag.String("driver", "mysql", "the sql driver to be used")
- flagDBDSN = flag.String("dsn", "root:root@tcp(127.0.0.1)/test?multiStatements=true", "the data source name for the selected engine")
- flagAPIFile = flag.String("config", "./config.example.hcl", "the config file(s) that contains your endpoints configs, it accepts comma seprated list of glob style pattern")
- flagRESTListenAddr = flag.String("rest", ":8025", "the http restful api listen address")
- flagRESPListenAddr = flag.String("resp", ":3678", "the resp (redis protocol) server listen address")
- flagWorkers = flag.Int("workers", runtime.NumCPU(), "the maximum workers count")
- )
-
- var (
- errNoMacroFound = errors.New("Resource not found")
- errValidationError = errors.New("Validation error")
- errAuthorizationError = errors.New("Authorization Error")
- )
-
- var (
- errStatusCodeMap = map[error]int{
- errNoMacroFound: 404,
- errValidationError: 422,
- errAuthorizationError: 401,
- }
- )
-
- // 宏管理变量定义
- var (
- macrosManager *Manager
- )
- init
init.go
init 使用的是golang 的特性,主要是对于数据库驱动的加载、配置数据库连接状态的检测、以及宏的解析,赋值(vars.go )
- {
-
- // 配置数据库状态检测
- tstconn, err := sqlx.Connect(*flagDBDriver, *flagDBDSN)
- if err != nil {
- fmt.Println(color.RedString("[%s] %s - connection error - (%s)", *flagDBDriver, *flagDBDSN, err.Error()))
- os.Exit(0)
- }
- tstconn.Close()
- }
-
- {
- // 宏的解析以及vars.go 中变量的赋值
- manager, err := NewManager(*flagAPIFile)
- if err != nil {
- fmt.Println(color.RedString("(%s)", err.Error()))
- os.Exit(0)
- }
- macrosManager = manager
- }
- macrosManager 的处理
macrosManager 主要是解析hcl 配置文件,并保存map 对象中,同时提供了GET以及LIST 方便后边
echo rest 框架处理宏调用的
macrosManager 数据结构
- type Manager struct {
- // 宏对象,包含了,rest 请求的生命周期的组件
- macros map[string]*Macro
- // 主要是为了使用使用text/template 模版解析exec 宏
- compiled *template.Template
- }
Macro 数据结构
Macro 定义了每个宏的完整信息: method validator authorizer exec bind include(依赖),transformer 数据转换
主要的方式是Call ,更具输入的input 数据指定rest 的处理(数据校验,数据绑定,依赖执行,数据转换),后边
为具体分析
- type Macro struct {
- Methods []string
- Include []string
- Validators map[string]string
- Authorizer string
- Bind map[string]string
- Exec string
- Aggregate []string
- Transformer string
-
- name string
- manager *Manager
- }
- mian 入口
main.go 主要是对于rest 以及resp 协议服务的初始化&&启动
- // resp 协议支持
- go (func() {
- err <- initRESPServer()
- })()
- // rest 协议支持
- go (func() {
- err <- initRESTServer()
- })()
参考资料
https://github.com/dop251/goja
https://github.com/tidwall/redcon
https://github.com/labstack/echo
https://github.com/hashicorp/hcl
sqler sql 转rest api 源码解析(一)应用的启动入口的更多相关文章
- sqler sql 转rest api 源码解析(四)macro 的执行
macro 说明 macro 是sqler 的核心,当前的处理流程为授权处理,数据校验,依赖执行(include),聚合处理,数据转换 处理,sql 执行以及sql 参数绑定 授权处理 这个是通过go ...
- sqler sql 转rest api 源码解析(三) rest协议
rest 服务说明 rest 协议主要是将配置文件中的宏暴露为rest 接口,使用了labstack/echo web 框架,同时基于context 模型 进行宏管理对象的共享,同时进行了一些中间件的 ...
- sqler sql 转rest api 源码解析(二) resp 协议
resp 协议主要是方便使用redis 客户端进行连接,resp 主要是依赖 tidwall/redcon golang redis 协议包 resp 服务说明 server_resp.go 文件,干 ...
- Netty 4源码解析:服务端启动
Netty 4源码解析:服务端启动 1.基础知识 1.1 Netty 4示例 因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象.而且5.0的变化也不像4.0这么大,好 ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动
Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...
- Flink 源码解析 —— Standalone session 模式启动流程
Standalone session 模式启动流程 https://t.zsxq.com/EemAEIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0 ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动
Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...
- 第三十四节,目标检测之谷歌Object Detection API源码解析
我们在第三十二节,使用谷歌Object Detection API进行目标检测.训练新的模型(使用VOC 2012数据集)那一节我们介绍了如何使用谷歌Object Detection API进行目标检 ...
- Vue源码解析(一):入口文件
在学习Vue源码之前,首先要做的一件事情,就是去GitHub上将Vue源码clone下来,目前我这里分析的Vue版本是V2.5.21,下面开始分析: 一.源码的目录结构: Vue的源码都在src目录下 ...
随机推荐
- Linux查看当前使用的网卡 以及 查看某进程使用的网络带宽情况 以及 端口占用的情况
一:Linux查看当前使用的网卡 ifconfig命令可以查看当前linux 系统有多少个网卡. [app@p2-app2 ~]$ ifconfig br-2e5b046a02d5: ...
- Jmeter响应中中文乱码怎么解决
在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成samp ...
- c/c++动态内存分配的区别
c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...
- DevExpress v18.1新版亮点——Reporting篇(一)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Reporting v18.1 的新功能,快来下载试用新版本 ...
- Centos7部署kubelet(六)
1.二进制包准备将软件包从linux-node1复制linux-node2.linux-node3中去 [root@linux-node1 ssl]# cd /usr/local/src/kubern ...
- 安装gcc
yum -y install gcc yum -y install gcc-c++ yum install make -- 或者 yum groupinstall "Developmen ...
- 异常 No module named 'numpy.core._multiarray_umath
No module named 'numpy.core._multiarray_umath 解决方法: 1. 可能是由于模型保存时出错,导致模型没有保存成功,此时删掉保存的模型即可 2. numpy版 ...
- day 67 django 之ORM 增删改查基础
一 操作基础前提准备 1. 新建django 项目 mysite 子项目app01 ,选择好做路径. 2 .2-1在app01 下面models 中引用 模块 from django.db im ...
- ios UITableView背景图片设置
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...
- delphi reintroduce作用
当在子类中重载或者重新声明父类的虚方法时,使用 reintroduce 关键字告知编译器,可以消除警告信息. 如: TParent = class procedure proc;virtual; ...