如何基于 APISIX 迭代数字智联平台

news2025/1/13 8:07:22

分享嘉宾:沈巍,浙大网新研发总监。

网新电气成立于 2011 年,属于浙大网新旗下,为绿色智慧交通系统解决方案的提供商。业务范围包括铁路、隧道、城市智能交通、航空、高速公路等行业。整个高铁信息化的业务分布占到了全国市场的 20% 以上,比如参与建设了杭黄铁路、合肥南站等客服信息化系统;杭州文一路隧道、杭州紫之隧道等监控系统;首都机场物联网平台、数据交换平台等系统。

在城市智能交通的覆盖范围下,很多场景对于流量处理和系统稳定性都要求极高。为了应对这种城市级别的数字智能要求,对于基础架构的组件选择也是重中之重。本文将从数字化平台应用的角度,带来与 API 网关 Apache APISIX 的相遇相熟和应用,希望对仍在网关选型过程中的企业或用户有所帮助。

数字大桥智联平台应用场景

https://img-blog.csdnimg.cn/c463f07187a0464e8cad00bb684ba047.png

在数字领域的业务实践中,我们打造了网新数字大桥智联平台。数字大桥智联平台是一个非常庞大的交通领域管控系统,涵盖了整个交通领域比如结构化安全、病害检测、日常维养巡检、数字孪生与建模、交通应急指挥以及各类评估算法等等。

下图为网新数字大桥智联平原本的架构模式,整个系统主要分为四个部分。

https://img-blog.csdnimg.cn/529fbfc2678d42668ba655611aaf21b7.png

最底层属于采集层,主要负责采集各类数据。目前采集数据的种类比较多,比如温度传感器会采集到路面的一些温度;结构层面的力学传感器会检测震动数据;GPS 传感器则会采集位移情况;无人机监测路面状态等等,所以整体监测类型的数据量也是非常大的。

在此之上,在中间层我们还构建了一个数据中枢,它可以把所有的业务数据都汇总到一起,然后再提供业务的 API 给各个业务系统使用。这个项目最大的一个特点,就是参与的公司很多(大概 30+),这些公司都会参与进来进行各自的业务系统搭建。

在业务层中,需要在同一套用户体系下访问业务系统,主要是给业务用户使用。在实际实践过程中,不同业务系统之间往往存在交叉访问。随着业务系统的增多,整个服务对外提供的 IP 和端口也会增多,一些问题开始应运而生。

痛点与现状

随着实践的增多,我们发现上述架构开始呈现如下问题:

  1. 不同系统之间 API 鉴权各异,大量重复开发;
  2. 不同系统对 API 的安全管理程度不同;
  3. 缺少统一的 API 路由;
  4. 缺少统一 API 监控等。 基于上述需求痛点,引申出了一个结论方向:即我们需要构建一个 API 网关。API 网关对于我们现阶段的系统而言,是一个刚需的组件。在这个过程中,我们也开始考虑如果引入 API 网关后会有什么优点。

https://img-blog.csdnimg.cn/df10472c01994e76b07e0b27c4f681fa.png

比如之前整个业务系统会暴露大量的服务端口,因为系统很多都需要暴露到外部去使用。引入 API 网关后,或许整个系统可以只暴露一个 443 端口,其他全部在内网访问即可,这样整个系统的安全性就更高。

其次 API 鉴权如果都放到 API 网关来做的话,那整个功能的实现就非常简单了,同时还降低了各个业务系统之间互相调用的开发工作量,避免重复开发。同理对于 API 的路由和监控也一样,都可以让整体业务更好地管理。

最后就是内网如果走 HTTP 的话,性能其实会更好。因为之前架构中,各个业务系统之间的互相调用,为了保证安全性所以选择了 HTTPS 模式,在一定程度上影响了整体性能。

所以总体来看,加入 API 网关这个组件,对于我们整体业务的提升是比较明显的。

网关层为何选择 APISIX

自研初尝试

在选型 API 网关之前,其实我们自己也尝试过一些操作。因为整个团队对 Java 技术栈和 Spring 框架都比较熟,所以就选择基于 Zuul 开发了一个 API 网关使用。当时这套网关对于 HTTP 场景也基本够用。随着后续继续使用,就有新的需求开始产生。比如:

  • 需要对 WebSocket 的鉴权进行支持。 很多实时类的告警信息需要通过 WebSocket 进行推送,如果需要支持这类信息,还需另行开发;同时 Zuul 对 WebSocket 的支持性不是很好,想要对 WebSocket 进行鉴权更是难上加难。
  • 需要路由支持 HLS 和 FLV 等流媒体协议。 由于本身业务实践场景中,对于视频处理的需求比较大,尤其是面向 ToB 和 ToG 的业务场景,视频监控是一个很重要的系统。因此如果视频处理走网关的话,就需要支持 HLS 和 FLV 流媒体协议(两种都基于 HTTP),同时视频对于延迟性和流量要求都是很高的,对网关压力极大。
  • BIM 模型展示,基于 3D Tiles 协议需要在短时间下载数 GB 的数据。 在前文提到的数字孪生场景下,BIM 建模非常火。因此整个模型体量是非常大的,大概几百个 G 。尽管 3D Tiles 协议支持动态加载能力,但是在短时间内需要完成的流量依旧很庞大,对于网关来说压力就更大了。
  • 路由需要动态加载,即时生效。 在动态加载层面,Zuul 没法满足我们即时生效的需求。即便是我们进行二次开发,也会加大额外的工作量,同时还并不能保证可以完美地实现这种效果。

调研选型主流网关

在自研道路上跌跌撞撞之后,我们开始对市场中主流的网关产品进行调研。当时我们调研了以下几个网关,调研完之后发现每个产品各自的优缺点都比较明显,但是都不能很好地契合我们的场景。比如 NGINX 无法做动态路由,Java 技术栈相关的性能又跟不太上等。

https://img-blog.csdnimg.cn/4b6dbc8a4bcf41bfb5485fe214d27344.png

调研之后,我们并没有找到适合自己的产品,也一直都在观望和困惑中。但后来在选型过程中,无意间看到了由开源中国举办的 「2021 年年度中国开源项目」评选活动。因为我觉得这里面肯定有很多优秀的项目,于是抱着学习的心态就一个个点进去了解了一下,然后就看到了 API 网关产品 —— Apache APISIX。

https://img-blog.csdnimg.cn/8948b122e3c94d8faf3bb13dc9b273ac.png

后来跟随 APISIX 的各种介绍,包括 GitHub 上的提问、社区官网上的技术文档以及 B 站上的一些用户案例和技术实践分享等等,我发现整个社区都非常有活力。比如在 GitHub 上有接近 3600 个 issue 而且已经解决了 3200 个左右,解决率高达 89%,这个数量占比还是非常可观的;同时有些社区反馈渠道也允许中文提问,这对于中国开发者而言非常友好。

同时 Apache APISIX 项目在全网有较多的参考资料。APISIX 社区在 B 站和 Youtube 上都有非常多的视频分享,包括用户案例和一些技术 tutorials(教程)。我曾经花了两天时间把 APISIX的 B 站视频全都看了一遍,这个过程中我发现有很多企业类似的案例都跟我们的需求场景很类似,包括一些实践过程中踩的坑。这些对于我们而言,很多是可以直接拿来借鉴的真实经验,对于后续的架构更新有非常高的价值参考。

这些细节,都让我们对于产品的后续使用有了十足的安全感,最终我们选择了将 Apache APISIX 作为 API 网关进行后续架构和业务的迭代。

应用 APISIX 的业务实践

让 K8s 中部署更可靠

https://img-blog.csdnimg.cn/a7df54ede7214aa7bb33d614a5e42242.png

目前我们是将 APISIX 部署在 K8s 上使用,整个用户侧的业务系统都是先经过 API 网关,然后再由 API 网关在路由上分发到各个业务服务,中间都是通过内部域名进行传递。

在高性能的体现上,我们采取了 K8s 多实例的方案。比如说性能要求好,就可以给它配 10 个实例;性能要求差一些,就配 5 个实例。

同时域名也是我们很在意的点。因为按照前文所提到的预想规划,我们只希望暴露一个 443 的端口出去,其他都通过 K8s 内部的域名进行整体服务的运转。在刚开始使用 APISIX 时我还有些担心,万一它只支持 IP 地址跟端口,那就很麻烦了。

后来经过测试发现效果也非常好。如下图左侧为 APISIX Dashboard,右侧是服务域名(K8s 服务域名)。这里就可以直接配置 K8s 的域名+一个端口,这样就可以直接完成域名的转发。这对整个系统的可靠性跟安全性都有了非常强力的功能支持。

https://img-blog.csdnimg.cn/fd573fc6f9a84baeb7df547dd00c5377.png

自定义服务轻松对接鉴权

单点登录与鉴权也是我们业务系统中非常重要的一部分。因为我们有大量的业务和用户需要进行管理,所以这一块肯定是由各自业务系统进行的,因此我们也自研了单点登录服务。

由于自研服务系统,所以相关 token 并不通用,其中就会携带一些业务特定的自定义信息。因此我们也害怕自己的 token 无法被 APISIX 鉴权相关功能所识别,因为 APISIX 提供的 token 是我们内部无法使用的。

https://img-blog.csdnimg.cn/da782920ac9947dab86b08c49f2a26b0.png

但在后续的实践过程中我们发现,这种想法是多虑的。在实际生产过程中,只需把我们业务的 token 生产加密算法与 APISIX 的加密配置保持同步,就可以利用 APISIX 实现完整功能的鉴权。如上图所示,自研服务产生的 token 通过 APISIX 的 jwt-auth 插件完成了一整个服务鉴权。

针对业务的 etcd 处理

作为 APISIX 架构中的重要组件,etcd 对于我们的研发团队来说确实是一个挑战。由于本身对 etcd 并不熟悉,所以我们在 K8s 环境中部署 etcd 集群折腾了很久。虽然在学习成本上有些折腾,但也意外发现了一个惊喜。

我们发现,APISIX 在 etcd 宕机后,非重启情况下还可以正常工作。等 etcd 恢复后, APISIX 会自动重连。基于此,我们提出了一个更贴合实际业务场景的方案。

因此我们放弃了配置 etcd 集群,而是只配置了一个 etcd 用来支撑整个 APISIX。只需要把 etcd 的数据备份好,重启完 APISIX 也能正常连接运作。实际运行起来的效果也是很不错的,至少对于我们的业务场景是够用的。同时因为 etcd 只部署了一个,所以后续的运维工作量也减少了很多。

开箱即用的 API 监控

对于我们的业务来说,是属于强依赖于系统集成的项目,因此业务系统之间互相调用 API 的环节就非常多。如果某些系统之间的调用 API 出现了问题,就会导致不同业务部门互相扯皮。为了应对这种环节,就需要有相应的监控系统进行排查。

APISIX 官方其实已经提供了一套完整的监控解决方案「APISIX+Prometheus+Grafana」。利用自带的 prometheus 插件,可以非常方便地与 Prometheus 进行集成,并实现请求状态码、实时带宽、etcd 可用性、TCP 连接指标和节点等信息的监控和管理。

https://img-blog.csdnimg.cn/48692c1ccfb0471d9f31554dc0581aa3.png

依靠 APISIX 这套监控方案可以很容易地定位出哪部分调用 API 出现了问题,进行快速定位,避免了各业务系统之间集成对接时所产生的一些问题。

总结与展望

总体来看,我们接触 APISIX 的时间并不算长。2021 年 10 月份刚知道这个产品,在测试和需求检验等角度折腾了两三个月后,开始尝试部署到生产环境中,现在也是随着官方版本的更新逐渐迭代。

从我个人角度和业务运行的体验来看,APISIX 作为网关已经是一个很成熟的产品了。在使用的这段时间里,也逐渐从对这个产品的各种担心到真正上手后的惊喜回馈:

  • 一开始曾担心配置上游时,无法使用 K8s 的服务域名;使用过发现,原来完美支持服务域名访问。
  • 基于 APISIX 实现了业务高可用方案,依赖 K8s 云平台实现多实例+自动伸缩+健康监测+预警告警等功能。
  • 对于系统集成项目,APISIX 完美解决了 API 的管理、 鉴权、路由问题。
  • 其配置的热更新特性,极大避免了“因为更新导致服务无法正常访问”。
  • 作为一个开箱即用的网关产品,让开发人员可以更专注于业务代码。

当然,在实践过程中,我们也基于这些操作提出了一些业务层面对于 APISIX 的功能需求,比如:

  • 能否支持除 etcd 外的其他数据持久化方式,比如 MySQL、PostgreSQL 等。可让我们在熟悉的数据存储领域能够更好地应用与排查问题;
  • APISIX Dashboard 能否支持一键数据备份与还原。 整体来看,在使用 APISIX 的过程中,对于开发人员的学习成本可能高了一些,但是产品服务于业务中所体现出来的整体效果是完全惊喜的。后续我们也计划在更多系列的业务产品中引入 APISIX,作为网关组件让我们的业务产品可以发挥更稳定更高效的价值。

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

Electron 麒麟 Linux 系统 root 账户报错

使用Electron打包成客户端在麒麟Linux 操作系统上运行,普通用户启动程序正常 使用root用户出现各种问题。总结问题如下: 1. Running as root without --no-sandbox is not supported。 解决方案: 在启动命令后面加入 --no-sandbox sudo …

为SSH远程配置固定的公网TCP端口地址【内网穿透】

由于使用免费的cpolar生成的公网地址,为随机临时地址,24小时内会发生变化,并且带宽较小,只有1M。对于需要长期SSH远程的用户来说,配置固定的公网TCP端口地址,提高带宽就很有必要。 1. 保留一个固定TCP端口地…

信息收集道道之外网信息收集

#信息收集道道之外网信息收集 从个人的角度去简单整理下打点前的信息收集那些事。从信息收集本质上来说多数内容都是大同小异,遇到坚壁时,不用死磕,毕竟条条大路通罗马(大佬们也可以说说看法~向各位大佬学习! 红队知…

业务数据LEFT JOIN 多表查询慢--优化操作

首先你会想到,给表加索引,那么mysql会给主键自动建立索引吗? 会的,当然会。 在我们查询的业务表操作的时候,表业务数据庞大起来的时候,以及left join多的时候,甚至多表关联到几十张表的时候,查…

【云原生】二进制部署k8s集群(中)搭建node节点

内容预知 连接上文 1. 部署 Worker Node 组件 1.1 work node 组件部署前需了解的节点注册机制 1.2 Worker Node 组件部署步骤 2. k8s的CNI网络插件模式 2.1 k8s的三种网络模式 K8S 中 Pod 网络通信: (1)Pod 内容器与容器之间的通信 &am…

2022年四川建筑八大员(标准员)考试试题及答案

百分百题库提供建筑八大员(标准员)考试试题、建筑八大员(标准员)考试真题、建筑八大员(标准员)证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 1.施工项目管理目标…

[附源码]Python计算机毕业设计SSM基于框架的校园爱心公益平台的设计与实现(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

java基于Springboot的学生毕业离校系统-计算机毕业设计

项目介绍 学生毕业离校系统的开发过程中,采用B / S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。中间件服务器是Tomcat服务器,使用Mysql数据库和Eclipse开发环境。该学生毕业离校系统包括管理员、学生和教师。其…

【SpringBoot应用篇】SpringBoot+JasperReport导出PDF

【SpringBoot应用篇】SpringBootJasperReport导出PDFJasperReport简介JasperReport的开发步骤生命周期执行流程模板工具Jaspersoft Studio概述安装配置面板介绍基本使用模板制作编译模板入门案例环境准备导出一个最基本的PDF文件导出用户列表需求数据直接从数据库中获取数据从后…

Lombok实现原理解析

文章目录前言一、Lombok注解分析二、编译期的注解处理期三、Lombok使用方法四、自定义注解处理器1、自定义注解2、实现Processor接口3、注册注解处理器五、实战MyGetter注解1、新建Maven工程myLombok2、新建子模块myget3、新建子模块person4、编译并查看结果总结前言 相信做ja…

171-有趣的OpenAI的chatGPT小实验

最近玩了一下chatGPT 问了他很多问题 然后我问了一个问题 帮我想10个帮女朋友过生日的办法 然后AI就回复了我10种 然后我继续问了我说再来10个 他又想了10种, 所以我特别想看看他到底有没有极限 10个 20个 30个 40个 50个 60个 70个 80个 90个 100个 接下去…

秋招---SQL学习

文章目录SQL的执行顺序一般是怎样的SQL如何性能优化1.select尽量不要查询全部*,而是查具体字段2.避免在where子句中使用 or 来连接条件3.尽量使用数值替代字符串类型tinyint,int,bigint,smallint类型4.用varchar代替char那什么时候要用char不用varchar呢链接&#x…

玩转华夏数艺

这里写自定义目录标题华夏数艺简述新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是…

叶酸-葡聚糖-盐酸吡柔比星偶联物(FA-PRB-DEX-NPs)|丝裂霉素C-右旋糖酐交联物(MMC-D)

叶酸-葡聚糖-盐酸吡柔比星偶联物(FA-PRB-DEX-NPs) 产品描述:将葡聚糖,盐酸吡柔比星和叶酸按序化学合成,并进一步定量,采用体外细胞性实验(四甲基偶氮唑蓝法),观察游离盐酸吡柔比星,叶酸-葡聚糖-盐酸吡柔比星,叶酸-葡聚糖-盐酸吡柔比星游离叶酸对于不同浓度细胞株SG…

计算机毕业设计ssm+vue基本微信小程序的育教幼教知识学习系统 uniapp 小程序

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,各种管理系统层出不穷。时代对人们的知识水平和综合素质要求也越来越高了,因此出现了各种适合用户在线学习系统。广泛存在于PC系统,手机APP,电脑软件等等,其中用户量…

Effective C++条款29:为“异常安全”而努力是值得的(Strive for exception-safe code)

Effective C条款29:为“异常安全”而努力是值得的(Strive for exception-safe code)条款29:为“异常安全”而努力是值得的1、抛出异常的案例2、解决资源泄露的问题3、异常安全的三种保证4、两种解决异常安全的方法4.1 使用智能指针…

如何压缩动态图片大小?gif图太大了怎么压缩?

对于新媒体行业人员来说,平时在工作中需要存非常多的素材,这些素材中有很多就是gif格式的,随着积累的素材越来越多,这些素材会占用大量的储存空间,那么遇到这种情况应该怎么办呢?应该如何压缩动态图片大小&…

Flutter - 布局原理与约束(constraints)

尺寸限制类容器用于限制容器大小,Flutter中提供了多种这样的容器,如ConstrainedBox、SizedBox、UnconstrainedBox、AspectRatio 等 1 ConstrainedBox ConstrainedBox 用于对子组件添加额外的约束 一般作为最外层的父布局 2 BoxConstraints BoxConstrai…

[附源码]Python计算机毕业设计SSM基于社区人员管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

阿里P8架构师精心整理:Dubbo+Docker+Kubernetes实战PDf,附面试题

前言 学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生…