背景

解决什么问题:服务端API相对稳定, 客户端API需求变化大, 在复杂多服务复杂业务开发中, 资源协调成本高德问题。

API 网关:

所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。
作用:作为一个系统的后端总入口,接口聚合、路由转换、安全、限流、缓存、日志、监控、重试、熔断等。
分类:

  • 单节点API网关
  • BFF网关

image.png

什么是BFF?

BFF, backends for frontends

优点

  • 利于前后端解耦
  • 利于多端适配
  • 职能分工明确细化
  • 利于提升前端体验和性能

    缺点

  • 增多了数据流链路,不利于排查和定位问题

  • 需要服务端技能
  • 需要前端和BFF同步开发
  • 增加了整体框架的复杂程度
  • 服务器资源占用

场景:

  • SSR -> 同构
  • 服务接口的聚合、裁剪、透传(GraphQL)

    BFF实践

nodejs与java通信

面临的问题:

  • 跨语言序列协议hession
  • 弱乐境nodejs中如何强调java服务
  1. 配置jar包依赖
  2. 安装类库
  3. 配置Consumer
  4. 开发业务代码
    1. mvn install proxy // maven命令

多App适配

聚合

  • 简化客服端逻辑, 减少网络开销
  • 避免无意义的透传
  • 敏感信息过滤

    接口设计

    终端
    BFF API

  • 合理设计接口数量

  • 提供含各种状态的mock真实数据, 页面不依赖server开发
  • 多协议发布
  • 规范数据格式

基础服务接口

  • 细力度
  • 通用的功能, 可能被多个BFF用到
  • 提供含各种状态的mock真实数据, 易于同步开发

    应用发布

    docker

目录结构

  1. ├── SSR 服务端渲染
  2. ├── client RPC 客户端
  3. ├── protocols RPC 协议内容
  4. ├── schema graphql 接口模型
  5. ├── server Node.js 模拟的后端
  6. ├── static 静态资源
  7. └── views 视图

RPC

RPC(Remote Procedure Call)中文名「远程过程调用」,调用其他进程或机器上面的函数。
一个完整的 RPC 框架主要有三部分组成:

  • 通信框架、
  • 通信协议、
  • 序列化和反序列化格式。

基于 TCP 的 RPC 调用的基本流程
image.png

RPC VS HTTP

RPC HTTP
传输协议 可以基于TCP, 也可以基于HTTP 基于HTTP
传输效率 请求报文体积更小
性能消耗
(主要在于序列化和反序列化的耗时)
基于thrift实现高效的二进制传输 大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能
负载均衡 自带了负载均衡策 需要配置Nginx,HAProxy来实现
服务治理
(下游服务新增,重启,下线时如何不影响上游调用者)
能做到自动通知,不影响上游 需要事先通知,修改Nginx/HAProxy配置
场景 主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便 主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等


参考:

https://os.alipayobjects.com/rmsportal/WtUmBLJSmqtDHkvJzuzM.pdf