微服务架构之网关详解

news2024/12/28 19:11:45

e9347e5157c7489a87313d7d38303c4d.jpg


 

前言

由于互联网的高速发展,网络数据请求数激增,使得服务器承受的压力越来越大。在早期的系统架构中,为减轻单台服务器的压力,通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多,传统的 Load Balancer 为主的系统架构的局限性就变得明显起来,于是一款主要工作在七层且具有丰富扩展能力的基础设施便应运而生,那便是 API Gateway


什么是API网关

 

API网关 简单来说是一种主要工作在七层、专门用于 API 的管理和流量转发的基础设施,并拥有强大的扩展性。

网关的角色是作为一个API架构,用来保护、增强和控制对于API服务的访问。它是一个处于应用程序或服务(提供REST API接口服务)之前的系统,用来管理授权、访问控制和流量限制等。这样REST API接口服务就被网关保护起来,对所有的调用者透明。因此,隐藏在API网关后面的业务系统就可以专注于创建和管理服务,无需关心这些策略性的请求。

网关工作流程如下图:645c8c815cc34a8aa3fe52342c235d19.jpeg

 

网关必须具备的特点

1.高性能

对于高性能而言,网关不应该也不能成为性能的瓶颈,最好使用高性能的编程语言来实现,如 C、C++、Go 和 Java。网关对后端的请求,以及对前端的请求的服务一定要使用异步非阻塞的 I/O 来确保后端延迟不会导致应用程序中出现性能问题。C 和 C++ 可以参看 Linux 下的 epoll 和 Windows 的 I/O Completion Port 的异步 IO 模型,Java 下如 Netty、Spring Reactor 的 NIO 框架。

2.高可用

所有的流量或调用都要经过网关,所以网关必须成为一个高可用的组件,它的稳定直接关系到了所有服务的稳定。不能出现单点故障,因此,一个好的网关至少做到以下几点。

集群化 。网关要成为一个集群,并可以自己同步集群数据,而不需要依赖于第三方系统来同步数据。

服务化 。网关还需要做到在不间断的情况下修改配置,一种是像 Nginx reload 配置那样,可以做到不停服务,另一种是最好做到服务化。也就是说,得要有自己的 Admin API 来在运行时修改配置。

持续化 。比如重启,就是像 Nginx 那样优雅地重启。有一个主管请求分发的主进程。当我们需要重启时,新的请求被分配到新的进程中,而老的进程处理完正在处理的请求后就退出。

3.高扩展

网关要承接所有的业务流量和请求,所以一定存在或多或少的业务逻辑。而业务逻辑是多变和不确定的,比如,需要在网关上加入一些和业务相关的东西。因此一个好的网关还需要是可以扩展的,并能进行二次开发。当然,像 Nginx 那样通过 Module 进行二次开发的也是可以的。

网关主要功能

  1. 路由功能: 路由是微服务网关的核心能力。通过路由功能微服务网关可以将请求转发到目标微服务。在微服务架构中,网关可以结合注册中心的动态服务发现,实现对后端服务的发现,调用方只需要知道网关对外暴露的服务API就可以透明地访问后端微服务。

  2. 负载均衡: API网关结合负载均衡技术,利用Eureka或者Consul等服务发现工具,通过轮询、指定权重、IP地址哈希等机制实现下游服务的负载均衡。

  3. 统一鉴权: 一般而言,无论对内网还是外网的接口都需要做用户身份认证,而用户认证在一些规模较大的系统中都会采用统一的单点登录(Single Sign On)系统,如果每个微服务都要对接单点登录系统,那么显然比较浪费资源且开发效率低。API网关是统一管理安全性的绝佳场所,可以将认证的部分抽取到网关层,微服务系统无须关注认证的逻辑,只关注自身业务即可。

  4. 限流熔断 : 在某些场景下需要控制客户端的访问次数和访问频率,一些高并发系统有时还会有限流的需求。在网关上可以配置一个阈值,当请求数超过阈值时就直接返回错误而不继续访问后台服务。当出现流量洪峰或者后端服务出现延迟或故障时,网关能够主动进行熔断,保护后端服务,并保持前端用户体验良好。

  5. 灰度发布: 微服务网关可以根据HTTP请求中的特殊标记和后端服务列表元数据标识进行流量控制,实现在用户无感知的情况下完成灰度发布。

  6. 日志审计: 微服务网关可以作为统一的日志记录和收集器,对服务URL粒度的日志请求信息和响应信息进行拦截。

  7. 指标监控: 网关可以统计后端服务的请求次数,并且可以实时地更新当前的流量健康状态,可以对URL粒度的服务进行延迟统计,也可以使用Hystrix Dashboard查看后端服务的流量状态及是否有熔断发生。

  8. 协议转换: API网关的一大作用在于构建异构系统,API网关作为单一入口,通过协议转换整合后台基于REST、AMQP、Dubbo等不同风格和实现技术的微服务,面向Web Mobile、开放平台等特定客户端提供统一服务。

  9. 黑白名单: 微服务网关可以使用系统黑名单,过滤HTTP请求特征,拦截异常客户端的请求,例如DDoS攻击等侵蚀带宽或资源迫使服务中断等行为,可以在网关层面进行拦截过滤。比较常见的拦截策略是根据IP地址增加黑名单。在存在鉴权管理的路由服务中可以通过设置白名单跳过鉴权管理而直接访问后端服务资源。

  10. 文档中心: 网关结合Swagger,可以将后端的微服务暴露给网关,网关作为统一的入口给接口的使用方提供查看后端服务的API规范,不需要知道每一个后端微服务的Swagger地址,这样网关起到了对后端API聚合的效果。

目前主流的网关

  • Spring Cloud Gateway:是springcloud的全新API网关项目,旨在替换zuul的网关服务,基于spring framework5.0+springboot 2.0+webFlux开发,其也实现了异步非阻塞的特性,有较高的性能,其有丰富的过滤器类型,可以根据自身需求来自定义过滤器。

  • Zuul 2.0 : 采用Netty实现异步非阻塞编程模型,一个CPU一个线程,能够处理所有的请求和响应,请求响应的生命周期通过事件和回调进行处理,减少线程数量,开销较小。相比于zuul 1.0,zuul 2.0实现的异步非阻塞的特性,在性能上有较大提升。

  • OpenResty : OpenResty基于 Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

  • Kong : 基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,性能高效且稳定,支持多个可用插件(限流、鉴权)等,开箱即可用,只支持HTTP协议,且二次开发扩展难,缺乏更易用的管理和配置方式

网关之间的对比如下图:74d23a8f4f04407c8972dbf2f6e891e9.png

 

总结

总体而言,API Gateway 主要用于作为后端的 API 接口代理,提供对外访问不同种类 API 的一个单独入口,并且可以提供独立于后端服务的限流、认证、监控等功能。

在合理的架构设计下,一般都将 API Gateway 和 Load Balancer 配合使用,使用 Load Balancer 作为整个系统的网络出入口,将流量分发到多个 API Gateway 实例,然后每个 API Gateway 实例分别对请求进行路由、认证、鉴权等操作,这样可以使得整个网络更加稳健、可靠、可扩展。

 

欢迎转发点赞收藏,感谢🙏

 

 

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

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

相关文章

Django DRF - 【Token】认证基本使用

一. 前言 Django Rest Framework Token是Django Rest Framework中的一个扩展,用于实现用户认证和授权。它为每个用户生成一个唯一的Token,并将其存储在数据库中。在用户进行API请求时,用户需要在请求的HTTP Header中包含Token,这…

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展,越来越多的行业开始尝试将VR技术应用到实际场景中,以提供更加真实的体验。其中,机械伤害事故VR警示教育系统的出现,为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上,…

odoo16 中ondelete的用法

odoo 中的many2one类型字段有 ondelete设置,对应数据表中关系处理 a fields.Many2one(‘b’, string‘b’, ondelete‘set null’) 则当对模型b进行delete操作时,会引发如下操作 set null: 当b中删除记录时,modelA中相关记录的anull casc…

Redis实战案例8-缓存击穿及其解决方案和案例说明

1. 缓存击穿 缓存击穿是指一个被频繁访问(高并发访问并且缓存重建业务较复杂)的缓存键因为过期失效,同时又有大量并发请求访问此键,导致请求直接落到数据库或后端服务上,增加了系统的负载并可能导致系统崩溃 常见的解决…

开源虚拟化工具VirtualBox安装部署

什么是Virtualbox VirtualBox是一款由Oracle开发和维护的免费开源虚拟化软件,用于在一台计算机上创建和管理多个虚拟机。它允许用户在单个物理计算机上运行多个操作系统,例如Windows、Linux、macOS等。VirtualBox提供了一个虚拟化环境,使用户…

详细介绍如何使用 OpenCV 实现自动文档扫描仪--附实现源码

文末附相关源代码实现的免费下载链接 文档扫描是将物理文档转换为数字形式的过程。可以通过扫描仪或手机摄像头拍摄图像来完成。我们将在本教程中讨论如何使用计算机视觉和图像处理技术有效地实现这一目标。 在当今的计算机时代,几乎不需要任何物理文书工作。尽管如此,在仍…

现代操作系统第一章学习笔记

先附上一个原版的课后习题答案的链接。 课后习题答案 1.1 什么是操作系统 操作系统:他的任务是为应用程序提供一个更好、更简单、更清晰的计算机模型,并管理贮存、磁盘等所有设备。 计算机系统总的来说分为软件和硬件,如下图所示。多数计算…

华为孟晚舟:拥抱5G变革

2023 MWC上海开幕,华为副董事长、轮值董事长、CFO孟晚舟在大会上发表了“拥抱5G变革”的主题演讲。她表示:全球5G商用4年来,正持续引领价值创造,而5.5G是5G网络演进的必然之路;面向未来,科技走向复杂大系统…

突破未来:SAP助力新能源产业腾飞!

新能源行业概况 在互联网的时代浪潮下,多数行业都开始进行了调整与整合,竞争无处不在。作为新兴的新能源行业,如果不想从竞争中被淘汰,就需要把握时代的脉搏,找到突破口,带领企业在市场竞争中越走越远。我…

学习:PSM倾向得分匹配基于stata实现

PSM倾向性匹配得分 定义 就是一个用户属于实验组的倾向性,也就是在特定特征的情况下属于实验组的概率(条件概率) 其他定义: PSM 通过统计学模型计算每个观测的每个协变量的综合倾向性得分,再按照倾向性得分是否接近进⾏匹配。 用直白的话来…

大数据技术——电影推荐系统大数据综合实训项目

具体文档请参考如下链接: https://download.csdn.net/download/qq_53142796/87949491https://download.csdn.net/download/qq_53142796/87949491 https://download.csdn.net/download/qq_53142796/87949489https://download.csdn.net/download/qq_53142796/879494…

2.设计模式之前5种设计模式单例工厂原型建造者适配器

1.怎么掌握设计模式? 独孤5剑 先是锋利的剑 后面是无剑才是最强的 ,GOF四人组写的<设计模式>书,包含了23种,实际可能还有其他,不要被束缚(只是覆盖了大部分).设计模式适合的人群: 1.不知道设计模式 2.有编程经验,但是写的好多代码有设计模式却不知道 3.学习过设计模式,发…

Unity 提取并拷贝Hierarchy路径

提取并拷贝Hierarchy路径 &#x1f354;效果&#x1f96a;食用 &#x1f354;效果 &#x1f96a;食用 &#x1f4a1;.导入包后直接选中GameObject右键选择&#xff1a;复制Hierarchy路径 &#x1f4a1;.快捷键Ctrl V 即可粘贴路径

SurfaceFlinge/InputFlinger分析-android画面缩放后依然点击正常原理分析

hi&#xff0c;粉丝朋友们&#xff1a; 这两天刚好在做自由窗口相关国内需求&#xff0c;刚好遇到一个疑惑&#xff0c;那就是画面进行缩放后发现依然触摸画面可以正常反映问题。 具体疑惑背景 疑问点如下&#xff1a; 坐标是针对屏幕的&#xff0c;按钮也是相对Activity的&…

【SPI】STM32 SPI 双机通信,SPI从机模式使用

文章目录 一、SPI主机配置二、SPI从机配置三、双机通信1 轮询中断&#xff08;低速&#xff09;2 轮询DMA&#xff08;低速&#xff09;3 DMADMA&#xff08;高速&#xff09;4 开启CRC校验&#xff08;自选&#xff09; 四、遇到的问题1 高速使用时&#xff0c;程序卡死&#…

JavaScript 原型与原型链

所有的 JavaScript 对象都会从一个 prototype&#xff08;原型对象&#xff09;中继承属性和方法&#xff1a; Date 对象从 Date.prototype 继承。 Array 对象从 Array.prototype 继承。 所有 JavaScript 中的对象都是位于原型链顶端的 Object 的实例。 JavaScript 对象有一个指…

【C#】代码解析--打印数据集

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

LangChain:LLM应用程序开发(中)——文档问答、评估、Agents(代理)

文章目录 四、文档问答4.1 快速入门4.2 逐步实现4.3 其它方法 五、评估5.1 创建QA app5.2 生成测试数据点5.2.1 Hard-coded examples5.2.2 LLM-Generated examples 5.3 link chain debug手动评估5.4 LLM assisted evaluation5.5 LangChain Evaluation platform 六、Agents&…

704.二分查找

一、题目 二、代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int search(int* nums, int numsSize, int target) {int left 0;int right numsSize - 1;while (left < right) {int middle (left right) / 2;if (target > nums[middle]) {left m…

pip3 报错 distribution was not found and is required by the application

环境&#xff1a; centos 8 &#xff0c; pyhton3.6 背景&#xff1a; 升级python3.6 至 python3.10后&#xff0c; pip3安装包报错&#xff1a; pkg_resources.VersionConflict: (pip 21.2.4 (/usr/local/python3/lib/python3.10/site-packages), Requirement.parse(pip23.…