InfiniGate自研网关实现思路七

news2024/11/18 11:33:49

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负载均衡策略

根据实际情况选择合适的负载均衡策略

  1. 最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
  2. 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动态配置的接口。

核心问题:

  1. 对于一个网关的算力的动态配置和刷新,要根据服务的注册动态变更Nginx配置文件并生效。那么这里就会牵扯到Nginx的配置文件变更和刷新,如何通过Java程序进行控制等问题。
  2. 那么以当前服务部署到Docker容器场景为例,Docker 是嵌入到 Linux 服务器内的,每个镜像实例的部署也都是隔离的,那么这个时候该怎么完成配置文件的互通和指令调用就成了本章要解决的核心问题。

解决方案:

  1. 问题1:Nginx 的配置文件如何被其他应用程序获取并修改,这里需要用到文件挂载操作。我们把存放在 Linux 服务器上的 nginx.conf 所在的文件夹📂挂在到 api-gateway-center 上,之后把 nginx.conf 配置文件挂在 Nginx 服务上。这样就打通第一个要解决的配置文件问题。之后再 api-gateway-center 服务上就可以通过 IO 流更新 nginx.conf 文件
  2. 问题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 网关分组的配置。我们也是用这个配置来区分访问哪一组网关。所以整体设计如图

  1. api-gateway-center 管理着网关算力的注册,并把注册的配置信息动态刷新到 Nginx 配置中。
  2. 同时在 Nginx 的配置中会重写URL,也就是把 10001 这个根目录路径给去掉,让它的功能只是负责路由即可,剩下的与原有直接访问网关算力不变。这样即使以后不需要做负载也可以直接访问网关算力节点。

功能实现

  1. GatewayConfigManage#registerGatewayServerNode:在网关算力节点注册的时候,调用在第26章实现的动态刷新Nginx配置接口。此外注意本节新添加了Nginx路径重新配置,以及在yml配置文件中添加了 Nginx IP 的配置。
  2. ConfigManageService#queryApplicationSystemRichInfo:bug 优化,null 判断字符串,改为 if (StringUtils.isEmpty(systemId)) 这样更准确。 

28.网关组件工程模块合并

通过合并网关六个模块【admin、center、core、assist、engine、sdk】到统一服务下管理,完成InfiniGate网关的多模块组装,为后续功能迭代做铺垫。

网关的这六个模块工程,主要分为3个大的部分在运行。如图所示:

  1. 第一组:网关算力,由 api-gateway-core、api-gateway-assit、api-gateway-engine 组成,core 提供算力、assist 处理封装、engine 镜像打包和启动。
  2. 第二组:管理中心,由 api-gateway-admin、api-gateway-center 组成,admin 后台运营、center 注册中心。
  3. 第三组:接口上报,由 api-gateway-sdk 提供,它被应用系统引入,在应用系统中以注解的方式摘取应用RPC接口信息并向注册中心发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何根据业务需求,轻松挑选SSL证书?

在当今数字化时代,网站的安全性愈发受到重视。SSL证书作为网站安全的“守门员”,不仅能保护用户数据不被窃取,还能提升网站的信任度。但面对市场上琳琅满目的SSL证书产品,如何根据业务需求挑选合适的证书呢?今天&#…

今日份动态规划学习

主要只搞了一个这道题,有点摸鱼了今天晚上,也是来小看一下这道题吧01背包完全背包 P1941 [NOIP2014 提高组] 飞扬的小鸟 题意: 这题是说,给我们一个游戏界面,界面的长度为n(水平距离)&#x…

Java | Leetcode Java题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n gas.length;int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i cnt) % n;sumOfGas gas[j];sumOfCos…

【活动】程序员的核心职业素养:技术与人文并重的探索之旅

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 程序员的核心职业素养&#xff1a;技术与人文并重的探索之旅1. 持续学习与技术精…

Python Lambda函数的应用实例教程

在Python编程中&#xff0c;lambda函数是一种简洁且强大的工具&#xff0c;用于创建小型匿名函数。它们在需要快速定义简单函数时特别有用。本文将详细介绍lambda函数的语法及其多种应用实例&#xff0c;帮助读者更好地理解和使用lambda函数。 一、lambda函数的基本概念 1.1 什…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…

计算机网络 期末复习(谢希仁版本)第6章

DNS采用UDP。 DHCP 给运行服务器软件、且位置固定的计算机指派一个永久地址&#xff0c;给运行客户端软件的计算机分配一个临时地址

数据库(25)——多表关系介绍

在项目开发中&#xff0c;进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;各个表之间的结构基本上分为三种&#xff1a;一对多&#xff0c;多对多&#xff0c;一对一。 一对多 例如&#xff0c;一个学校可以有…

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)

前言 前面两篇文章&#xff0c;我们简单讲述了 WebContainer/api 、Terminal 的基本使用&#xff0c;离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor &#xff0c;来实现初级代码编辑功能&#xff0c;讲述的是整个应用的搭建&#xff0c;并不单独针对monac…

鸿蒙轻内核M核源码分析系列六 任务及任务调度(2)任务模块

任务是操作系统一个重要的概念&#xff0c;是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。鸿蒙轻内核的任务模块可以给用户提供多个任务&#xff0c;实现任务间的切换&#xff0c;帮助用户管理业务程序流程。…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”&#xff0c;将生产“产品”对象称为“工厂”&#xff1b;如果创建的产品不多&#xff0c;且不需要生产新的产品&#xff0c;那么只需要一个工厂就可以&#xff0c;这种模式叫做“简单工厂”&#xff0c;它不属于23中设计…

【PL理论】(5) F#:递归类型 | Immutability 特性(F#中值一旦定义就不会改变)

&#x1f4ad; 写在前面&#xff1a;本文旨在探讨不可变数据结构在 F# 编程中的应用&#xff0c;特别是如何利用递归记录类型来表示和操作数值表达式。通过定义存储整数的二叉树和数值表达式的类型&#xff0c;我们将展示不可变性如何简化程序的理解和维护。文章将对比 F# 与命…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

IP黑名单与IP白名单是什么?

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

2024会声会影全新旗舰版,下载体验!

在当今数字时代&#xff0c;视频内容已成为最受欢迎的媒介之一。无论是个人娱乐、教育还是商业推广&#xff0c;优秀的视频制作都是吸引观众的关键。为了满足广大用户对高质量视频制作软件的需求&#xff0c;我们隆重推出了会声会影2024最新旗舰版。这款软件不仅集成了最先进的…

六、SQL执行器的定义和实现

之前的Sql执行都是耦合在SqlSession里的&#xff0c;现在要对这部分进行解耦和重构&#xff0c;引申出执行器&#xff0c;查了相关概念&#xff0c;Executor执行器可以说是定义了一个个的SQL的执行流程&#xff0c;用查询方法举例&#xff0c;大概一下几步&#xff1a; 1.获取数…

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真&#xff0c;输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…

OPPO 文件传输 - 将文件从 OPPO 手机传输到 PC 的 5 种方法

OPPO手机以其出色的拍照功能而闻名&#xff0c;尤其是新推出的OPPO Find X2系列&#xff0c;它配备了高清前置镜头和超夜景模式&#xff0c;让您轻松拍出精彩瞬间。当您需要将这些照片或其他文件从OPPO手机传输到PC时&#xff0c;以下是五种简便的方法。 第 1 部分&#xff…

掘金AI商战宝典-高阶班:如何用AI制作视频(11节视频课)

课程下载&#xff1a;掘金AI商战宝典-高阶班&#xff1a;如何用AI制作视频(11节视频课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程目录&#xff1a; 1-第一讲用AI自动做视频(上)_1.mp4 2-第二讲用AI自动做视频(中)_1.mp4 3-第四讲A…

你真的理解补码了吗?

下面来看三句话&#xff1a; &#xff08;1&#xff09;一个数的补码等于原码取反加1 &#xff08;2&#xff09;减去一个数等于加这个数的补码 &#xff08;3&#xff09;一个数的反码就是这个数原码的每一位都取反 学过补码的同学应该都听过类似的表述&#xff0c;如果你…