Kong入门学习实践(4)负载均衡与正则路由

发布时间 2023-06-15 18:19:16作者: EdisonZhou

最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。

本篇,我们学习快速配置一个最常见的基本功能:负载均衡与正则路由。

关于负载均衡

所谓负载均衡,就是通过负载均衡算法将大量并发的HTTP请求均衡地分发到后端的多个目标节点上,以此提高系统的吞吐量,增加系统的处理能力和可用性。负载均衡也是目前代理软件如Nginx及各主流网关项目如OpenRestry的必备功能。

应用示例准备

本篇,我们计划将示例应用sample-order-api部署两个实例到同一台server上通过docker运行,他们分别占用5000和5005端口对外提供服务。

但是,为了更好的验证,我们需要在示例ASP.NET Core应用程序中添加一个接口用于返回其所处的服务器IP地址。

using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Net.Sockets;

namespace EDT.MSA.Ordering.API.Controllers
{
    [Route("api/Health")]
    [ApiController]
    [ApiExplorerSettings(IgnoreApi = true)]
    public class HealthController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get() => Ok($"ok");

        [HttpGet("node")]
        public IActionResult GetNodeInfo()
        {
            var result = string.Empty;
            var HostName = Dns.GetHostName();
            var IpEntry = Dns.GetHostEntry(HostName);
            for (int i = 0; i < IpEntry.AddressList.Length; i++)
            {
                // 从IP地址列表中筛选出IPv4类型的IP地址
                if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                {
                    result = IpEntry.AddressList[i].ToString();
                }
            }

            return Ok($"Current Node: {result}");
        }
    }
}

然后,我们将其打包docker镜像并部署到服务器中。

添加目标节点

由于我们要部署两个sample-order-api,因此目标节点需要增加一个。

 增加完成后的目标节点信息:

验证结果

(1)正常负载均衡演示

在浏览器中输入:http://sample.order-api.com:8000/api/health/node,多次访问验证:

备注:虽然我们的sample-order-api项目部署在了同一台宿主机,但是通过docker运行的,因此其返回的内部IP是不同的。

(2)异常挂掉一台

我们手动将其中一个order-api示例stop掉:

docker stop sample-order-api-2;

等待几秒后,Kong健康检查就会更新:

 然后再次在浏览器中多次访问,可以看到,只会从健康的节点里面返回数据了:

(3)调整流量权重

在实际应用中,可能会存在部分机器配置较好,部分机器配置较差的情况,这时我们希望让配置较好的机器承担更大的流量。又或者我们部同时部署了两个版本,想要一点一点地切换流量至新版本,以实现所谓的灰度发布。这时,调整权重(Weight)就是一个可行的方式。

比如,这里我们将目标节点 172.16.16.4:5000 权重调整为80%,172.16.16.4:5005 权重调整为20%。

这时再当我们测试时,10次请求里面就会8次到172.16.16.4:5000,2次到172.16.16.4:5005了。

这里就不再演示了,大家可以自行测试。

对于权重的调整,我们还可以将其应用在简单的灰度发布和蓝绿部署应用场景中。

正则路由

Kong不仅支持常规的路由匹配,还支持正则表达式路径匹配,这在部分实际场景中十分有用。

例如,我们想要访问sample.order-api.com/api/orders/{orderId},同时限定其中的orderId参数必须为数字且长度为8位。对于此需求,我们只需要在服务下再添加一条路由,且设置Path为一个正则表达式。

设置完成后,当Kong匹配到用户访问/api/orders/{orderId}时,只有当orderId为8位数字时,才能匹配到这条路由。

示例应用

本节示例应用:https://github.com/EdisonChou/EDT.EventBus.Sample,分支:feature/kong-practice-2

参考资料

闫观涛,《Kong入门与实践-基于Nginx和OpenRestry的云原生微服务网关》