Apache APISIX 3.2.0 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!) {\\npersons(filter: { name: $name, githubAccount: $githubAccount }) {\\nid\\nname\\nblog\\ngithubAccount\\ntalks {\\nid\\ntitle\\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


相關推薦

2023-11-21

Apache APISIX 3.7.0 版本已经发布,带来了一系列新功能、Bug 修复和相关用户体验优化。该新版本添加了许多新功能,包括对 Consul 服务发现的 ACL 令牌的支持、openid-connect 插件中的授权参数、Nacos AK/SK 身份验证等,此外还包含了一

2023-01-11

个版本 v1.5 发布,已经过了 3 个月,我们很高兴地宣布 Apache APISIX Ingress v1.6 正式发布! 在该版本中,共有 29 位贡献者 参与代码提交,其中 17 位是新晋贡献者 ,感谢大家的支持和参与! 本次发布的 Apache APISIX Ingress v1.6 版本

2022-11-19

作为开源的云原生 API 网关,Apache APISIX 致力于在性能和使用体验上为开发者和用户们带来更好更优异的表现,帮助企业解决一些关于云原生和微服务技术下遇到的新问题。 在 9 月底,Apache APISIX 发布了 3.0.0-beta 预览版,为用

2023-07-26

Apache APISIX 3.2.2 现已发布,此版本包含了一系列的修复和优化。 修复 升级 lua-resty-jwt 依赖版本 将 lua-resty-jwt 的依赖版本从 0.2.4 升级到 0.2.5,避免 APISIX jwt-auth 插件中身份验证绕过的安全

2023-06-08

等丰富的流量管理功能。从其主要功能和特点角度来看,Apache APISIX 可以替代 Nginx 来处理南北流量,也可以扮演 Istio 控制平面和 Envoy 数据平面的角色来处理东西向流量。 Bugfix 修复 core.request.add_header 中的无效缓存问题。避

2023-07-25

Apache APISIX 3.4.1 版本现已正式发布,其中包含了针对 JWT 的安全补丁。 修复 升级 lua-resty-jwt 依赖版本 为了解决 APISIX jwt-auth 插件中身份验证绕过的安全风险,将 lua-resty-jwt 的依赖版本从 0.2.4升级到&nbs

2023-09-06

Apache APISIX 3.5.0 现已正式发布,此版本带来了一些新功能和改进的用户体验。包括在主机级别动态配置 TLS 版本、与 Chaitin WAF 的集成、强制删除资源、在独立模式下部署 APISIX 时在配置文件中使用环境变量等。此外,还包含了一

2022-11-05

直播嘉宾 ▲ 王晔倞(头哥), 支流科技技术 VP、Apache APISIX Committer   ▲  tison,Apache Member & Incubator Mentor,Apache Flink Committer,微信公众号 “夜天之书” 作者   ▲ 李志信, ioc-golang 作者,Apache Dubbo P

2023-03-21

亲爱的社区小伙伴们,我们很高兴地宣布,Apache Doris 于 2023 年 3 月 20 日迎来 1.2.3 Release 版本的正式发布!在新版本中包含超过 200 项功能优化和问题修复。同时,1.2.3 版本作为 1.2 LTS 的迭代版本,更加稳定易用,建议用户升级

2022-10-18

我们很高兴地告诉大家,在 2022 年 10 月 17 日我们迎来了 Apache Doris 1.1.3 版本的正式发布。作为 1.1 LTS 版本基础之上的 Bugfix 版本,在 1.1.3 版本中有超过 80 个 Issue 或性能优化项被合入,系统稳定性和性能得以进一步加强,推荐所

2023-01-04

亲爱的社区小伙伴们,我们很高兴地宣布,Apache Doris 于 2023 年1 月 4 日迎来 1.2.1 Release 版本的正式发布!在新版本中,Apache Doris 团队修复了自 1.2.0 版本发布以来约 200 个问题或性能改进项。同时,1.2.1 版本作为 1.2 LTS 的第一个

2023-09-16

TS 版本,为订阅客户提供最长5年的支持。 新扩展插件: Apache AGE ,在 PostgreSQL 上提供图数据库查询能力 新扩展插件: zhparser,中文分词,用于支持中文全文检索功能 新扩展插件: pg_roaringbitmap,高效实现 RoaringBitmap 位图功能

2023-04-16

Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。Apache Dubbo 3.2.0 现已发布,这是 Dubbo 3 的全新版本,包括 REST、可观

2022-11-30

自 Apache Doris 1.1.0 版本发布距今已经有数月之久,在这一期间,我们重新思考并确立了社区新版本发布的流程,正式引入了 LTS (Long-Term Support,长周期支持)版本的概念,在 1.1.x 系列版本中不再引入大的功能 Feature、仅提供问题