最近在学习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入门学习实践(4)负载均衡与正则路由的更多相关文章

  1. SpringCloud全家桶学习之Feign负载均衡----Feign(四)

    一.Feign概述 (1)Feign是什么? 官网地址:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-f ...

  2. Nacos入门学习&实践

    文中涉及到了一些模块代码没有给出,我一并上传到github了,可以整个项目clone下来进行调试. 地址:https://github.com/stronglxp/springcloud-test 1 ...

  3. Dubbo -- 系统学习 笔记 -- 示例 -- 负载均衡

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 负载均衡 在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调 ...

  4. 008 SpringCloud 学习笔记4-----Ribbon负载均衡

    1.Ribbon概述 实际环境中,我们往往会开启很多个itcast-service-provider的集群.此时我们获取的服务列表中就会有多个,到底该访问哪一个呢? Eureka中已经帮我们集成了负载 ...

  5. 学习下nginx负载均衡--深入理解nginx

    作为代理服务器,一般都需要向上游服务器转发请求.这里的负载均衡是指通过一种策略尽量把请求平均的分发都上游服务器 1.upstream 语法 upstream name {} 配置快: http 栗子( ...

  6. SpringCloud学习笔记:负载均衡Ribbon(3)

    1. RestTemplate简介 RestTemplate是Spring Resource中一个访问第三方RESTful API接口的网络请求框架. RestTemplate是用来消费REST服务的 ...

  7. SpringCloud无废话入门02:Ribbon负载均衡

    1.白话负载均衡 在上一篇的介绍中,我们创建了两个一模一样的服务提供者:Provider1和Provider2,然后它们提供的服务也一模一样,都叫Hello-Service.为什么一样的服务我们要部署 ...

  8. 【Linux学习九】负载均衡

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.高并发 随着应用访问量的增加,带来高并发处理问题. 具体有两个: ...

  9. SpringCloud学习(5)——Feign负载均衡

    Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. ...

  10. SpringCloud学习(4)——Ribbon负载均衡

    Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...

随机推荐

  1. MySQL 的 JSON 查询

    MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件] 路 ...

  2. ASP.NET之设置默认文档

    通常... <!--Web.config--> <configuration> <!--指定默认文档 Start Author:JAnnn Time:2015-01-10 ...

  3. ASP.NET Core 全球化和本地化

    留备后观... Globalization and localization in ASP.NET Core 体验 ASP.NET Core 中的多语言支持(Localization)

  4. 行为识别TSM训练ucf101数据集

    序言 最近有个行为检测的需求,打算用行为识别做,纯小白入这个方向,啃了两周的TSM原理和源码,训练好自己的数据集后,发现好像没法应用到自己的需求场景??玛德!算了,还是要记录一下.原理就没别要讲了,网 ...

  5. STM32 开发环境用哪个呢?

    我的STM32开发环境血泪史:从入门到精通,少走弯路才是硬道理 说起STM32开发环境的选择,我真是有太多想说的了.作为一个已经在嵌入式领域摸爬滚打近十年的老兵,从当年刚入行时的懵懂无知,到现在能够从 ...

  6. Selenium反屏蔽处理

    Selenium自动化过程,在浏览器内会显示如下字样 当出现此内容时,有些网站就会判定是机器在进行操作,然后网站会加载防机器操作程序,如下图滑块验证 触发反机器操作的原理大概如下 解决方法 具体代码, ...

  7. MySQL 中有哪些锁类型?

    MySQL 中有哪些锁类型? 在 MySQL 中,锁是用于管理并发访问的机制,以保证数据一致性和完整性.MySQL 支持多种类型的锁,按照其粒度和用途可以分为以下几类. 1. 按粒度分类 表锁(Tab ...

  8. VTK 入门系列之二:为三维场景添加坐标轴

    一.引言 在进行三维可视化开发时,我们常常希望能够清晰了解模型在空间中的位置.方向与比例关系.而最直观的辅助工具就是三维坐标轴(Axes).在 VTK 中,vtkAxesActor 提供了一种开箱即用 ...

  9. 开发者专用部署工具PasteSpider的V5正式版发布啦!(202504月版),更新说明一览

    PasteSpider是一款以开发者角度设计的部署工具,支持把你的项目部署到Windows或者Linux服务器,支持5大模式Windows(IIS/Service),Linux(systemd),Do ...

  10. PLSQL中&符号处理

    在SQL语句中的字符串中出现了&符号,当执行的时候会被认为是参数需要传递,如update product set brand = 'D&G'; 解决办法是把语句改为:update pr ...