基本信息
文件名称:2025年GraphQL在微服务架构中的实践架构.doc
文件大小:430 KB
总页数:41 页
更新时间:2025-04-04
总字数:约1.59万字
文档摘要

GraphQL在微服务架构中的实践架构

目录

?GraphQL是什么? 1

GraphQL在微服务架构中的使用 2

GraphQL在实践過程中碰到的棘手問題 3

合理的GraphQL微服务架构的设计 4

GraphQL是什么?

简朴對象访問协议(SOAP)從今天来看已經是一门非常古老的Web服务技术了,虽然诸多服务仍然在使用遵照SOAP的接口,不過到今天REST風格的面向资源的API接口已經非常深入人心,也非常的成熟;不過這篇文章要简介的主角其实是另一门愈加复杂、完备的查询語言GraphQL。

作為Facebook在年推出的查询語言,GraphQL可以對API中的数据提供一套易于理解的完整描述,使得客户端可以愈加精确的获得它需要的数据,目前包括Facebook、Twitter、GitHub在内的诸多企业都已經在生产环境使用GraphQL提供API;其实無论我們与否决定生产环境中使用GraphQL,它确实是一门值得學习的技术。

二、GraphQL在微服务架构中的使用

类型系统

GraphQL的强大体現能力重要還是来自于它完备的类型系统,与REST不一样,它将整個Web服务中的所有资源當作一种有连接的图,而不是一种個资源孤岛,在访問任何资源時都可以通過资源之间的连接访問其他的资源。

如上图所示,當我們访問User资源時,就可以通過GraphQL中的连接访問目前User的Repo和Issue等资源,我們不再需要通過多种REST的接口分别获取這些资源,只需要通過如下所示的查询就能一次性拿到所有的成果:

{

user{

id

email

username

repos(first:10){

id

url

name

issues(first:20){

id

author

title}

}

}

}

GraphQL這种方式可以将原有RESTful風格時的多次祈求聚合成一次祈求,不仅可以減少多次祈求带来的延迟,還可以減少服务器压力,加紧前端的渲染速度。它的类型系统也非常丰富,除了標量、枚举、列表和對象等类型之外,還支持接口和联合类型等高级特性。

為了可以更好的表达非空和空字段,GraphQL也引入了Non-Null等標识代表非空的类型,例如String!表达非空的字符串。

schema{

query:Query

mutation:Mutation

}

Schema中绝大多数的类型都是一般的對象类型,不過每一种Schema中均有两個特殊类型:query和mutation,它們是GraphQL中所有查询的入口,在使用時所有查询接口都是query的子字段,所有变化服务器资源的祈求都应當属于mutation类型。

集中式vs分散式

GraphQL以图的形式将整個Web服务中的资源展示出来,其实我們可以理解為它将整個Web服务以“SQL”的方式展示給前端和客户端,服务端的资源最终都被聚合到一张完整的图上,這样客户端可以按照其需求自行调用,类似添加字段的需求其实就不再需要後端多次修改了。

与RESTful不一样,每一种的GraphQL服务其实對外只提供了一种用于调用内部接口的端點,所有的祈求都访問這個暴露出来的端點。

GraphQL实际上将多种HTTP祈求聚合成了一种祈求,它只是将多种RESTful祈求的资源变成了一种從根资源Post访問其他资源的Comment和Author的图,多种祈求变成了一种祈求的不一样字段,從原有的分散式祈求变成了集中式的祈求,這种方式非常适合單体服务直接對外提供GraphQL服务,可以在数据源和展示层建立一种非常清晰的分离,同步也可以通過某些强大的工具,例如GraphiQL直接提供可视化的文档;不過在业务复杂性指数提高的今天,微服务架构成為了处理某些問題時必不可少的处理方案,因此怎样在微服务架构中使用GraphQL提高前後端之间的沟通效率并減少開发成本成為了一种值得考虑的問題。

Relay原则

假如說RESTful其实是客户端与服务端在HTTP协议通信時定义的固定原则,那么Relay其实也是我們在使用GraphQL可以遵照的一套规范。

這种原则的出現可以让不一样的工程師開发出较為相似的通信接口,在某些場景下,例如標识對象和分页這种常見的需求,引入设计良好的原则可以減少開发人员之间的沟通成本。

Relay原则其实為三個与API有关的最常見的問題制定了某些规范:

提供可以重新获取對象的机制;

提供對怎样對连接進行分页的描述;

原则化mutation祈求,使它們变得愈加可