Links

服务端Operation

HTTP请求流程

接着,我们复盘下上文提到的3中类型时序图。他们都能用该HTTP请求流程图表示。
即,客户端发起REST请求,飞布服务查找并解析对应OPERATION,根据指令调用不同的拦截器,根据命名空间拆分请求到不同数据源,或控制请求不同数据源的流程,如串行或并行。
并将请求结果组装后,以JSON的方式返回给客户端。
一般情况下,基于GraphQL的服务直接对外暴露gql 端点,operation一般写在客户端,而飞布反其道而行,把operation放到服务端。
这样做有如下好处:
  1. 1.
    前端开发者无需感知GraphQL的存在,因此无需任何学习成本。
  2. 2.
    飞布对外暴露REST API,可以复用HTTP基础设施,如CDN等。
  3. 3.
    OPERATION保存在服务端,攻击者无法触达OPERATION,保证了安全。
  4. 4.
    无论客户端还是服务端OPERATION,都能利用GraphQL按需取用、类型系统的优势。

GraphQL指令注解

GraphQL的指令系统实现更加复杂的业务逻辑,但如果将指令放到客户端,就无法保证安全。得益于服务端OPERATION的第三点优势,Fireboom充分发挥了GraphQL指令系统的优势。
飞布的指令面板用于可视化插入指令,除了跨源关联外,指令分为三大类:全局指令(包括角色和私有),入参指令(用于修饰OPERATION入参)、出参指令(用于修饰operation字段)。
  • 全局指令:作用于Operation,用于定义整个operation的行为,例如设置权限或声明其为内部操作。
  • 入参指令:作用于 入参变量,用于为参数设置默认值,默认值可能源于当前登录用户或固定函数(环境变量)
  • 字段指令:作用于 输出字段,用于修改字段的行为,如transform拍平响应结构
  • 跨源关联指令:用于实现多API的流程编排,详情见 关联查询
在飞布中,指令本质上用于实现HTTP的切面功能,与JAVA等的注解类似。