深入微服务 API 网关之架构实践篇

2024-09-02 08:48

本文主要是介绍深入微服务 API 网关之架构实践篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“朱小厮的博客”,选择“设为星标”

后台回复"书",获取

后台回复“k8s”,可领取k8s资料

随着这些年微服务的流行,API网关已经成为微服务架构中不可或缺的一环。一方面它承担着服务对外的唯一门户,一方面它提取了许多应用的共性功能。


-     整体架构     - 

我们的Api网关目前的架构如上所示,可以看到Api网关处于一个什么位置,往上承接所有的南北流量,往下会分发流量到微服务应用或者BFF聚合应用,在BFF规范化之前我们仍然将其视为一个普通微服务应用。

目前Api网关实现的功能包括请求分发、条件路由、Api管理、限流隔离、熔断降级、安全策略、监控报警以及调用链追踪等。

我们的Api网关基于RxNetty开发,整个流程是异步响应式的,可以达到较高的单机并发。基于少造轮子的理念,Api网关的大部分功能都是结合现有平台实现。包括请求分发、条件路由基于微服务框架,限流隔离、熔断降级基于稳定性平台,监控报警基于监控平台等,安全策略基于大数据分析平台等。注册中心与配置中心则分别负责服务注册核心信息与第三方配置信息的下发。


-     请求分发     - 

请求的分发路由应该是一个网关最基本的功能,在绝大多数基于nginx开发的网关上,这部分功能通常基于动态更新代理的upstream。而在我们的实现中,认为网关是一个只订阅不注册的微服务而已,区别是微服务应用发起rpc调用指定了调用服务,而网关接收请求分发只有url信息。

这可以通过简单的改造来复用已有微服务框架的服务发现功能。

经过一系列url规范化行动后,我们的url目前不同的应用都会采取不同的前缀,同时这个前缀信息会随着应用注册到注册中心。

这样网关进行服务发现时会给不同的url前缀以及微服务应用构建不同的namespace对象,在进行请求匹配时候只需根据url前缀选取到对应的namespace即可匹配到对应微服务应用,后续就是现有微服务框架sdk的功能:路由、负载均衡直至完成整个调用。

这里还涉及到另一个问题,网关选择服务发现的应用是哪些?即我需要拉取哪些应用信息以构建namespace?

我们这里对服务发现对象进行了管理,用户可在管控平台上控制微服务应用在网关层的上下线,这会通过我们的配置中心推送到网关并进行一次热更新,刷新内存缓存,这样就做到了请求分发服务的动态增减。


-     条件路由&灰度发布     - 

条件路由意味着可以对具有特定内容(或者一定流量比例)的请求进行筛选并分发到特定实例组上,是实现灰度发布、蓝绿发布、ABTest等功能的基础。

同样的,在基于nginx开发的网关中,一般是维护多套upstream列表,然后通过某种策略将不同请求代理到不同upstream。

在我们的实现中,条件路由依然是复用现有的微服务框架,避免重复造轮子。每个应用都可以根据一些规则创建一些分组,分组中有若干实例。在网关进行服务发现初始化时会给每个应用创建Invoker代理对象,Invoker内会根据不同的分组创建不同的Space空间,请求调用时会对这些Space空间进行规则匹配,从而决定是否路由到特定分组上。整个过程都是微服务框架完成的,没有额外的开发工作。

目前我们支持按照特定内容或者流量比例两种方式进行请求来源规则的匹配,特定内容包括http请求的header、attribute等等。我们目前的实例分组主要是根据"版本"这个标来区分的,所以分配规则主要是支持"版本"维度,未来考虑支持到k8s的pod label。

条件路由的功能结合devops平台发布管理可以很容易实现灰度发布。如下图所示我们将用户id是100的请求分发到灰度版本上进行内部测试。



-     Api 管理     - 

Api网关为什么前面要有Api几个字,我觉得其中一个很重要的原因就是具有Api管理功能。当我们的大部分应用还是裸连网关,而不是经过BFF聚合时,我们有必要对每个api接口都进行管理,以区分哪些是微服务间内部调用,哪些是暴露给前端/客户端调用。

实现上和之前的应用上下线类似,额外依赖了DB存储,用户在管控平台进行api发布等操作会先存储在DB中,随后通过配置中心pub/sub通知到网关。我们在namespace匹配前加入了一层filter以过滤删除/未上线的api,所以热更新该filter对象即可。

用户体验方面我们也做了一些工作,包括:

  • 从微服务管控平台直接同步新增的api接口到网关管控平台,而无需手动添加。此外也支持多种格式的文件导入。(我们的微服务注册模型会包括api信息等元数据)

  • 各个环境之间通过流转功能发布api,而无需重复添加

  • 对各个状态的筛选展示

  • 与devops平台配合,在应用发布流转时同步提醒进行api管理的发布流转。



-     限流隔离/熔断降级     - 

Api网关作为南北流量的唯一入口,一般具有较高并发度,以及流量复杂性。所以对入口流量进行整治管理是很有必要的。

我们的限流隔离/熔断降级均基于稳定性平台与配置中心实现,稳定性平台是我们基于Sentinel二次开发的。整个结构如下图所示:

稳定性相关的功能主要包括限流隔离以及熔断降级。限流隔离主要是作用在流入方向服务端测的流量控制,其中限流主要是控制qps,隔离主要是控制并发数。熔断降级则是作用在流出方向客户端测的流量控制,可以配置在一定错误率情况下进行熔断,并配合降级数据快速返回。

以上规则均可以通过稳定性平台配置,然后由配置中心分发到api网关,再进行热更新刷新内存缓存。每次请求时sentinel sdk都会帮我们做好数据统计并判断是否符合规则,同时被限流隔离、熔断降级的流量都会通过相关sdk(基于prometheus)暴露metrics数据给监控平台,以便我们随时观察到流量控制水平。


-     安全策略     - 

时常我们会遇见一些异常流量,典型的就是恶意爬虫,所以完善一些基础的安全策略是必要的。

整个安全策略的结构如上所示。用户可以在网关管控平台手动进行规则配置,经由配置中心下发到api网关的securityControl进行热更新。在请求来临时由securityControl判断是否符合规则,被封禁的流量同样暴露metrics数据给监控平台供我们随时查看。

此外,手动配置封禁规则在某些场景可能比较低效。我们同时还会将网关日志实时采集至大数据分析平台,经分析后如果判断某个ip或者用户存在异常情况,会自动配置安全策略规则至网关管控平台,同时触发一个报警提醒业务owner。

在安全策略目标方面,我们目前支持包括根据客户端IP、用户ID、其余http header/attribute等。策略行为方面目前支持快速失败以及验证码,后者用户会在前端被跳转到一个人机验证码的页面。


-     监控报警     - 

与其他微服务应用一样,我们的api网关也有完善的监控报警、调用链追踪、日志查询等功能。这里监控主要指的是查询metrics信息,调用链主要指查询tracing信息,日志顾名思义就是logging,三者是监控领域很典型的信息了:

报警这块除了针对metrics信息/错误日志的报警,还可以支持主机层面的报警。

得意于监控平台以及调用链埋点sdk,api网关几乎不需要改造成本即可接入。整体结构如下所示,api网关内嵌了metrics sdk暴露metrics信息到endpoint供监控中心拉取,tracing sdk负责埋点打印tracing日志,tracing日志和业务日志均会通过日志采集器输入监控中心处理。在监控平台上,用户可以查询调用链、监控、日志信息,api网关发生的主机异常或者业务异常也会报警给owner。

这里值得一提的是,当网关调用后端微服务应用发生异常时,例如超时、连接池耗尽等,这些错误发生在客户端即api网关,所以触发的报警也会报给api网关的owner。但是api网关仅仅作为一个转发服务,其超时很大程度是因为后端微服务rt过高,所以报警应该同时报给后端微服务owner,为此我们开发了双端告警,一份告警会同时发送给客户端和服务端双方。


-     总结     - 

当然api网关还有许多没有展开说的:

  • 我们还支持websocket协议,本次没有详细说

  • 在多云部署环境下,网关承载了一个多云流量调度服务的角色。

未来可以优化的地方:

  • 首先是我们的高并发能力并未怎么经过实际验证,由于tob商业模式公司没有太多高并发的场景。

  • 考虑引入规则引擎来应付各种下发的规则,包括安全策略、稳定性、路由规则等。

  • 安全策略考虑会支持更多一些,例如IP网段,及支持各种逻辑与或非

作者:fredalxin

来源:https://fredal.xin/build-api-gateway

想知道更多?描下面的二维码关注我

后台回复"技术",加入技术群

后台回复“k8s”,可领取k8s资料

【精彩推荐】

  • ClickHouse到底是什么?为什么如此牛逼!

  • 原来ElasticSearch还可以这么理解

  • 面试官:InnoDB中一棵B+树可以存放多少行数据?

  • 架构之道:分离业务逻辑和技术细节

  • 星巴克不使用两阶段提交

  • 面试官:Redis新版本开始引入多线程,谈谈你的看法?

  • 喜马拉雅自研网关架构演进过程

  • 收藏:存储知识全面总结

  • 微博千万级规模高性能高并发的网络架构设计

这篇关于深入微服务 API 网关之架构实践篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129525

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-