最近在学习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