首页 > 其他分享 >Kong入门学习实践(4)负载均衡与正则路由

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

时间:2023-06-15 18:22:45浏览次数:43  
标签:负载 示例 Kong 正则 api order 路由

最近在学习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的云原生微服务网关》

 

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

标签:负载,示例,Kong,正则,api,order,路由
From: https://www.cnblogs.com/edisonchou/p/edc_kong_learning_notes_chap4.html

相关文章

  • 正则
    IP地址/^([0,1]?\d{1,2}|2([0-4][0-9]|5[0-5]))(\.([0,1]?\d{1,2}|2([0-4][0-9]|5[0-5]))){3}$/端口号0-65535/^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/0-255/^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/ ......
  • 编程不懂正则表达式,不如回家种红薯
    编程不懂正则表达式,将有被淘汰的危险编程的大量工作都是在处理字符串,如验证输入、查找子串替换、解析HTML等,而正则表达式是一个极为强大的工具,它使我们需要很多行重复啰嗦的代码才能完成的编程任务,一个表达式就可以搞定,既节省时间又节省精力。但是学习它并不是一件轻松的事情,......
  • Neo4j中的网络路由
    人们使用Neo4j来管理企业架构。如果你还没有看到该演讲由托马斯·劳伦斯来自Amadeus的,那么你应该为自己观看。但是低层网络呢?我们可以使用Neo4j来建模物理网络中的路由吗?当然我们可以,今天我会告诉你如何。我们将保持简单,只需要路由器,交换机,接口和服务器。路由器之间将具有“ROUTE_T......
  • Java正则表达式详解
    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(RegularExpression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。许多语言,包括Perl、PHP、Python、JavaScript......
  • v3路由配置
    importtype{RouteRecordRaw}from'vue-router';importtype{App}from'vue';import{createRouter,createWebHistory}from'vue-router';import{basicRoutes}from'./routes';import{REDIRECT_NAME}from&#......
  • 正则表达式/\\\\/四个反斜杠
    本文摘自:https://blog.csdn.net/zttaiwx/article/details/53981755,放在自己博客后续方便查看在字符串中,两个反斜杠被解释为一个反斜杠,然后在作为正则表达式,\则被正则表达式引擎解释为\,所以在正则表达式中需要使用四个反斜杠。也就是说,前两个反斜杠在字符串中被解释为一个......
  • 正则表达式判断数字----来源百度
    正则表达式判断数字----来源百度https://blog.csdn.net/changbozizf/article/details/112960409数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1......
  • Kong入门学习实践(3)路由转发
    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。本篇,我们学习快速配置一个最常见的基本功能:路由转发。关于路由转发路由转发是Nginx等代理软件最常见的使用场......
  • ma系列之-7-文本处理工具grep egrep 和正则
      1概念: grep概念:根据模式搜索文本,并将符合模式的文本行显示出来。 globalreserchbyexpressiongrep的特点:就是在某个行中找只要符合匹配的行就可以,就是做部分匹配的,不是整个单词匹配,显示的是整行数据,重点展示的是匹配到的那个字段。 grep使用的模式Pattern组成:由文本......
  • java正则多个IP从中找出来匹配结果
    packagecom.yunfatong.evidence.utils;importcn.hutool.core.collection.CollUtil;importcn.hutool.poi.excel.ExcelBase;importcn.hutool.poi.excel.ExcelUtil;importcn.hutool.poi.excel.ExcelWriter;importcn.hutool.poi.excel.StyleSet;importorg.apache.po......