您现在的位置是:首页 >技术交流 >深入理解API网关Kong:动态负载均衡配置网站首页技术交流

深入理解API网关Kong:动态负载均衡配置

孙霸天 2024-08-16 12:01:02
简介深入理解API网关Kong:动态负载均衡配置

深入理解API网关Kong:动态负载均衡配置

背景

在 NGINX 中,负载均衡的配置主要在 upstream 指令中进行。upstream 指令用于定义一个服务器群组和负载均衡方法。客户端请求在这个服务器群组中进行分发。

NGINX 提供了以下几种负载均衡方法:

  1. 轮询(round-robin):这是默认的负载均衡方法,每个请求按照时间分发,从第一个服务器开始,直到最后一个,然后重新开始。

  2. 最少连接(least_conn):这种方法优先分发给当前活动连接数最少的服务器。

  3. IP 散列(ip_hash):每个请求的分发根据客户端 IP 地址的 hash 结果进行。这样,来自同一个 IP 的客户端会总是连接到同一个服务器,除非该服务器不可用。

  4. 基于权重(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.combackend2.example.combackend3.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):

image-20230604223527773

设置upstreams

如图所示,选择左侧菜单的UPSTREAMS,点击CREATE UPSTREAM创建upstreams

image-20230604221835167

create upstream

image-20230604222417700

点击detals

image-20230604222528226

image-20230604222609301

设置targets

image-20230604222635309

image-20230604222654029

设置services

image-20230604223051728
image-20230604223109356

设置route

image-20230604223136456

设置paths的时候记得回车

image-20230604223233249

效果

代理前的地址:

image-20230604223749565

代理后的地址:

image-20230604223828687

到这证明我们的代理生效了!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。