Salesforce 构建可扩展 API 的旅程( 二 )


GraphQL使用强类型系统 , 所有的类型都是使用GraphSDL以模式(schema)的方式进行定义的 。 它可以作为客户端和服务器的契约 , 避免请求/响应结构的混淆 。
GraphLQ支持内省(introspection) , 所以模式定义可以通过各种工具进行共享和下载 , 如GraphiQL、GraphQL-playground或cli工具 。
GraphQL实战
我们在ClassificationInsightAPI中使用了GraphQL 。 ClassificationInsight提供了用户的信息 , 并且能够帮助会议的参加者了解其他参会人员的头衔和角色 。 我们使用Kotlin和graphql-java(GraphQL的一个Java实现)实现该API 。
第一步:定义模式(如schema.graphqls) 。 每个GraphQL服务会定义一组类型 。 GraphQL模式中最基本的组件是对象类型 , 它代表了一种我们可以从服务中获取的对象 。
schema.graphqls
第二步:实现Datafetcher(也被称为解析器)来解析getClassificationInsightsByUser字段 。 简单来讲 , 解析器就是由开发人员提供的一个函数 , 用来解析模式中定义的每个字段并从配置的资源(如数据库、其他API或缓存等)中返回值 。
在本例中 , 我们的Query类型提供了一个名为getClassificationInsightsByUser的字段 , 它接受emailAddresses参数 。 该字段的解析器函数很可能会访问一个数据库 , 并构造和返回ClassificationInsightByUser对象的一个列表 。
第三步:初始化GraphQLSchema和GraphQLObject(借助graphql-java)来辅助执行查询 。
第四步:编写servlet(MyAppServlet) , 处理传入的请求
第五步:在应用中 , 嵌入Web服务器(本例中使用的是Jetty) 。
第六步:构建并启动应用 , 请使用CI/CD工具来创建、发布和部署Docker镜像到集群中 。
确保API的安全性
在Salesforce , 安全性是首要任务 。 我们的API仅供注册用户访问 , 而且他们只能访问有权限的数据 。 在这方面 , 你可以探索OAuth2.0(JWT授予类型和基于角色的访问控制)和开放策略代理(OpenPolicyAgent , OPA)来满足访问控制的需求 。
作为最佳实践 , 认证中间件应该放在GraphQL之前 , 并且要在业务逻辑层有唯一一个地方负责授权 , 避免在多个地方都要进行检查 。 除了认证和授权 , 在设计API时还应考虑速率限制、数据脱敏(datamasking)和载荷扫描 。
总结
Salesforce 构建可扩展 API 的旅程】我们已经展示了如何构建一个可扩展、高效、安全的API 。 在这个过程中 , 我们使用应用容器进行扩展 , 使用GraphQL和嵌入式Jetty确保高效和轻量级 , 并优先考虑了API的安全性 。