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. es6-priomise

    Promise是异步编程的一种解决方案,它有三种状态,分别是 pending-进行中 resolved-已完成 rejected-已失败 状态一旦改变,就无法再次改变状态,这也是它名字promise- ...

  2. js如何生成一个对象,并转化为json字符串

    js如何生成一个对象,并转化为json字符串,很多人都会误写为: var ary = []; var obj = {}; for (var i = 0; i < 3; i++) { obj.na ...

  3. python作业学员管理系统(第十二周)

    作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学 ...

  4. 深入理解java虚拟机---虚拟机工具jmap(十六)

    原文: https://www.cnblogs.com/myna/p/7573843.html jmap JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用 ...

  5. PE文件 01 导入表

    0x01  导入表结构  数据目录表中的第二个成员标记了导入表的RVA和Size大小,由此可以定位到导入表: typedef struct _IMAGE_DATA_DIRECTORY { DWORD ...

  6. MyEclipse创建Web项目入门指南

    MyEclipse 在线订购年终抄底促销!火爆开抢>> MyEclipse最新版下载 本教程将指导您创建和部署简单的Hello World Web项目.在本教程中,您将学习如何: 创建一个 ...

  7. L300 3月英语课下

    重音 句中的实词(内容词)要被重读,读得重.长一点.句中的虚词(功能词)要被轻读或弱读,读得轻.短一点口语交流中,当虚词的在句中起到重要的表意作用时,会被重读. 连读 连读:把一个单词的尾音同下一个单 ...

  8. leetcode55:跳跃游戏

    解题思路1: 从头往后找每一个为0的元素,判断这个0能够跳过,所有的0都能跳过,则返回True,否则返回False 解题思路2: 从前往后遍历数组,设置一个访问到当前位置i时最远可调到的距离maxle ...

  9. jetty域证书更新

    服务器:centos6.6 1.从正确的.pfx文件中导出.pem认证文件 #openssl pkcs12 -in example.pfx -nodes -out server.pem pfx文件可以 ...

  10. 继承映射中的java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: person is not mapped [FROM person]

    继承映射中查询对象的过程中报错: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxExcep ...