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

posted on   荣锋亮  阅读(598)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2014-01-14 转 微软发布TX(LINQ To Logs And Traces)
2014-01-14 nginx php 配置
2014-01-14 如何判断一个请求是否为AJAX请求
2014-01-14 使用rewrite 让php 实现类似asp.net 的IHttpModule 进行带参数js文件的参数获取

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示