Skip to main content

API Awesome

API/RPC 考虑因素

  • 灵活
    • 静态结构
    • 动态结构
    • 兼容性
  • 性能
    • 延时要求
    • 服务对服务
    • 服务对客户端
  • 序列化
    • 二进制
    • 文本 - JSON
  • 语言兼容
    • 需要支持什么语言
    • 自用只需考虑个别语言
    • 对外则需要考虑通用
  • 接口模式
    • 请求响应
    • 流式请求
    • 流式响应
  • 规范
    • 生成友好
    • 元数据信息完整
  • 场景
    • 自用 - 满足内部使用即可
    • 对外 - 采用现有标准规范
  • 生态
    • 可观察性
      • Metric
      • Trace
    • 网关
    • 中间件感知

API Gateway 考虑因素

  • 管理能力
    • 负责 增删改 Endpoint - vendor lockin
    • 使用现有配置 - 控制能力弱
  • 可观察性能力
    • Metric 集成
    • Trace 集成
    • 内置 - 网关采集、内置显示
    • 外部 - grafana、jeager、prometheus
  • 控制能力
    • Auth
    • Threshold
    • 注入自定义逻辑 - Hook
  • 协议感知能力
    • gRPC
    • HTTP
    • GraphQL
    • TCP、UDP
  • 平台集成能力
    • Kubernetes Service、Annotatation
    • Consul Service
    • ETCD、ZK
  • 实现模式
    • 无侵入 - 直接网络拦截
      • 网络层处理 - Cilium
    • 侵入 - 修改代码逻辑
      • 中间件 - 集成 metric、trace 等能力
      • SQL Trace
    • Sidecar - 按应用网络拦截
      • 获取基础 metric 信息、可能能实现 trace 能力
      • Agent 能代表应用身份
      • 通常还能实现 E2E 加密认证
  • 元数据存储方式
    • CRD
    • DB - PostgreSQL、MySQL - 需要额外维护、但方便排查使用
    • KV - ETCD、ZK

Design

规范

RPC

Note

  • rpc 和 serialization 主要的区别在于 服务 是否为第一公民
  • 除了 gRPC, jsonrpc 其他 rpc 实现基本都是语言相关的
    • 意味着 非第一方语言的支持相对较弱
  • gRPC 是支持最多语言的 RPC 协议
RPCbyLanguagesNotes
gRPCGoogle
ThriftFacebookJava
twirpTwitchTVGo - PHP,Ruby
finagleTwitterScalaApache-2.0
tarpcGoogleRust
ice
国产
HSFAlibabaJava
DubboAlibabaJava
go-zero好未来技术Go
kitex字节跳动Go
sofa-rpc蚂蚁金服Java
tars腾讯C++,Java,NodeJS,PHP,WebBSD-3
brpc百度C++,Java
motan微博Java
cat大众点评Java
rpcxGo
erpcGo
MicroservicebyTech
armeriaLineJava
国产
kratos哔哩哔哩Go,gRPC
go-chassisGo
go-doudouGo

JSON-RPC

Serialization


  • ASN.1 PER
  • Avro, CapnProto, Protobufs, Flatbuffers
  • Schema-ful, copying: Protobuf, Thrift, plenty more
  • Schema-ful, zero-copy: Cap'n'proto, Flatbuffers
  • Schema-less, copying: Json (binary and other variants included), XML
  • Schema-less, zero-copy: Flexbuffers
  • Avro is also another data serialization format. Schema-Ful,
  • Arrow would be schema-ful, zero-copy
  • CBOR - Concise Binary Object Representation
    • 与 JSON 混用

Data Gateway

  • Hasura
  • graphile
  • PostREST
  • Prisma2
  • stargate/stargate
    • Java, Apache-2.0
  • urigo/graphql-mesh
    • GraphQL Adapter
    • 后端支持 GraphQL, JSON Schema, gRPC, Swagger, OpenAPI, SOAP, Postgres, Mongo, OData, Thrift, SQLite, MySQL, Neo4j

OpenAPI

npx -y openapi-typescript https://github.com/openai/openai-openapi/raw/master/openapi.yaml --output apis.d.ts

# @7nohe/openapi-react-query-codegen
# ==================================
# https://openapi-react-query-codegen.vercel.app/guides/introduction
# default to @hey-api/client-fetch
npm add @hey-api/client-fetch
npx --package @7nohe/openapi-react-query-codegen openapi-rq -i ./petstore.yaml

API Gateway

API 生命周期管理

Doc

API IDE/Client

SOAP

Produce OpenAPI

参考

Service Discovery