深入理解API网关Kong:动态负载均衡配置
背景
在 NGINX 中,负载均衡的配置主要在 upstream
指令中进行。upstream
指令用于定义一个服务器群组和负载均衡方法。客户端请求在这个服务器群组中进行分发。
NGINX 提供了以下几种负载均衡方法:
-
轮询(round-robin):这是默认的负载均衡方法,每个请求按照时间分发,从第一个服务器开始,直到最后一个,然后重新开始。
-
最少连接(least_conn):这种方法优先分发给当前活动连接数最少的服务器。
-
IP 散列(ip_hash):每个请求的分发根据客户端 IP 地址的 hash 结果进行。这样,来自同一个 IP 的客户端会总是连接到同一个服务器,除非该服务器不可用。
-
基于权重(weight):你可以在每个 server 指令后添加一个
weight
参数,用来调整该服务器的权重。权重越大,分配到的请求越多。
以下是一个简单的例子,展示如何配置一个使用轮询方法的负载均衡:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
在这个例子中,我们定义了一个名为 backend
的服务器群组,其中包含三个服务器:backend1.example.com
,backend2.example.com
和 backend3.example.com
。NGINX 将按照轮询方法在这三个服务器之间分发请求。
这是一个带权重的轮询负载均衡配置的例子:
http {
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
在这个例子中,backend1.example.com
的权重为 3,而其他两个服务器的权重默认为 1。因此,backend1.example.com
将接收到大约三倍于其他服务器的请求。
但这种使用nginx配置的方式,其实是比较麻烦的是静态的,每次改完配置都要重启nginx服务(当然nginx也可以动态就是比较麻烦)。
Kong动态负载均衡
kong就解决了这个问题,可以动态配置且无需重启。接下来就介绍kong如何配置动态负载均衡,用konga可视化配置。
使用http接口操作
设置upstreams
Kong 通过 Upstream 和 Target 实体来提供负载均衡功能。Upstream 对象表示一个可以路由 HTTP 请求的虚拟主机。Target 则是 Upstream 的成员,即实际的服务器。
以下是如何使用 Kong Admin API 创建和配置 Upstream 的步骤:
创建一个 Upstream:
$ curl -X POST http://localhost:8001/upstreams \
--data "name=example-upstream"
在这个例子中,我们创建了一个名为 “example-upstream” 的 Upstream。
添加 Target 到 Upstream:
$ curl -X POST http://localhost:8001/upstreams/example-upstream/targets \
--data "target=example.com:80" \
--data "weight=100"
这个例子将一个新的 Target(example.com:80
)添加到了我们刚才创建的 “example-upstream” Upstream。Target 的权重被设定为 100,权重值越高,该服务器处理的流量就越多。
更新一个 Upstream:
$ curl -X PATCH http://localhost:8001/upstreams/example-upstream \
--data "slots=500"
在这个例子中,我们更新了 “example-upstream” Upstream 的 slots 值。slots 是一个可选参数,用于设置 Upstream 的一致性哈希轮询算法的大小。
删除一个 Upstream:
$ curl -X DELETE http://localhost:8001/upstreams/example-upstream
这个例子将删除我们之前创建的 “example-upstream” Upstream。
以上就是在 Kong 中设置 Upstream 的一般步骤。
设置services
在 Kong 中,Service 是你想代理的上游 API 或者微服务的抽象。你可以使用 Kong 的 Admin API 来创建和配置服务。
以下是使用 Kong Admin API 创建和配置 Service 的基本步骤:
创建一个 Service:
$ curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=example-service' \
--data 'url=http://example.com'
这个例子创建了一个名为 “example-service” 的 Service,代理的 URL 是 http://example.com
。
更新一个 Service:
$ curl -i -X PATCH \
--url http://localhost:8001/services/example-service \
--data 'url=http://new-example.com'
这个例子更新了 “example-service” Service 的 URL,新的 URL 是 http://new-example.com
。
删除一个 Service:
$ curl -i -X DELETE \
--url http://localhost:8001/services/example-service
这个例子删除了 “example-service” Service。
设置route
在 Kong 中,Route 是请求的入口,将接入的请求路由到指定的 Service。每个 Route 都必须关联到一个 Service,这个 Service 可以是 Kong 本地的,也可以是外部的。每个 Service 可以有多个 Route。
以下是使用 Kong Admin API 创建和配置 Route 的基本步骤:
创建一个 Route 并关联到 Service:
$ curl -i -X POST \
--url http://localhost:8001/services/example-service/routes \
--data 'paths[]=/testpath'
在这个例子中,我们创建了一个新的路由,并将其关联到了 “example-service” Service。当请求的路径为 “/testpath” 时,请求将被路由到 “example-service”。
更新一个 Route:
$ curl -i -X PATCH \
--url http://localhost:8001/routes/{route_id} \
--data 'paths[]=/newpath'
在这个例子中,我们更新了路由的路径。新的路径是 “/newpath”。请将 {route_id}
替换为你想更新的路由的 ID。
删除一个 Route:
$ curl -i -X DELETE \
--url http://localhost:8001/routes/{route_id}
在这个例子中,我们删除了指定的路由。请将 {route_id}
替换为你想删除的路由的 ID。
路由的匹配可以基于多个条件,如主机名(host)、路径(path)、HTTP 方法(method)和客户端 IP 地址等。你可以根据需要配置这些条件。
使用konga页面操作
这里以代理一个后台接口为例(http://192.168.100.22:8888/swagger-resources):
设置upstreams
如图所示,选择左侧菜单的UPSTREAMS,点击CREATE UPSTREAM创建upstreams
create upstream
点击detals
设置targets
设置services
设置route
设置paths的时候记得回车
效果
代理前的地址:
代理后的地址:
到这证明我们的代理生效了!