最终,我选择了 GraphQL 作为企业 API 网关
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
最近,我参与了一个从头开始构建新应用程序的项目,该项目是一个拥有许多前端用户的大型企业级业务应用程序。为了实现所需的逻辑和功能,该项目的架构设计中需要构建大约 50 个微服务,其中一些微服务需要原生地部署到云上,而另一些则需要托管在本地的 OpenShift 集群中,且 OpenShift 集群将成为与遗留数据系统的连接纽带。
由于这家公司之前从未构建过这么多微服务,也从未涉足过云计算领域,所以遇到的很大挑战就是如何编排服务网格,以确保对前端的更改不会破坏应用程序,对后端服务的更改也不会破坏前端。
我推荐的解决方案是:将 GraphQL 用作企业 API 网关。
简化部署编排
几乎所有 API 都存在这样一个问题:如果对其中一个 API 做了更改,那么很可能会导致另一个 API 崩溃。虽然“微服务”的存在本身就是解决这个问题,但在实际应用中也会发生响应时缺少数据的情况。
如果同时部署了不同服务的平台,情况会变得更加复杂。这时,我们往往会使用不同的 CI/CD 管道来实现本地 OpenShift 与云原生 Lambda 服务。
而使用 GraphQL 则相当于为所有服务都提供了前端,简化了将编排部署到平台的步骤。前端应用程序只会和一个端点通信,而这个端点是用于查询和发布数据的无版本模式,因此,当后端发生了更改时,不需要对前端进行更改。GraphQL 端点保持不变,即使后端发生变化,它也可以继续运行。
简化安全性
这个架构的另一个挑战就是如何保护所有的服务?我们是否构建了一个在使用其他服务之前必须先确定其安全性的安全令牌服务?我们是否为每个服务添加了逻辑以确保令牌在头文件中、在任何地方都经过了验证?
如果要我来回答以上问题,那么我的答案是否定的。而使用 API 网关来管理所有的服务,可以将安全检查 / 验证向上移一层,开发人员可以专注于开发中具有业务价值的功能,同时还减少了到处重复的膨胀和冗余代码。
为了提高安全性,我们可以使用 GraphQL 实现以下几点:
深度限制
import depthLimit from 'graphql-depth-limit' import express from 'express' import graphqlHTTP from 'express-graphql' import schema from './schema' const app = express() app.use('/graphql', graphqlHTTP((req, res) => ({ schema, validationRules: [ depthLimit(10) ] })))
速率限制
使用 GraphQL 速率限制(GraphQL Rate Limit)插件,我们可以通过三种不同方式(自定义指令 graphql-shield、或者基本速率限制函数)为查询和突变指定限制。
该插件允许我们设置时间窗口和限制,针对高度易受攻击的突变和查询(如登录),可以设置一个较大的时间窗口,而针对较不易受攻击的查询,可以设置更短的限制。这种方式可以为合法用户提供良好的体验,对攻击者来说则是一个噩梦。
查询成本限制
app.use( '/graphql', graphqlExpress(req => { return { schema, rootValue: null, validationRules: [ costAnalysis({ variables: req.body.variables, maximumCost: 1000, }), ], } }) )
新的部署选项
如果没有 GraphQL,我们就不得不十分小心的对 API 进行发版和更新。如果运行多个版本的 API,例如 /v1 和 /v2,我们就必须确保上游 API 和前端应用程序对 /v2 进行了更新才能退出 /v1。另外,还必须要在同一代码库或容器中同时支持这两个版本,这使得整个架构变得更加脆弱了,也容易受到重大变更的影响。
而使用 GraphQL 服务作为代理,就可以推出一个 /v2 容器,同时运行这两个版本的容器。我们可以对 GraphQL 解析器进行变更,使其指向 /v2,而无需变更前端代码。
这种方式使得新功能的部署变得更容易了,还可以为任何服务选择任何部署策略,例如:
- 蓝 / 绿部署(Blue/Green)
- 金丝雀发布(Canary Release)
- 功能标记(Feature Flagging)
总 结
目前,开发新的应用程序的首选架构是微服务模式,拆分的所有小型服务一起工作,并通过 API 网关暴露出来,以便前端 SPA 应用程序可以使用它们向最终用户呈现信息。而 GraphQL 可以减少攻击面,简化应用程序的开发以及服务的实际部署。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-20
本文作者:Tj Blogumas
本文来自:“InfoQ”,了解相关信息可以关注“InfoQ”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
IBM人工智能芯片的新进展
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! IBM苏黎世实验室的研究人员本周在Nature Communications上发表了一篇论文。在文中他们声称,基于相变存储器的技术,他们已经开发出了一种能同时能高实现能源效率和高精度的机器学习方案。这是一种使用基于电阻的存储设备来实现内存内计算的方法,它们的方法弥补了存储和计算数据分开的方案的缺陷,并在此过程中大大降低了功耗。 文章表示,许多现有的AI推理方案在物理上拆分了内存和处理单元,导致AI模型存储在片外内存中。这会增加计算开销,因为必须在各个单元之间对数据进行转移,这会减慢处理速度并增加用电量。 IBM的技术表面上解决了相变存储器的问题,相变存储器是一种非易失性存储器,比常用的闪存技术要快。这项工作如果被证明具有可扩展性,则可以为在无人机,机器人,移动设备和其他受计算限制的设备中运行AI的强大硬件铺平道路。 正如IBM团队所解释的那样,相变存储设备面临的挑战是它趋向于引入计算误差(computational inaccuracy)。那是因为它本质上是模拟的。由于可变性以及读写电导...
- 下一篇
揭秘政企安全加速解决方案的架构与应用场景实践
政企网络化、在线化面临哪些挑战? 政企涵盖了政府、金融、传媒以及传统企业等几个行业,随着“互联网+”业态的迅速发展,政企数字化转型正当时,特别是在新冠疫情的影响下,各行各业线上业务运营能力的建设步伐进一步加快,架构网络化与业务在线化已经成为政企不可或缺的能力。 具体到各个业务场景中,在政务领域,国家大力推进网上业务来实现数字化治理,向公众提供流畅、稳定的在线服务,以增强其服务水平和效率,提升公众满意度;在金融行业,网上银行、手机支付、移动证券、网上营业厅等新兴的金融类应用在飞速发展,更多的交易、认证、审核等业务流程在互联网上完成;在广电传媒领域,依托带宽提速以及近年来区县融媒体业务的发展,基于互联网的广电新媒体、融媒体在产业中的地位日益提升,互联网上的访问体验以及安全性越发关键;在传统企业领域,借助数字化转型实现能效提升的过程,将经历数字化、网络化、智能化这几个阶段,其中网络化进程中的设备互联、业务联网上云、企业在线营销及服务等场景,成为了传统企业的首要任务。 与此同时,我国对网络安全的监管也在持续不断地加强,且非常强调自主可控,特别是关键信息基础设施(指面向互联网、面向公众提供网络信...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库