API 工程化分享( 六 )


最终你可以在 Makefile 中定义一个 api 指令 , 然后生成一个 openapi.yaml , 以前是 swagger json , 现在叫 openapi , 用 yaml 声明

API 工程化分享

文章插图
 
生成 yaml 文件以后 , 现在 gitlab 直接支持 openapi.yaml 文件 , 所以你可以直接打开 gitlab 去点开它 , 就能看到这样炫酷的 UI , 然后 VSCode 也有一个插件 , 你可以直接去查看
还有一个很关键的点 , 我们现在的 IDL 既是定义 , 又是代码 , 又是文档 , 其实 IDL 还有一个核心作用 , 这个定义表示它是一个元信息 , 是一个元数据 , 最终这个 API 的 mate data 元信息它可以用于大量的微服务治理
因为你要治理的时候你比方说对每个服务的某个接口进行路由 , 进行熔断进行限流 , 这些元信息是哪来的?我们知道以前 dubbo 2.x , 3.x 之前都是把这些元信息注册到注册中心的 , 导致整个数据中心的存储爆炸 , 那么元信息在哪?
我们想一想为什么 protobuf 是定义一个文件 , 然后序列化之后它比 json 要小?因为它不是自描述的 , 它的定义和序列化是分开的 , 就是原始的 payload 是没有任何的定义信息的 , 所以它可以高度的compressed , 可被压缩 , 或者说叫更紧凑
所以说同样的道理 , IDL 的定义和它的元信息 , 和生成代码是分开的话 , 意味着你只要有 one source of truth 这份唯一的 pb 文件 , 基于这个 pb 文件 , 你就有办法把它做成一个 api 的 metadata 的服务 , 你就可以用于做微服务的治理
你可以选一个服务 , 然后看它有些什么接口 , 然后你可以通过一个管控面去做熔断、限流等功能 , 然后你还可以基于这个元信息去调试 , 你做个炫酷的 UI 可以让它有一些参数 , 甚至你可以写一些扩展 , 比方说这个字段叫 etc , 建议它是什么样的值 , 那么你在渲染 UI 的时候可以把默认值填进去 , 那你就很方便做一些调试 , 甚至包含测试 , 你基于这个 api 去生成大量的 test case
参考API 工程化分享
https://www.bilibili.com/video/BV17m4y1f7qc/
接口定义语言
https://docs.microsoft.com/zh-cn/dotnet/architecture/grpc-for-wcf-developers/interface-definition-language
真是头疼 , Proto 代码到底放哪里?
https://mp.weixin.qq.com/s/cBXZjg_R8MLFDJyFtpjVVQ
git submodules
https://git-scm.com/book/en/v2/Git-Tools-Submodules
kratos
https://github.com/go-kratos/kratos
error_details.proto
https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto#L112
pkg/errors
https://github.com/pkg/errors
Modifying gRPC Services over Time




推荐阅读