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 阶段进行初始化
 
  1. // 启动变量定义
  1. var (
  1.  flagDBDriver = flag.String("driver", "mysql", "the sql driver to be used")
  1.  flagDBDSN = flag.String("dsn", "root:root@tcp(127.0.0.1)/test?multiStatements=true", "the data source name for the selected engine")
  1.  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")
  1.  flagRESTListenAddr = flag.String("rest", ":8025", "the http restful api listen address")
  1.  flagRESPListenAddr = flag.String("resp", ":3678", "the resp (redis protocol) server listen address")
  1.  flagWorkers = flag.Int("workers", runtime.NumCPU(), "the maximum workers count")
  1. )
  1. var (
  1.  errNoMacroFound = errors.New("Resource not found")
  1.  errValidationError = errors.New("Validation error")
  1.  errAuthorizationError = errors.New("Authorization Error")
  1. )
  1. var (
  1.  errStatusCodeMap = map[error]int{
  1.    errNoMacroFound: 404,
  1.    errValidationError: 422,
  1.    errAuthorizationError: 401,
  1. }
  1. )
  1. // 宏管理变量定义
  1. var (
  1.  macrosManager *Manager
  1. )
 
 
  • init
    init.go
    init 使用的是golang 的特性,主要是对于数据库驱动的加载、配置数据库连接状态的检测、以及宏的解析,赋值(vars.go )
 
  1. {
  1.    // 配置数据库状态检测
  1.    tstconn, err := sqlx.Connect(*flagDBDriver, *flagDBDSN)
  1.    if err != nil {
  1.      fmt.Println(color.RedString("[%s] %s - connection error - (%s)", *flagDBDriver, *flagDBDSN, err.Error()))
  1.      os.Exit(0)
  1.   }
  1.    tstconn.Close()
  1. }
  1. {
  1.    // 宏的解析以及vars.go 中变量的赋值
  1.    manager, err := NewManager(*flagAPIFile)
  1.    if err != nil {
  1.      fmt.Println(color.RedString("(%s)", err.Error()))
  1.      os.Exit(0)
  1.   }
  1.    macrosManager = manager
  1. }
 
 
  • macrosManager 的处理
    macrosManager 主要是解析hcl 配置文件,并保存map 对象中,同时提供了GET以及LIST 方便后边
    echo rest 框架处理宏调用的
    macrosManager 数据结构
 
  1. type Manager struct {
  1.  // 宏对象,包含了,rest 请求的生命周期的组件
  1.  macros map[string]*Macro
  1. // 主要是为了使用使用text/template 模版解析exec 宏
  1.  compiled *template.Template
  1. }
 
 

Macro 数据结构
Macro 定义了每个宏的完整信息: method validator authorizer exec bind include(依赖),transformer 数据转换
主要的方式是Call ,更具输入的input 数据指定rest 的处理(数据校验,数据绑定,依赖执行,数据转换),后边
为具体分析

  1. type Macro struct {
  1.  Methods []string
  1.  Include []string
  1.  Validators map[string]string
  1.  Authorizer string
  1.  Bind map[string]string
  1.  Exec string
  1.  Aggregate []string
  1.  Transformer string
  1.  name string
  1.  manager *Manager
  1. }
 
 
  • mian 入口
    main.go 主要是对于rest 以及resp 协议服务的初始化&&启动
 
  1. // resp 协议支持
  1. go (func() {
  1.    err <- initRESPServer()
  1. })()
  1. // rest 协议支持
  1.  go (func() {
  1.    err <- initRESTServer()
  1. })()
 

sqler sql 转rest api 源码解析(一)应用的启动入口的更多相关文章

  1. sqler sql 转rest api 源码解析(四)macro 的执行

    macro 说明 macro 是sqler 的核心,当前的处理流程为授权处理,数据校验,依赖执行(include),聚合处理,数据转换 处理,sql 执行以及sql 参数绑定 授权处理 这个是通过go ...

  2. sqler sql 转rest api 源码解析(三) rest协议

    rest 服务说明 rest 协议主要是将配置文件中的宏暴露为rest 接口,使用了labstack/echo web 框架,同时基于context 模型 进行宏管理对象的共享,同时进行了一些中间件的 ...

  3. sqler sql 转rest api 源码解析(二) resp 协议

    resp 协议主要是方便使用redis 客户端进行连接,resp 主要是依赖 tidwall/redcon golang redis 协议包 resp 服务说明 server_resp.go 文件,干 ...

  4. Netty 4源码解析:服务端启动

    Netty 4源码解析:服务端启动 1.基础知识 1.1 Netty 4示例 因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象.而且5.0的变化也不像4.0这么大,好 ...

  5. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动

    Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  6. Flink 源码解析 —— Standalone session 模式启动流程

    Standalone session 模式启动流程 https://t.zsxq.com/EemAEIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0 ...

  7. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动

    Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...

  8. 第三十四节,目标检测之谷歌Object Detection API源码解析

    我们在第三十二节,使用谷歌Object Detection API进行目标检测.训练新的模型(使用VOC 2012数据集)那一节我们介绍了如何使用谷歌Object Detection API进行目标检 ...

  9. Vue源码解析(一):入口文件

    在学习Vue源码之前,首先要做的一件事情,就是去GitHub上将Vue源码clone下来,目前我这里分析的Vue版本是V2.5.21,下面开始分析: 一.源码的目录结构: Vue的源码都在src目录下 ...

随机推荐

  1. Linux查看当前使用的网卡 以及 查看某进程使用的网络带宽情况 以及 端口占用的情况

    一:Linux查看当前使用的网卡          ifconfig命令可以查看当前linux 系统有多少个网卡. [app@p2-app2 ~]$ ifconfig br-2e5b046a02d5: ...

  2. Jmeter响应中中文乱码怎么解决

    在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成samp ...

  3. c/c++动态内存分配的区别

    c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...

  4. DevExpress v18.1新版亮点——Reporting篇(一)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Reporting v18.1 的新功能,快来下载试用新版本 ...

  5. Centos7部署kubelet(六)

    1.二进制包准备将软件包从linux-node1复制linux-node2.linux-node3中去 [root@linux-node1 ssl]# cd /usr/local/src/kubern ...

  6. 安装gcc

    yum -y install gcc yum -y install gcc-c++ yum install make   -- 或者 yum groupinstall "Developmen ...

  7. 异常 No module named 'numpy.core._multiarray_umath

    No module named 'numpy.core._multiarray_umath 解决方法: 1. 可能是由于模型保存时出错,导致模型没有保存成功,此时删掉保存的模型即可 2. numpy版 ...

  8. day 67 django 之ORM 增删改查基础

    一 操作基础前提准备 1. 新建django 项目 mysite  子项目app01 ,选择好做路径. 2  .2-1在app01 下面models 中引用 模块 from  django.db im ...

  9. ios UITableView背景图片设置

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...

  10. delphi reintroduce作用

    当在子类中重载或者重新声明父类的虚方法时,使用  reintroduce   关键字告知编译器,可以消除警告信息. 如: TParent = class procedure proc;virtual; ...