resp 协议主要是方便使用redis 客户端进行连接,resp 主要是依赖 tidwall/redcon golang redis 协议包

resp 服务说明

server_resp.go 文件,干的事情比较简单,就是redis command 的支持,包含了几个内置的
ping select help quit echo, 以及宏相关的list 以及宏调用的command

代码

server_resp.go

  • 注册redis 协议服务
 
func initRESPServer() error {
  return redcon.ListenAndServe(
    *flagRESPListenAddr,
    func(conn redcon.Conn, cmd redcon.Command) {
      // handles any panic
      defer (func() {
        if err := recover(); err != nil {
          conn.WriteError(fmt.Sprintf("fatal error: %s", (err.(error)).Error()))
        }
      })()
 
 
  • 协议解析
    内置协议的处理help echo ping 。。。
    比较简单,就是写数据,都是字符串类型的
 
// internal command to pick a database
      if todoNormalized == "select" {
        conn.WriteString("OK")
        return
      }
      // internal ping-pong
      if todoNormalized == "ping" {
        conn.WriteString("PONG")
        return
      }
      // ECHO <args ...>
      if todoNormalized == "echo" {
        conn.WriteString(strings.Join(args, " "))
        return
      }
 
 

宏调用
list command 命令,主要是调用macrosManager 的list 方便,返回宏的列表

 
// HELP|INFO|LIST
      if todoNormalized == "list" || todoNormalized == "help" || todoNormalized == "info" {
        conn.WriteArray(macrosManager.Size())
        for _, v := range macrosManager.List() {
          conn.WriteBulkString(v)
        }
      }
 
 

宏方便指定
核心是commandExecMacro

 
macro := macrosManager.Get(todo)
      if nil == macro {
        conn.WriteError("not found")
        conn.Close()
        return
      }
      var input map[string]interface{}
      if len(args) > 0 {
        json.Unmarshal([]byte(args[0]), &input)
      }
      // handle our command
      commandExecMacro(conn, macro, input)
 
 

commandExecMacro 方法如下:

func commandExecMacro(conn redcon.Conn, macro *Macro, input map[string]interface{}) {
  // 调用macro 的call,call 包含了宏生命周期中的处理,注意input 数据是一个json 对象数据,所以通过
  redis 客户端调用宏的时候数据需要json 序列化
  out, err := macro.Call(input)
  if err != nil {
    conn.WriteArray(2)
    conn.WriteInt(0)
    j, _ := json.Marshal(err.Error())
    conn.WriteBulk(j)
    return
  }
  jsonOUT, _ := json.Marshal(out)
  conn.WriteArray(2)
  conn.WriteInt(1)
  conn.WriteBulk(jsonOUT)
}
 
 

参考资料

https://github.com/tidwall/redcon
https://github.com/alash3al/sqler/blob/master/server_resp.go

sqler sql 转rest api 源码解析(二) resp 协议的更多相关文章

  1. sqler sql 转rest api 源码解析(一)应用的启动入口

    sqler sql 转rest api 的源码还是比较简单的,没有比较复杂的设计,大部分都是基于开源 模块实现的. 说明: 当前的版本为2.0,代码使用go mod 进行包管理,如果本地运行注意gol ...

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

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

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

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

  4. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  5. RxJava2源码解析(二)

    title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...

  6. Sentinel源码解析二(Slot总览)

    写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...

  7. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  8. Common.Logging源码解析二

    Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...

  9. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

随机推荐

  1. Cracking The Coding Interview 1.7

    //Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set ...

  2. post请求返回 读取 HTML 表单 URL 编码的数据流时出错

    <httpRuntime maxRequestLength="1048576" executionTimeout="3600" /> 网站配置 限制 ...

  3. SQL-28 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

    题目描述 film表 字段 说明 film_id 电影id title 电影名称 description 电影描述信息 CREATE TABLE IF NOT EXISTS film ( film_i ...

  4. pssac plot

    for multi-waveforms with different colors: R-Xmin/-Xmax/Ymin/Ymax -Ba/b, a: x delta; b:y delta -MYma ...

  5. day 29 socket 理论

    网络编程(socket,套接字)   服务端地址不变 ip + mac 标识唯一一台机器 ip +端口 标识唯一客户端应用程序 套接字: 网络编程   网络编程 一.python提供了两个级别访问的网 ...

  6. shell脚本实例-跟踪网站日常变动

    #!/usr/bin/bash #用途:跟踪网页是否有更新 if [ $# -ne 1 ];then echo -e "$Usage $0 URl " exit fi first_ ...

  7. svn+http+ad域

    svn本地添加用户太麻烦了,如果公司有一百个开发人员要访问,要创建账号密码太麻烦了:所以让他们用AD域账号去登录就很方便,但是权限的管控还是在svn的本地添加(这个暂时还没办法很好的解决) 一.安装依 ...

  8. Python 操作系统介绍 进程的创建

    背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...

  9. js常用到的方法积累

    //获取对象长度的方法 function countObjLen(obj) { var count = 0; for (var property in obj) { if (Object.protot ...

  10. 创建自动化环境(jenkins+tomcat+git+maven,java)

    1.安装jdk 下载1.8以上jdk // 切换到lib cd /usr/lib sudo mkdir jdk cd jdk // 将 jdk拷贝到此目录 // 解压jdk tar -zxvf jdk ...