InfiniGate自研网关实现思路七
25.网关Nginx负载模型配置
通过模拟多个HTTP服务配置到 Nginx 做负载均衡,以学习API网关负载的配置和使用
API 网关是用于支撑分布式 RPC 接口协议转换提供 HTTP 调用的一套服务,那么 API 网关系统就需要可横向扩展来满足系统的吞吐量诉求。所以这里需要让 API 网关来支持分布式架构部署,提供负载均衡的能力。
那么在这方面有一套非常成熟的模式就是基于 Nginx 以及 LVS、F5 相关的配置构建出负载均衡服务。在这里同样我们的 API 网关也可以被这样的方式进行处理,来满足部署需求。
负载均衡模型
首先我们知道,API网关是根据HTTP协议请求的地址转换为对应的映射泛化调用的RPC框架。这部分请求地址被配置到数据库中。如图:
wg 是一个固定开头的地址,转换后面紧跟着所访问的具体方法。在前面已经实现过 uri 映射到具体的 RPC 上。所以当我们通过在浏览器进行 HTTP 访问接口http://localhost:8090/wg/activity/sayHi 时,则会访问的到对应的网关算力节点服务上,完成对应的 RPC 调用和结果封装。
那么现在我们需要的是根据一个 URL 地址所访问路径的差异,访问到不同的 api 协议转换通信服务上,这样就可以完成一个负载调用的过程了。如图
这里我会先给大家介绍基于 Nginx 如何构建出一套负载均衡的网络请求模型,方便让更多的读者理解这样一个过程。
配置Nginx负载均衡策略
根据实际情况选择合适的负载均衡策略
- 最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
- Weight:权重方式,在轮询策略的基础上指定轮询的几率。注意:
- 权重越高分配到需要处理的请求越多。
- 此策略可以与least_conn和ip_hash结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况。
3.ip_hash:指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
4.least_conn:把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
5.第三方策略:
第三方的负载均衡策略的实现需要安装第三方插件。
①fair按照服务器端的响应时间来分配请求,响应时间短的优先分配。
②url_hash 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
26.动态刷新网关Nginx负载均衡配置
以Java程序调用Docker容器控制Nginx刷新为手段,处理服务与Docker容器间挂载的Nginx配置文件动态刷新操作。
为了满足当有新的网关算力节点注册、下线、调整时可以自动的生效Nginx配置,我们要在api-gateway-center服务中对外提供实现Nginx动态配置的接口。
核心问题:
- 对于一个网关的算力的动态配置和刷新,要根据服务的注册动态变更Nginx配置文件并生效。那么这里就会牵扯到Nginx的配置文件变更和刷新,如何通过Java程序进行控制等问题。
- 那么以当前服务部署到Docker容器场景为例,Docker 是嵌入到 Linux 服务器内的,每个镜像实例的部署也都是隔离的,那么这个时候该怎么完成配置文件的互通和指令调用就成了本章要解决的核心问题。
解决方案:
- 问题1:Nginx 的配置文件如何被其他应用程序获取并修改,这里需要用到文件挂载操作。我们把存放在 Linux 服务器上的 nginx.conf 所在的文件夹📂挂在到 api-gateway-center 上,之后把 nginx.conf 配置文件挂在 Nginx 服务上。这样就打通第一个要解决的配置文件问题。之后再 api-gateway-center 服务上就可以通过 IO 流更新 nginx.conf 文件。
- 问题2:如何通过 api-gateway-center 程序对 Nginx 进行调用。这里因为我们是在 Docker 场景下,所以需要通过 Java 控制并获取 Docker 容器中 Nginx 的服务,并对其进行操作。这里还会涉及到网络的问题,否则在容器中服务1不能调用服务2。
1. Nginx 配置服务
把存放在 Linux 服务器上的 nginx.conf 所在的文件夹📂挂在到 api-gateway-center 上.
docker run \
--name Nginx \
-d \
-v /Users/kjz/Documents/develop/tmp/nginx/html:/usr/share/nginx/html \
-v /Users/kjz/Documents/develop/tmp/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-p 8090:80 \
nginx
2. 刷新文件建模
实现流程分为3块,包括;文件的创建、文件的复制、文件的刷新。但鉴于我们已经通过文件的挂在到相同目录下,解决了复制Docker应用程序创建出来的 Nginx 配置文件到本地,所以这里就不需要自己在复制了。
3. 刷新文件实现
本身部署在 Docker 容器的 Nginx 文件,在刷新时候需要通过指令;docker exec Nginx nginx -s rolad 那么这里我们通过 Java 程序控制,就需要连接 Docker 容器,找到对应的服务,在执行容器指令。
27.实现网关算力节点动态负载功能
基于第25节Nginx的负载模型,第26节动态刷新Nginx的配置和实现,在本节把网关算力节点动态刷新到Nginx配置中,完成动态负载的功能实现。
方案设计
在不使用Nginx代理的时候,前面章节使用网关都是通过直接方式的方式操作,如 http://172.20.10.12:7397/wg/activity/sayHi?str=1 那么现在因为有负载的设计,希望把来自于不同URL的请求负载到不同的网关算力上去,所以这里的访问地址将变更为:http://172.20.10.12:8090/10001/wg/activity/sayHi?str=10001。
从第1个地址到第2个地址来看,变化的点主要是端口由原来的访问网关算力节点到访问Nginx,同时多了一个 10001 的路径。这个 10001 就是数据库中 group_id 网关分组的配置。我们也是用这个配置来区分访问哪一组网关。所以整体设计如图
- api-gateway-center 管理着网关算力的注册,并把注册的配置信息动态刷新到 Nginx 配置中。
- 同时在 Nginx 的配置中会重写URL,也就是把 10001 这个根目录路径给去掉,让它的功能只是负责路由即可,剩下的与原有直接访问网关算力不变。这样即使以后不需要做负载也可以直接访问网关算力节点。
功能实现
- GatewayConfigManage#registerGatewayServerNode:在网关算力节点注册的时候,调用在第26章实现的动态刷新Nginx配置接口。此外注意本节新添加了Nginx路径重新配置,以及在yml配置文件中添加了 Nginx IP 的配置。
- ConfigManageService#queryApplicationSystemRichInfo:bug 优化,null 判断字符串,改为 if (StringUtils.isEmpty(systemId)) 这样更准确。
28.网关组件工程模块合并
通过合并网关六个模块【admin、center、core、assist、engine、sdk】到统一服务下管理,完成InfiniGate网关的多模块组装,为后续功能迭代做铺垫。
网关的这六个模块工程,主要分为3个大的部分在运行。如图所示:
- 第一组:网关算力,由 api-gateway-core、api-gateway-assit、api-gateway-engine 组成,core 提供算力、assist 处理封装、engine 镜像打包和启动。
- 第二组:管理中心,由 api-gateway-admin、api-gateway-center 组成,admin 后台运营、center 注册中心。
- 第三组:接口上报,由 api-gateway-sdk 提供,它被应用系统引入,在应用系统中以注解的方式摘取应用RPC接口信息并向注册中心发送。
相关文章:

InfiniGate自研网关实现思路七
25.网关Nginx负载模型配置 通过模拟多个HTTP服务配置到 Nginx 做负载均衡,以学习API网关负载的配置和使用 API 网关是用于支撑分布式 RPC 接口协议转换提供 HTTP 调用的一套服务,那么 API 网关系统就需要可横向扩展来满足系统的吞吐量诉求。所以这里需…...

277 基于MATLAB GUI火灾检测系统
基于MATLAB GUI火灾检测系统,可以实现图片和视频的火苗检测。火焰识别的三个特征:1个颜色特征,2个几何特征颜色特征:HSV颜色空间下,对三个通道值进行阈值滤波,几何特征1:长宽比,几何…...

【西瓜书】4.决策树
1 递归返回情况 (1)结点包含样本全为同一类别 (2)属性集为空,没有属性可供划分了 或 有属性,但是在属性上划分的结果都一样 (3)结点为空结点 **结束时判定该结点的类别遵循如下规则&…...

区块链--Ubuntu上搭建以太坊私有链
1、搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:Releases ethereum/mist GitHub 2、安装geth客户端 sudo apt-get update …...

菜品信息分页查询——后端SpringBoot
1.分页查询的逻辑: 页面发送ajax请求,将分页查询参数(page,pageSize, name)提交到服务端,获取分页数据; 页面发送请求,请求服务端进行图片下载,用于页面图片展示。 开发菜品信息分页查询功能&a…...

利用GPT和PlantUML快速生成UML图用于设计
在软件开发中,设计阶段可是关键的一步。UML(统一建模语言)图能帮我们更清晰地理解和规划系统结构,但手动画UML图有时会很费时费力。好消息是,通过结合使用ChatGPT和PlantUML,我们可以高效地生成UML图&#…...

web-上传项目文件夹到Git远程仓库
Git初识 概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码 作用:记录代码内容,切换代码版本,多人开发时高效合并代码内容 检验成功 打开bash终端(git专用)命令…...

使用OpenPCDet训练与测试Transformer模型:如何加载自己的数据集
引言 Transformer架构因其强大的序列处理能力和长距离依赖捕捉能力,在自然语言处理领域取得了巨大成功。近年来,这一架构也被引入3D物体检测领域,如Voxel Transformer等,显著提升了模型在复杂场景下的检测性能。OpenPCDet整合了多…...
四舍五入问题
单纯输出四舍五入可以用 printf("%.nf",num); 但是这个方法有时候会出错 代表输出n位四舍五入小数 而将数四舍五入赋值给变量可以用round()函数 a round(num); 表示将num四舍五入赋值给a 但是这么些只能转换位四舍五入的整数 可以改…...

零基础入门学用Arduino 第一部分(三)
重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…...
C++标准库random
random 完整文档看这里 三步走: 选择一种随机数种子选择一个随机数引擎选择一个随机数分布输出 随机数种子 //生成随机数种子,在Linux的实现中,是读取/dev/urandom设备 std::random_device rd; unsigned seed1 rd();// 获取当前时间点作为随机数种子 unsigned seed2 std:…...

电子电气架构——车载诊断DTC一文通
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…...

Golang | Leetcode Golang题解之第129题求根节点到叶节点数字之和
题目: 题解: type pair struct {node *TreeNodenum int }func sumNumbers(root *TreeNode) (sum int) {if root nil {return}queue : []pair{{root, root.Val}}for len(queue) > 0 {p : queue[0]queue queue[1:]left, right, num : p.node.Left, …...

工业信息化SCI期刊,中科院1区TOP,IF=12.3,收稿范围广泛
一、期刊名称 IEEE Transactions on Industrial Informatics 二、期刊简介概况 期刊类型:SCI 学科领域:工程工业 影响因子:12.3 中科院分区:1区TOP 三、期刊征稿范围 IEEE工业信息学汇刊是一本多学科期刊,发表技…...
Spring Boot整合Redis
Spring Boot整合Redis Spring Boot 整合 Redis 是一种常见的做法,用于在 Spring Boot 应用程序中添加缓存、会话管理分布式锁等功能。 浅谈Redis Redis用于存储数据,且在内存当中进行存储。 但是在日常编写代码时,定义一个变量也就是属于在内…...

kafka的leader和follower
leader和follower kafka的leader和follower是相对于分区有意义的,不是相对于broker。 因为每个分区都有leader和follower, leader负责读写数据。 follower负责复制leader的数据保存到自己的日志数据中,并在leader挂掉后重新选举出leader。 kafka会再…...
git 空仓库笔记
标识身份,建议先完成 Git 全局设置 git config --global user.name “账号” git config --global user.email “email” 方式一:克隆仓库 git clone https://url/your.git cd your_path touch README.md git add README.md git commit -m "add …...
字母异位词分组(charyw)
字母异位词分组 题目描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 输入格式 第一行正整数n,表示有n个字符串(1<n<1000) 第二行n个字符串,空格隔开 输出格式 多组字母…...
力扣 41.缺少的第一个正整数
题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围 …...

Git从入门到放弃
由于我的Git学的不太好,所以为了能够将以后我的学习笔记能够整理的更好,我先要系统的学习一下git,文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网,Git也不例外。ht…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...