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目录下 ...
随机推荐
- 理解JavaScript的运行
JavaScript可以运行在head和body标签中! HTML的脚本必须放在<script></script>标签中间! 浏览器会解释并执行位于script标签中的脚本! ...
- [整理]Kadane算法
仅能操作一次时,需每次观察是否有为负情况置零.多次操作时,仅需判断是否后者大于前者. leetcode 53.121.122 [代码] class Solution { public int maxS ...
- 6.4 C++提取子字符串及字符串的比较
参考:http://www.weixueyuan.net/view/6393.html 总结: 函数substr可以提取string字符串中的子字符串,该函数有两个参数,第一个参数为需要提取的子字符串 ...
- linux下Mysql多实例实现
什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提供各自的服务:: My ...
- Android 删除图片等资源文件 通知系统更新,重新扫描
public void delPic(String path){ File delFile = new File(path); if (delFile.exists()) { delFile.dele ...
- 关于jvm钩子 Runtime.getRuntime().addShutdownHook
转自: http://www.cnblogs.com/nexiyi/p/java_add_ShutdownHook.html 在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候 ...
- 代码改变世界 | 如何封装一个简单的 Koa
下面给大家带来:封装一个简单的 Koa Koa 是基于 Node.js 平台的下一代 web 开发框架 Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装 ...
- Linux:配置samba服务
配置samba服务 一.简略教程 1.挂载系统 mount /dev/cdrom /mnt/cdrom2.创建用户:useradd linlin3.创建用户密码:passwd linlin4.在用户 ...
- Vue.js与WdatePicker日历控件冲突问题的解决方案
问题:同时使用Vue.js与WdatePicker时,双向绑定的日期字段获取不到界面输入的值,而且别的字段的值改变后,日期控件的内容会被清空 原因:WdatePicker不是Vue的插件,不能响应Vu ...
- python 正则进阶常用方法
表达式 描述 正则表达式示例 符号 literal 匹配文本字符串的字面值literal foo rel1|rel2 匹配正则表达式rel1或rel2 foo|bar . 匹配任何字符(除了\n之外) ...