服务
关于
CloudProse博客

2016年10月13日,星期四

GraphQL是目前流行语宾果卡上最大的方块之一,它是 最近获得了很多动力{:target =“ _ blank”},无服务器坐在它旁边。最近,我很高兴(也很悲伤)同时使用这两种技术,即“无服务器GraphQL”。

为什么要问GraphQL?实际上,它实际上简化了很多事情,并且为无服务器世界带来了许多优势:

  • 为您的所有资源提供易于理解的统一API层
  • API客户端仅在一次请求中仅请求并接收所需数据,这是网络性能优化的终极目标
  • API的一个端点或资源的逻辑划分(例如“服务”),无需创建数十个其余端点和方法映射
  • 可以简化API版本控制和管理许多连接的客户端版本
  • GraphQL端点可以与其他API,数据库和数据存储区(S3)进行通信,而复杂性与客户端无关...使用最佳工具完成工作
  • 由于GraphQL使用定义的类型化架构, 交互式查询和变异IDE{:target =“ _ blank”}等具有自动完成功能的东西已经存在,并且可以与您的端点一起使用

重要的是要认识到GraphQL定义了读取和写入(突变)接口,并且可以在同一端点上为它们提供服务。用户通过POST请求将“ graphql”定义的读取或变异发送到GraphQL端点。没有像RESTful API中那样定义操作或资源的端点的概念。

如果您想深入了解GraphQL, 查看这个很棒的演讲来自其中一位创作者的{:target =““ _ blank”}”。

为了快速理解,我们来看一个简单的博客,例如,一个博客包含帖子和评论。

# Get 所有  posts ids and titles available for the blog{ posts{ id title }}# Example Response{ "posts":{ "data":[ { "id": "pid123", "title": "Hello World" }, { "id": "pid124", "title": "Hello World 2" } ] }}# Get a post, its content, and 所有  of its comments and their content{ post(pid: "abc123"){ id title comments { id author content } }}# Example Response:{ "post": { "data": { "id": "pid123", "title": "Hello World", "comments": [ { "id": "cid123", "author": "Moe", "content": "I agree." }, { "id": "cid124", "author": "Larry", "content": "I disagree." }, { "id": "cid125", "author": "Curly", "content": "You are both wrong." } ] } }}

突变(或书写)也很简单……假设我们要创建评论。

# Create a comment on a given post{ mutation createComment(pid: "abc123", content: “This is pretty cool!”){ id }}# This will write to the database, and if successful return back the ID of the new comment{ "createComment": { "data": { "id": "cid126" } }}

这是一个微不足道的博客实施,并且没有解决初学者身份验证,授权,验证,限制和分页所涉及的复杂性。但是,这些复杂性中的绝大多数不应该在GraphQL层上,而应该在您的业务逻辑层中。 Facebook工程师建议GraphQL应该是 在实际业务逻辑之上的非常薄的访问层{:target =“ _ blank”}。

那呢 无服务器 GraphQL?

男孩,我很高兴你问!我们发现,在无服务器架构中包装GraphQL端点有几个主要好处。当然,您可以获得API网关和Lambda的超扩展性和成本效益,并且可以利用由API管理的简单部署。 无服务器框架{:target =“ _ blank”},但让我们再看一些。

监控方式 大大简化。您无需触发CPU,磁盘空间,带宽问题或任何其他常规问题。由于每个GraphQL查询都在其自己的上下文中运行,因此不必担心单个查询会占用计算机的资源(但是您可能仍需要监视下游依赖项(例如数据库))。在许多情况下,监视可以像查看延迟和调用错误一样简单明了。

功能运行隔离 如果有人通过密集的操作恶意或无意地砸向我们的API,可以为我们提供一定的安全性。避免查询计算或内存昂贵的操作,因为为每个lambda请求分配了完整的容器资源,没有共享资源。与EC2不同,这意味着恶意请求不会轻易影响良好请求。现在,您仍然需要担心下游服务,但是无服务器是一个很好的开始。

版本控制 可以简化服务,因为您无需担心添加字段是否会破坏客户端。作为GraphQL的副产品,客户只要求和接收 究竟 他们需要什么。您只需要更新lambda函数就可以了。您可以根据现有字段和功能继续添加字段和功能而不会破坏客户端。当然,如果您更改特定字段的工作方式,则可能需要警告API使用者,但这在经过深思熟虑的API设计中很少见。

自我记录/可探索的API 这更多的是GraphQL的功能,但是您可以花很少的钱就可以分发API资源管理器。名为GraphiQL的项目使此操作特别容易。开发人员和其他API使用者可以直观地修改您的API,了解其工作原理,并构造查询和变异。有关运行示例,请查看此 星球大战GraphQL API{:target =“ _ blank”}。

站起来第二个终点 比第一个更容易。在某些情况下,第二个GraphQL端点可能具有不同的逻辑服务或业务案例。您可以在Serverless Framework配置中利用所有相同的组件,并且在有意义的情况下仅添加第二个端点。如果您习惯于为新服务站起来,这将是一个巨大的胜利。 (旁注:如果您正在这样做,请查看CloudFormation或Terraform或其他基础结构作为代码选项!)

Lambda扇出,虽然功能更先进,但可用于特别紧张的查询和工作。可能是一个查询请求,以获取有关多个子系统上的数据的更多信息,或者通过S3存储桶中的多个csv进行传播。用一个 Lambda扇出 模式可以使您的GraphQL层具有最强大的功能。备用机上没有大型的自动扩展组,以防万一。

您也可以结帐以下示例 无服务器框架的无服务器GraphQL{:target =“ _ blank”}!

我们称之为总结,但是无服务器GraphQL确实让我兴奋。该范例非常强大,我们在Trek10上看到了它的浓厚兴趣,我想如果您试一下,就会得出一些与我们相同的结论。

作者
贾里德·崔特(Jared Short Trek)
贾里德·肖特(Jared Short)