• apisix 开发公共对外接口


    apisix 开发公共对外接口

    1 背景

    公司网关改造,使用 Apisix 替换原有的 Springcloud Gateway,原来网关上自带了一个接口

    逻辑比较简单,配置文件中有一个开关:

    • 值为 true,则返回
    {
        "status": 200,
        "message": "分享登录开关打开",
        "data": true,
        "rel": true
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 值为 false,则返回
    {
        "status": 200,
        "message": "分享登录开关关闭",
        "data": false,
        "rel": true
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    希望保留原有逻辑,将该接口编写在 Apisix 中(当然,可以随便找个服务,补充这个接口,然后路由到上面,但是这里不想破坏原有逻辑)

    2 资料分析

    查看官网资料可以看到,Apisix 可以通过 public-api 插件对外暴露接口

    但是开启插件必须要与授权插件一起使用,orz___

    image-20230917172126607

    只能通过自己的方式绕过它了

    3 插件开发

    这里开发一个 名为 api-test 的插件,用于对外公开一个接口

    local ngx = ngx
    local core = require("apisix.core")
    local consumer_mod = require("apisix.consumer")
    
    
    local schema = {
      type = "object",
      properties = {
      },
    }
    
    local consumer_schema = {
      type = "object",
      properties = {
        key = { type = "string" },
        switch = {
          type = "boolean",
          default = false
        },
      },
      required = {"key"},
    }
    
    local plugin_name = "api-test"
    
    local _M = {
      version = 0.1,
      priority = 35,
      type = 'auth',
      name = plugin_name,
      schema = schema,
      consumer_schema = consumer_schema
    }
    
    
    function _M.check_schema(conf)
      if schema_type == core.schema.TYPE_CONSUMER then
        return core.schema.check(consumer_schema, conf)
      else
        return core.schema.check(schema, conf)
      end
    end
    
    local function getSwitch()
      local consumer_conf = consumer_mod.plugin(plugin_name)
      if not consumer_conf then
          return core.response.exit(404)
      end
      local consumers = consumer_mod.consumers_kv(plugin_name, consumer_conf, "key")
      local consumer = consumers[plugin_name]
      if not consumer then
        return core.response.exit(401, "Consumer Key Should Be Equal To Plugin Name")
      end
      local switch_flag = consumer.auth_conf.switch
      core.log.warn("consumer_conf: ", switch_flag)
      local tbl = { status = 200 , rel = true }
      if switch_flag then
        tbl["message"] = "分享登录开关打开"
        tbl["data"] = true
      else
        tbl["message"] = "分享登录开关关闭"
        tbl["data"] = false
      end
      return core.response.exit(200, core.json.encode(tbl))
    end
    
    function _M.api()
      return {
          {
            methods = {"GET"},
            uri = "/switch/getSwitch",
            handler = getSwitch,
          }
      }
    end
    
    return _M
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    核心代码,这里需要保证 consumer 的名称与插件名称相同即可通过校验

    local consumer = consumers[plugin_name]
    
    • 1

    4 部署与测试

    添加自定义插件可以参考:apisix 开发自定义插件

    • 添加 消费者
    curl http://127.0.0.1:9180/apisix/admin/consumers \
    -H 'X-API-KEY: ' -X PUT -d '
    {
        "username": "api-test",
        "plugins": {
            "api-test": {
                "key": "api-test",
                "switch": true
            }
        }
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 添加路由
    curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/r1' \
        -H 'X-API-KEY: ' \
        -H 'Content-Type: application/json' \
        -d '{
        "uri": "/switch/getSwitch",
        "plugins": {
            "public-api": {}
        }
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 插件重载

    如果需要改动 lua 脚本,可以通过以下指令 热加载

    curl http://127.0.0.1:9180/apisix/admin/plugins/reload -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT
    
    • 1

    然后就可以测试接口了

    curl 'http://127.0.0.1:9080/switch/getSwitch'
    
    • 1

    返回结果

    {
    	"status": 200,
    	"message": "分享登录开关打开",
    	"rel": true,
    	"data": true
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5 参考资料

    注册公共接口

    public-api插件

  • 相关阅读:
    AI视频风格转换:Stable Diffusion+EBSynth
    react的useState源码分析
    多旅行商问题——公式和求解过程概述
    代码随想录64——额外题目【哈希表、字符串】:205同构字符串、1002查找常用字符、925长键按入、844比较含退格的字符串
    laravel框架介绍(二) composer命令下载laravel报错
    外包干了3天,技术退步明显.......
    linux 用户名和密码的处理
    Haircut(剪发)
    重学Java8新特性(四) : 日期时间API、LocalDateTime、DateTimeFormatter、开发中时间工具类(常用)
    PostgreSQL更改用户登录密码认证协议
  • 原文地址:https://blog.csdn.net/mp9105/article/details/132948298