网关,可以将网关比作“门”,但是需要区分网关与网桥的区别;
网桥工作在数据链路层,在不同或相同类型的LAN之间存储并转发数据帧,必要时进行链路层上的协议转换。可连接两个或多个网络,在其中传送信息包。
网关是一个大概念,不具体特指一类产品,只要连接两个不同的网络都可以叫网关,网桥一般只转发信息,而网关可能进行包装。
通俗的例子:
对应过来,api网关就是:
微服务网关作为微服务后端服务的统一入口,它可以统筹管理后端服务,主要分为数据平面和控制平面:
数据平面主要功能是接入用户的HTTP请求和微服务被拆分后的聚合。使用微服务网关统一对外暴露后端服务的API和契约,路由和过滤功能正是网关的核心能力模块。另外,微服务网关可以实现拦截机制和专注跨横切面的功能,包括协议转换、安全认证、熔断限流、灰度发布、日志管理、流量监控等。
控制平面主要功能是对后端服务做统一的管控和配置管理。例如,可以控制网关的弹性伸缩;可以统一下发配置;可以对网关服务添加标签;可以在微服务网关上通过配置Swagger功能统一将后端服务的API契约暴露给使用方,完成文档服务,提高工作效率和降低沟通成本
路由功能:路由是微服务网关的核心能力。通过路由功能微服务网关可以将请求转发到目标微服务。在微服务架构中,网关可以结合注册中心的动态服务发现,实现对后端服务的发现,调用方只需要知道网关对外暴露的服务API就可以透明地访问后端微服务。
负载均衡:API网关结合负载均衡技术,利用Eureka或者Consul等服务发现工具,通过轮询、指定权重、IP地址哈希等机制实现下游服务的负载均衡。
统一鉴权:一般而言,无论对内网还是外网的接口都需要做用户身份认证,而用户认证在一些规模较大的系统中都会采用统一的单点登录(Single Sign On)系统,如果每个微服务都要对接单点登录系统,那么显然比较浪费资源且开发效率低。API网关是统一管理安全性的绝佳场所,可以将认证的部分抽取到网关层,微服务系统无须关注认证的逻辑,只关注自身业务即可。
协议转换:API网关的一大作用在于构建异构系统,API网关作为单一入口,通过协议转换整合后台基于REST、AMQP、Dubbo等不同风格和实现技术的微服务,面向Web Mobile、开放平台等特定客户端提供统一服务。
指标监控:网关可以统计后端服务的请求次数,并且可以实时地更新当前的流量健康状态,可以对URL粒度的服务进行延迟统计,也可以使用Hystrix Dashboard查看后端服务的流量状态及是否有熔断发生。
限流熔断:在某些场景下需要控制客户端的访问次数和访问频率,一些高并发系统有时还会有限流的需求。在网关上可以配置一个阈值,当请求数超过阈值时就直接返回错误而不继续访问后台服务。当出现流量洪峰或者后端服务出现延迟或故障时,网关能够主动进行熔断,保护后端服务,并保持前端用户体验良好。
黑白名单:微服务网关可以使用系统黑名单,过滤HTTP请求特征,拦截异常客户端的请求,例如DDoS攻击等侵蚀带宽或资源迫使服务中断等行为,可以在网关层面进行拦截过滤。比较常见的拦截策略是根据IP地址增加黑名单。在存在鉴权管理的路由服务中可以通过设置白名单跳过鉴权管理而直接访问后端服务资源。
灰度发布:微服务网关可以根据HTTP请求中的特殊标记和后端服务列表元数据标识进行流量控制,实现在用户无感知的情况下完成灰度发布。
流量染色:和灰度发布的原理相似,网关可以根据HTTP请求的Host、Head、Agent等标识对请求进行染色,有了网关的流量染色功能,我们可以对服务后续的调用链路进行跟踪,对服务延迟及服务运行状况进行进一步的链路分析。
文档中心:网关结合Swagger,可以将后端的微服务暴露给网关,网关作为统一的入口给接口的使用方提供查看后端服务的API规范,不需要知道每一个后端微服务的Swagger地址,这样网关起到了对后端API聚合的效果。
日志审计:微服务网关可以作为统一的日志记录和收集器,对服务URL粒度的日志请求信息和响应信息进行拦截
按照使用数量、成熟度等来划分,主流的有 4 个:
c++的水太深,小伙子们把握不住,java太复杂繁琐,因此可以选择的api网关有:OpenResty,Kong,Grpc-Gateway.
Kong | Traefik | Ambassador | Tyk | Zuul | |
---|---|---|---|---|---|
基本 | |||||
主要用途 | 企业级API管理 | 微服务网关 | 微服务网关 | 微服务网关 | 微服务网关 |
学习曲线 | 适中 | simple | simple | 适中 | simple |
成本 | 开源/企业版 | 开源 | 开源/pro | 开源/企业版 | 开源 |
社区star | 20742 | 21194 | 1719 | 4299 | 7186 |
配置 | |||||
配置语言 | Admin Rest api, Text file(nginx.conf 等) | TOML | YAML(kubernetes annotation) | Tyk REST API | REST API,YAML静态配置 |
配置端点类型 | 命令式 | 声明式 | 声明式 | 命令式 | 命令式 |
拖拽配置 | yes | no | no | no | no |
管理模式 | configurable | decentralised, self-service | decentralised, self-service | decentralised, self-service | decentralised, self-service |
部署 | |||||
kubernetes | 适中(k8s yaml,helm chart) | easy | easy | 适中(k8s yaml,helm chart) | 适中(k8s yaml,helm chart) |
Cloud IAAS | high | easy | N/A | easy | easy |
Private Data Center | high | easy | N/A | easy | easy |
部署模式 | 金丝雀(企业版) | 金丝雀 | 金丝雀,shadow | 金丝雀 | 金丝雀 |
state | postgres,cassandra | kubernetes | kubernetes | redis | 内存文件 |
可扩展性 | |||||
扩展功能 | 插件 | 自己实现 | 插件 | 插件 | 自己实现 |
扩展方法 | 水平 | 水平 | 水平 | 水平 | 水平 |
功能 | |||||
服务发现 | 动态 | 动态 | 动态 | 动态 | 动态 |
协议 | http,https,websocket | http,https,grpc,websocket | http,https,grpc,websocket | http,https,grpc,websocket | http,https |
基于 | kong+nginx | traefik | envoy | tyk | zuul |
ssl 终止 | yes | yes | yes | yes | no |
websocket | yes | yes | yes | yes | no |
routing | host,path,method | host,path | host,path,header | host,path | |
限流 | yes | no | yes | yes | 需要开发 |
熔断 | yes | yes | no | yes | 需要其他组件 |
重试 | yes | yes | no | yes | yes |
健康检查 | yes | no | no | yes | yes |
负载均衡算法 | 轮询,哈希 | 轮询,加权轮询 | 加权轮询 | 轮询 | 轮询,随机,加权轮询,自定义 |
权限 | Basic Auth, HMAC, JWT, Key, LDAP, OAuth 2.0, PASETO, plus paid Kong Enterprise options like OpenID Connect | basic | yes | HMAC,JWT,Mutual TLS,OpenID Connect,基本身份验证,LDAP,社交OAuth(例如GPlus,Twitter,Github)和传统基本身份验证提供程序 | 开发实现 |
tracing | yes | yes | yes | yes | 需要其他组件 |
istio集成 | no | no | yes | no | no |
dashboard | yes | yes | grafana,Prometheus | yes |
OpenResty基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用
APISIX 是基于 OpenResty + etcd 实现的云原生、高性能、可扩展的微服务 API 网关。它是国人开源,目前已经进入 Apache 进行孵化。
APISIX 通过插件机制,提供了动态负载平衡、身份验证、限流限速等等功能,当然我们也可以自己开发插件进行拓展。
docker安装kong:安装文档
使用docker安装postgresql:
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=Passw0rd" \
-e "POSTGRES_HOST_AUTH_METHOD=trust" \
postgres:9.6
使用临时Kong容器运行迁移:
docker run --rm \
--network=kong-net \
-e "KONG_LOG_LEVEL=debug" \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=Passw0rd" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations bootstrap
启动Kong
docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=Passw0rd" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest
安装图形化界面
docker run -d -p 1337:1337 --name konga pantsel/konga
kong作为网关基本功能是路由转发,konga提供图形化界面来配置kong。首先如果需要配置kong第一步需要理解konga的几个术语。
首先需要创建一个service,service作为route和upstream的桥梁,所以第一步先创建一个service。
创建APISIX网络
docker network create \
--driver=bridge \
--subnet=172.18.0.0/16 \
--ip-range=172.18.5.0/24 \
--gateway=172.18.5.254 \
apisix
或
docker network create apisix
编写apisix和etcd的配置文件,参考官方文档:https://github.com/apache/apisix-docker/blob/master/example/apisix_conf/config.yaml
apisix:
node_listen: 9080 # APISIX listening port
enable_ipv6: false
enable_control: true
control:
ip: "0.0.0.0"
port: 9092
deployment:
admin:
allow_admin: # https://nginx.org/en/docs/http/ngx_http_access_module.html#allow
- 0.0.0.0/0 # We need to restrict ip access rules for security. 0.0.0.0/0 is for test.
admin_key:
- name: "admin"
key: edd1c9f034335f136f87ad84b625c8f1
role: admin # admin: manage all configuration data
- name: "viewer"
key: 4054f7cf07e344346cd3f287985e76a2
role: viewer
etcd:
host: # it's possible to define multiple etcd hosts addresses of the same etcd cluster.
- "http://etcd:2379" # multiple etcd address
prefix: "/apisix" # apisix configurations prefix
timeout: 30 # 30 seconds
plugin_attr:
prometheus:
export_addr:
ip: "0.0.0.0"
port: 9091
etcd:
# Human-readable name for this member.
name: 'default'
# Path to the data directory.
data-dir:
# Path to the dedicated wal directory.
wal-dir:
# Number of committed transactions to trigger a snapshot to disk.
snapshot-count: 10000
# Time (in milliseconds) of a heartbeat interval.
heartbeat-interval: 100
# Time (in milliseconds) for an election to timeout.
election-timeout: 1000
# Raise alarms when backend size exceeds the given quota. 0 means use the
# default quota.
quota-backend-bytes: 0
# List of comma separated URLs to listen on for peer traffic.
listen-peer-urls: http://0.0.0.0:2380
# List of comma separated URLs to listen on for client traffic.
listen-client-urls: http://0.0.0.0:2379
# Maximum number of snapshot files to retain (0 is unlimited).
max-snapshots: 5
# Maximum number of wal files to retain (0 is unlimited).
max-wals: 5
# Comma-separated white list of origins for CORS (cross-origin resource sharing).
cors:
# List of this member's peer URLs to advertise to the rest of the cluster.
# The URLs needed to be a comma-separated list.
initial-advertise-peer-urls: http://localhost:2380
# List of this member's client URLs to advertise to the public.
# The URLs needed to be a comma-separated list.
advertise-client-urls: http://localhost:2379
# Discovery URL used to bootstrap the cluster.
discovery:
# Valid values include 'exit', 'proxy'
discovery-fallback: 'proxy'
# HTTP proxy to use for traffic to discovery service.
discovery-proxy:
# DNS domain used to bootstrap initial cluster.
discovery-srv:
# Initial cluster configuration for bootstrapping.
initial-cluster:
# Initial cluster token for the etcd cluster during bootstrap.
initial-cluster-token: 'etcd-cluster'
# Initial cluster state ('new' or 'existing').
initial-cluster-state: 'new'
# Reject reconfiguration requests that would cause quorum loss.
strict-reconfig-check: false
# Accept etcd V2 client requests
enable-v2: true
# Enable runtime profiling data via HTTP server
enable-pprof: true
# Valid values include 'on', 'readonly', 'off'
proxy: 'off'
# Time (in milliseconds) an endpoint will be held in a failed state.
proxy-failure-wait: 5000
# Time (in milliseconds) of the endpoints refresh interval.
proxy-refresh-interval: 30000
# Time (in milliseconds) for a dial to timeout.
proxy-dial-timeout: 1000
# Time (in milliseconds) for a write to timeout.
proxy-write-timeout: 5000
# Time (in milliseconds) for a read to timeout.
proxy-read-timeout: 0
client-transport-security:
# Path to the client server TLS cert file.
cert-file:
# Path to the client server TLS key file.
key-file:
# Enable client cert authentication.
client-cert-auth: false
# Path to the client server TLS trusted CA cert file.
trusted-ca-file:
# Client TLS using generated certificates
auto-tls: false
peer-transport-security:
# Path to the peer server TLS cert file.
cert-file:
# Path to the peer server TLS key file.
key-file:
# Enable peer client cert authentication.
client-cert-auth: false
# Path to the peer server TLS trusted CA cert file.
trusted-ca-file:
# Peer TLS using generated certificates.
auto-tls: false
# Enable debug-level logging for etcd.
debug: false
logger: zap
# Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.
log-outputs: [stderr]
# Force to create a new one member cluster.
force-new-cluster: false
auto-compaction-mode: periodic
auto-compaction-retention: "1"
启动etcd服务(apisix不支持etcdv3)
docker run -it --name etcd-server -d \
-v `pwd`/example/etcd_conf/etcd.conf.yml:/opt/bitnami/etcd/conf/etcd.conf.yml \
-p 2379:2379 \
-p 2380:2380 \
--network apisix \
--ip 172.18.5.10 \
--env ALLOW_NONE_AUTHENTICATION=yes ETCD_ENABLE_V2: "true"\
bitnami/etcd:3.4.9
或
docker run -it --name etcd-server \
-v `pwd`/example/etcd_conf/etcd.conf.yml:/opt/bitnami/etcd/conf/etcd.conf.yml \
-p 2379:2379 \
-p 2380:2380 \
--network apisix \
--env ALLOW_NONE_AUTHENTICATION=yes bitnami/etcd:3.4.9
启动ApiSix服务
docker run --name test-api-gateway \
-v `pwd`/example/apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml \
-v `pwd`/example/apisix_log:/usr/local/apisix/logs \
--privileged=true \
-p 9080:9080 \
-p 9091:9091 \
-p 9443:9443 \
--network apisix \
--ip 172.18.5.11 \
-d apache/apisix
或
docker run --name test-api-gateway \
-v `pwd`/example/apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml \
-v `pwd`/example/apisix_log:/usr/local/apisix/logs \
--privileged=true \
-p 9080:9080 \
-p 9091:9091 \
-p 9443:9443 \
--network apisix \
-d apache/apisix
手动部署动不动出错,可以直接下载官方案例:
git clone https://github.com/apache/apisix-docker.git
然后进入example目录:
执行docker compose up
,所有服务就都启动了:
进入登录页面:
账号密码都在配置文件里面保存了,默认是admin/admin
和user/user
一个微服务可以通过 APISIX 的路由、服务、上游和插件等多个实体之间的关系进行配置。 Route(路由)与客户端请求匹配,并指定它们到达 APISIX 后如何发送到 Upstream(上游,后端 API 服务)。 Service(服务)为上游服务提供了抽象。因此,您可以创建单个 Service 并在多个 Route 中引用它。
APISIX Upstream,是虚拟主机抽象,对给定的多个服务节点按照配置规则进行负载均衡。它根据配置规则在给定的一组服务节点上执行负载平衡。 因此,单个上游配置可以由提供相同服务的多个服务器组成。每个节点将包括一个 key(地址/ip:port)和一个 value (节点的权重)。 服务可以通过轮询或一致哈希(cHash)机制进行负载平衡。
配置路由时,可以直接设置 Upstream 信息,也可以使用服务抽象来引用 Upstream 信息。
在 APISIX 控制台的「Upstream」菜单中,创建一个 APISIX Upstream。如下图所示:
由于官方example自动启动了两个nginx,
就以这两个nginx作为服务。
APISIX Route,字面意思就是路由,通过定义一些规则来匹配客户端的请求,然后根据匹配结果加载并执行相应的 插件,并把请求转发给到指定 Upstream。
选择上一步创建的上游:
访问http://192.168.71.151:9080/
,apisix会将/
这个请求路径的请求发到nginx1/
和nginx2/
上。
注意9080
是网关的端口,9000
是apisix的端口,不要带入错了。
APISIX 内置了三个限流限速插件:
漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。
漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
上述截图配置含义:限制了每秒请求速率为 1,大于 1 小于 2的会被加上延时,速率超过 2就会被拒绝。
然后用go模仿高并发:
const limit = 100
func request(wg *sync.WaitGroup, number int) {
defer wg.Done()
resp, err := http.Get("http://192.168.71.151:9080/")
if err != nil {
log.Println(err)
return
}
body := resp.Body
defer body.Close()
content, _ := io.ReadAll(body)
fmt.Println("第", number, "次请求", "状态码", resp.StatusCode, "响应body", string(content))
}
func main() {
wg := new(sync.WaitGroup)
defer wg.Wait()
wg.Add(limit)
for i := 0; i < limit; i++ {
go request(wg, i)
}
}
Apisix 的限制或并发连接插件。
属性:
区别与limit-req,limit-conn是用户请求过来,服务端拒绝服务,所以应该返回5xx状态码。而limit-req是客户请求数量超过限制了,服务端运行相关逻辑,已经提供服务了(哪怕返回403也是提供服务了)。
上面启用的插件的参数表示只允许两个并发请求。 当收到多个并发请求时,将直接返回 503 拒绝请求。
APISIX 内置了四个身份验证插件:
属性:
名称 | 类型 | 必选项 | 默认值 | 有效值 | 描述 |
---|---|---|---|---|---|
key | string | 是 | Consumer 的 access_key 必须是唯一的。如果不同 Consumer 使用了相同的 access_key ,将会出现请求匹配异常。 |
||
secret | string | 否 | 加密秘钥。如果未指定,后台将会自动生成。该字段支持使用 APISIX Secret 资源,将值保存在 Secret Manager 中。 | ||
public_key | string | 否 | RSA 或 ECDSA 公钥, algorithm 属性选择 RS256 或 ES256 算法时必选。该字段支持使用 APISIX Secret 资源,将值保存在 Secret Manager 中。 |
||
private_key | string | 否 | RSA 或 ECDSA 私钥, algorithm 属性选择 RS256 或 ES256 算法时必选。该字段支持使用 APISIX Secret 资源,将值保存在 Secret Manager 中。 |
||
algorithm | string | 否 | "HS256" | ["HS256", "HS512", "RS256", "ES256"] | 加密算法。 |
exp | integer | 否 | 86400 | [1,...] | token 的超时时间。 |
base64_secret | boolean | 否 | false | 当设置为 true 时,密钥为 base64 编码。 |
|
lifetime_grace_period | integer | 否 | 0 | [0,...] | 定义生成 JWT 的服务器和验证 JWT 的服务器之间的时钟偏移。该值应该是零(0)或一个正整数。 |
我已经创建了一个 APISIX Route:/
。这里,我们给该 Route 配置下 JWT-auth 插件。如下图所示:
首先,你需要为签发 token 的 API 配置一个 Route,该路由将使用 public-api 插件。(必须用命令,因为页面配置需要上游)
curl http://127.0.0.1:9180/apisix/admin/routes/jas \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/apisix/plugin/jwt/sign",
"plugins": {
"public-api": {}
}
}'
func request(wg *sync.WaitGroup, number int) {
defer wg.Done()
req, _ := http.NewRequest(http.MethodGet, "http://192.168.71.151:9080/", nil)
req.Header.Set("Authorization", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJrZXkiOiJnZW5lcmFsenkiLCJleHAiOjE2OTMxMTYzMTB9.smOD99jrHfuUjJiHuhhVrd8VZxiafp9j6uLvLol0uW5ZSdJ135gI6dVvhAnoaVGQYNwje19kEBW4W76w-_saRw")
resp, _ := http.DefaultClient.Do(req)
body := resp.Body
defer body.Close()
content, _ := io.ReadAll(body)
fmt.Println("第", number, "次请求", "状态码", resp.StatusCode, "响应body", string(content))
}
func main() {
wg := new(sync.WaitGroup)
defer wg.Wait()
wg.Add(limit)
for i := 0; i < limit; i++ {
go request(wg, i)
}
}
支持对上游节点的主动和被动健康检查,在负载均衡时自动过滤掉不健康的节点。
由于控制台dashboard没有健康检查的配置项,所以需要通过APISIX api方式在服务端执行如下语句。
使用 REST Admin API 来控制 Apache APISIX,默认只允许 127.0.0.1 访问,你可以修改 conf/config.yaml 中的 allow_admin 字段,指定允许调用 Admin API 的 IP 列表。
同时需要注意的是,Admin API 使用 key auth 来校验调用者身份,在部署前需要修改 conf/config.yaml 中的 admin_key 字段,来保证安全。
generalzy:服务deploy于k8s一般都会配置存活探针,个人感觉没必要细读apisix的健康检查模块。
APISIX 和 Kong 都是流行的开源API网关项目,它们在功能、架构和生态系统等方面有一些区别。下面是一个对比它们的优劣势的概览,但需要注意的是,这些优劣势在不同的使用情境下可能会有所不同。
APISIX 的优劣势:
优势:
高性能: APISIX使用Nginx作为底层引擎,因此具有卓越的性能和吞吐量,适用于高流量环境。
动态配置: APISIX支持动态配置,可以实时更改路由、插件和策略,无需重启网关。
插件系统: APISIX提供了丰富的插件系统,允许用户根据需要轻松地添加和定制功能,如认证、限流、监控等。
灰度发布: APISIX支持灰度发布,使您可以逐步将流量引导到新版本的API,降低发布风险。
易于扩展: 作为Apache基金会项目,APISIX的开发和社区支持都是稳定和活跃的,有助于项目的长期发展。
劣势:
生态系统相对较小: 相对于Kong,APISIX的生态系统可能较小,可能缺乏一些现成的插件和解决方案。
学习曲线: 对于不熟悉Nginx配置的开发者来说,学习APISIX可能需要一些时间。
Kong 的优劣势:
优势:
丰富的插件生态: Kong拥有丰富的插件,可以轻松地添加认证、安全性、监控等功能。
易用性: Kong提供了用户友好的管理界面和REST API,使得配置和管理变得相对容易。
多种部署方式: Kong支持多种部署方式,从单节点到集群,适用于不同规模和需求。
社区和商业支持: Kong有活跃的开源社区,同时还提供商业支持和企业版,有助于满足不同层次的需求。
可扩展性: Kong的架构设计允许在需要时进行水平扩展,以应对高流量和大规模应用。
劣势:
性能相对较低: 相对于APISIX使用Nginx引擎,Kong的性能可能稍逊一筹,特别是在高负载情况下。
复杂的配置: 一些高级配置可能相对复杂,需要更深入地了解Kong的架构和配置。
总体而言,选择APISIX还是Kong取决于具体需求、团队技术能力和项目规模。如果更关注性能和动态配置,APISIX可能更适合。如果需要丰富的插件生态、易用性和多种部署方式,Kong可能是更好的选择。