乐趣区

关于apisix:Apache-APISIX-320-LTS-正式发布

APISIX 3.2.0 是 3.0 大版本以来的第一个 LTS 版本。此次发版,是 3.x 时代更替 2.x 时代的一大里程碑。从此之后,新的一系列 patch 版本将会在 3.2 的根底上公布。本次公布一如平常一样带来了许多新的插件和个性,为 APISIX 的使用者带来不一样的新玩法。

原文链接

新个性:四层上的服务发现

只有多数网关反对服务发现,APISIX 就是其中之一。在 3.2.0 版本中,APISIX 把原来七层上的服务发现的性能也做到了四层上。这样一来,将 APISIX 作为 TCP/UDP 代理时也能享受到服务发现带来的便利性。和在七层上的服务发现一样,要想用上服务发现,咱们须要先在 config.yaml 中配置服务发现服务器的地址:

discovery:
  nacos:
    host:
      - "http://192.168.33.1:8848"

而后在具体的 upstream 上配置 discovery_typeservice_name

$ curl http://127.0.0.1:9180/apisix/admin/stream_routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '{"remote_addr":"127.0.0.1","upstream": {"scheme":"tcp","discovery_type":"nacos","service_name":"APISIX-NACOS","type":"roundrobin"}
}'

这样拜访 stream_routes 时,上游的节点会从 Nacos 的 APISIX-NACOS 服务中获取。

新插件:RESTful 申请转 GraphQL

在 3.2 版本中,APISIX 新增了一个能将 RESTful 申请转成 GraphQL 的插件。如果你有这样的 GraphQL 查问语句:

query($name: String!, $githubAccount: String!) {persons(filter: { name: $name, githubAccount: $githubAccount}) {
    id
    name
    blog
    githubAccount
    talks {
      id
      title
    }
  }
}

其中 $name$githubAccount 是两个 GraphQL 变量。

咱们能够用如下的配置来暴露出同样的 RESTful 接口:

curl --location --request PUT 'http://localhost:9180/apisix/admin/routes/1' \
--header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
--header 'Content-Type: application/json' \
--data-raw '{"uri":"/graphql","upstream": {"type":"roundrobin","nodes": {"127.0.0.1:8080": 1}
    },
    "plugins": {
        "degraphql": {"query": "query($name: String!, $githubAccount: String!) {\n  persons(filter: { name: $name, githubAccount: $githubAccount}) {\n    id\n    name\n    blog\n    githubAccount\n    talks {\n      id\n      title\n}\n  }\n}",
            "variables": [
                "name",
                "githubAccount"
            ]
        }
    }
}'

这里 query 是咱们要用到的查问语句,variables 是当时申明的变量列表。

接下来就能像 RESTful 接口一样拜访它:

curl --location --request POST 'http://localhost:9080/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{"name":"Niek","githubAccount":"npalm"}'

后果跟间接用对应的 GraphQL 语句拜访上游是一样的:

{
  "data": {
    "persons": [
      {
        "id": "7",
        "name": "Niek",
        "blog": "https://040code.github.io",
        "githubAccount": "npalm",
        "talks": [
          {
            "id": "19",
            "title": "GraphQL - The Next API Language"
          },
          {
            "id": "20",
            "title": "Immutable Infrastructure"
          }
        ]
      }
    ]
  }
}

你同样能用 GET 申请来拜访同样的接口,这时候参数就须要通过 query string 来传递:

curl 'http://localhost:9080/graphql?name=Niek&githubAccount=npalm'

新个性:反对在每个日志插件上设置日志格局

在 3.2 版本,咱们整顿了 APISIX 现有的十多个 access 日志插件。当初每个插件都反对配置自定义日志格局:

  1. 在该插件的 plugin metadata 中定义全局的日志格局
  2. 在具体的路由规定上的该插件的配置中定义以后路由的日志格局

clickhouse-logger 为例,上面是定义全局日志格局的做法:

curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/clickhouse-logger \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"log_format": {"host":"$host","@timestamp":"$time_iso8601","client_ip":"$remote_addr"}
}'

上面则是以后路由的日志格局:

curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"plugins": {"clickhouse-logger": {"log_format": {"host":"$host","@timestamp":"$time_iso8601","client_ip":"$remote_addr"},"user":"default","password":"a","database":"default","logtable":"test","endpoint_addrs": ["http://127.0.0.1:8123"]
            }
       },
      "upstream": {
           "type": "roundrobin",
           "nodes": {"127.0.0.1:1980": 1}
      },
      "uri": "/hello"
}'

新插件:申请体 / 响应体转换

你是否在为如何把返回 XML 的古早上游服务介绍给只承受 JSON 的古代客户端而苦恼?3.2.0 版本新增的 body-transformer 插件开源解决这个问题。

body-transformer 插件反对 JSON 和 XML 之间的相互转换。不过这并非是它惟一能做的事。它还反对通过模板配置输入输出的内容的具体格局。举个例子,

假如你有上面的 JSON 模板:{"foo":"{{name .." world"}}","bar":{{age+10}}},并把它配置到 body-transformer 插件的 request.template 字段中:

      ...
      "body-transformer": {
          "request": {"template": "..."}
      }
      ...

那么当申请内容为 {"name":"hello","age":20},发送给上游的是改写之后的 {"foo":"hello world","bar":30}。咱们采纳了 lua-resty-template 来渲染模板,所以你能够在模板中嵌入 Lua 表达式来实现改写逻辑。

对上游输入的改写也是相似的,只是须要配置的是插件的 response.template 字段。

新性能:优化和更多的小性能

除了下面提到的几个大的性能外,此次公布也蕴含许多值得述说的改变:

  • error-log-logger 插件反对发送谬误日志到 Kafka
  • limit-count 插件反对返回 X-RateLimit-Reset 响应头

等等。

如果你对残缺的内容感兴趣,请参考 3.2 公布的 CHANGELOG:https://github.com/apache/apisix/blob/release/3.2/docs/zh/latest/CHANGELOG.md#320

对于 API7.ai 与 APISIX

API7.ai(干流科技)是一家提供 API 解决和剖析的开源根底软件公司,于 2019 年开源了新一代云原生 API 网关 — APISIX 并捐献给 Apache 软件基金会。尔后,API7.ai 始终踊跃投入反对 Apache APISIX 的开发、保护和社区经营。与千万贡献者、使用者、支持者一起做出世界级的开源我的项目,是 API7.ai 致力的指标。

退出移动版