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目录下 ...
随机推荐
- [转]如何远程连接运行OpenGL/Cuda 等GPU程序
发现一篇神文,解决了困扰许久的远程桌面OpenGL/GPU 等问题... 原地址在这:http://www.tanglei.name/how-to-run-gpu-programs-using-rem ...
- Centos7安装配置iptable
CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables st ...
- netty源码理解(一):new一个NioEventLoopGroup的时候做了哪些事
好了,回到构造方法的调用中
- css , dl , dt , dd 的使用. calc
dl .dt, dd 虽然很少使用, 但是 有时使用会有 更好的效果: 一: 展示图片: ------------------------- 代码: <!DOCTYPE html> < ...
- php优秀框架codeigniter学习系列——common.php
文件位于system/core/common.php,是框架核心文件. 该文件中定义了一系列的函数,都是框架运行中经常需要用到的.下面逐一介绍. is_php /** * Determines if ...
- 移动端开发rem单位
1.用js计算 <script> (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientat ...
- php 安装过程 第二次探索
由于第一次安装过程写的比较乱,再做整理 1.phpstudy 才是正确姿势. http://phpstudy.php.cn/ 官网下载. phpstrom 中配置 php为 phpstudy目录下 ...
- 1--Selenium环境准备--Eclipse 添加Testng插件
Eclipse安装TestNG TestNG官网地址:http://testng.org/ 1.离线安装TestNG插件: 受网络等因素影响,在线安装方式速度比较慢,可以通过如下方式离线安装TestN ...
- HDU 6038 17多校1 Function(找循环节/环)
Problem Description You are given a permutation a from 0 to n−1 and a permutation b from 0 to m−1. D ...
- vuejs 在移动端调起键盘并触发‘前往’按钮
<template> <div class="display"> <form @submit.prevent> <input @keyup ...