• 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()
      })()
     
  • 相关阅读:
    tr 删除换行
    ImportExcelUtil 导入excel表格数据转换为对象存储
    苹果手机(ios)拍照上传图片旋转90度问题---java后台处理
    event兼容性解决
    event兼容性解决
    [CodeVS4919]线段树练习4
    [CodeVS4919]线段树练习4
    [CodeVS4919]线段树练习4
    Cocos2D-X2.2.3学习笔记12(瞬时动作)
    Cocos2D-X2.2.3学习笔记12(瞬时动作)
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/10267706.html
Copyright © 2020-2023  润新知