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()
  })()
 

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. XML(二)

    XML XML介绍 1.什么是xml? 概念:XML(EXtensible Markup Language)XML 指可扩展标记语言(EXtensible Markup Language) 可扩展:我 ...

  2. 戴尔poweredge r730服务器配置及系统安装详解教程

    第一次给服务器安装的是ubantu系统: 首先我们开机进入小型BIOS设置一下RAID,或者进入服务器管理系统,在系统的BIOS中进行RAID设置: 开机后当看到出现< Ctrl > 时按 ...

  3. AngularJs和Vue比较

    http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

  4. 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  5. 2.7 C++构造函数

    参考:http://www.weixueyuan.net/view/6339.html 总结: 如果在类中声明了任何一个构造函数,则系统不会自动生成默认构造函数.构造函数同样能够使用类中的成员变量. ...

  6. minifilter

    暑假刚开始的时候,参照<寒江独钓>这本书,用VS2015写过的一个minifilter的框架,今天在博客上分享出来. VS2015已经有了minifilter的框架模板,直接生成了mini ...

  7. [HAOI2006]l旅行

    这道题...一眼看出一个暴力思虑...那就是按照生成树... 排完序之后从当前边开始向后做生成树... 统计一下答案就好了... 结果...这就是正解...QVQ...smg...我去... 呆码: ...

  8. elk之elasticsearch安装

    环境: centos7 jdk8 参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.htmlhttp:// ...

  9. <Impala><Overview><UDF>

    Overview Apache Impala (incubating) is the open source, native analytic database for apache Hadoop. ...

  10. day 46 前端基础 基本框架

    注意一点 使用绝对路径的时候 在pxm里 打开显示不了图片 可以直接找到那个实际的网页去打开 还可能是图片的格式尽量用jpg一 详细解释 <!DOCTYPE html>声明为HTML5文档 ...