Kong入门学习实践(4)负载均衡与正则路由
最近在学习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的云原生微服务网关》
Kong入门学习实践(4)负载均衡与正则路由的更多相关文章
- SpringCloud全家桶学习之Feign负载均衡----Feign(四)
一.Feign概述 (1)Feign是什么? 官网地址:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-f ...
- Nacos入门学习&实践
文中涉及到了一些模块代码没有给出,我一并上传到github了,可以整个项目clone下来进行调试. 地址:https://github.com/stronglxp/springcloud-test 1 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 负载均衡
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 负载均衡 在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调 ...
- 008 SpringCloud 学习笔记4-----Ribbon负载均衡
1.Ribbon概述 实际环境中,我们往往会开启很多个itcast-service-provider的集群.此时我们获取的服务列表中就会有多个,到底该访问哪一个呢? Eureka中已经帮我们集成了负载 ...
- 学习下nginx负载均衡--深入理解nginx
作为代理服务器,一般都需要向上游服务器转发请求.这里的负载均衡是指通过一种策略尽量把请求平均的分发都上游服务器 1.upstream 语法 upstream name {} 配置快: http 栗子( ...
- SpringCloud学习笔记:负载均衡Ribbon(3)
1. RestTemplate简介 RestTemplate是Spring Resource中一个访问第三方RESTful API接口的网络请求框架. RestTemplate是用来消费REST服务的 ...
- SpringCloud无废话入门02:Ribbon负载均衡
1.白话负载均衡 在上一篇的介绍中,我们创建了两个一模一样的服务提供者:Provider1和Provider2,然后它们提供的服务也一模一样,都叫Hello-Service.为什么一样的服务我们要部署 ...
- 【Linux学习九】负载均衡
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.高并发 随着应用访问量的增加,带来高并发处理问题. 具体有两个: ...
- SpringCloud学习(5)——Feign负载均衡
Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. ...
- SpringCloud学习(4)——Ribbon负载均衡
Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...
随机推荐
- 小白必看的java完整下载攻略!(在Typora中有图片参考)
Java下载 在浏览器上搜索JDK(2024年最新版是22,本人下载的是21) 点击官网下载,会跳到Oracle官网,需要注册账号才可下载 根据自己的电脑型号选择下载(本人下载的是64的) 正常情况下 ...
- FireDAC 下FDMEMTable的的字段自动获取
用clientdataset可以在设计时获取表结构.带来了不少方便.那么在FireDAC下如何处理? TSQLConnect继续provider的方法是没有问题的.而FireDAC不支持Provide ...
- 重磅!微信官方恢复了个人红包封面的制作入口,限时开放!!.md
前两天微信开放了个人红包封面,引起了大家欢呼雀跃~ 可惜--没几个小时,因为一个不可描述的原因,官方小程序下架了-- 但是, 现在好消息来啦, 官方又恢复个人红包封面制作啦~ 本文教你如何制作红包封面 ...
- 华为od机考2025A卷真题 -查找接口成功率最优时间段
题目描述与示例 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为 0~100 的整数,给定一 ...
- File类使用详解
File类是java io包下代表与平台无关的文件和目录,也就是说,在程序中操作文件和目录都可以通过File类来完成.但是File不能访问文件内容本身,访问文件内容需要使用输入/输出流. File类的 ...
- MySQL 中如果发生死锁应该如何解决?
MySQL 中如果发生死锁应该如何解决? 死锁是指多个事务在执行过程中因资源争用形成的循环等待,导致无法继续执行.MySQL 会自动检测死锁并选择一个事务进行回滚,但我们可以通过优化设计和操作来避免和 ...
- 话说神奇的content="IE=edge,chrome=1"的meta标签内容
这是个是IE8的专用标记,用来指定IE8浏览器去模拟某个特定版本的IE浏览器的渲染方式(比如人见人烦的IE6),以此来解决部分兼容问题,例如模拟IE7的具体方式如下: < meta http-e ...
- K8s Pod 控制器介绍及应用示例
Kubernetes 官方文档:Pod 控制器 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kuber ...
- 解析异步消息加上(→_→)@SuppressLint("HandlerLeak")
在主线程又Handler处理消息出现时这样写会有警告 private Handler handler = new Handler(){ @Override public void handleMess ...
- 关于正点原子input子系统,驱动中按键中断只检测了上升或下降沿却可以实现连按(EV_REP)的原因
问题 在学习到Linux内核input子系统时,产生了一个疑惑.可以看到,我们改造按键中断驱动程序(请见keyinputdriver.c(内核驱动代码)),通过检测按键的上升沿和下降沿,在中断处理函数 ...