如何使用OpenAPI / Swagger规范定义基于事件驱动的微服务架构?对于事件,重要的是记录在不通过HTTP路径访问时传递给不同服务的事件负载。我见过的所有内容都是基于API的HTTP路径,因此我想知道如何使用OpenAPI / Swagger规范实现这一点?
OpenAPI规范3.1通过顶级webhooks
属性支持事件。详细定义请看OpenAPI规范3.1:
对于处理OAS 3.0的工具而言,仅使用模式定义事件主体仍然很有用,因为此类定义可以被代码生成工具(如OpenAPI Generator)用于自动生成Java、Swift、Go等语言的模式对象。
对于Swagger规范2.0(又称为OpenAPI规范2.0),您可以像alamar提到的那样在Swagger规范中包含定义。即使这些定义与任何路径都没有关联,Swagger Codegen也会自动创建模型类。我构建和维护了一个使用Swagger Spec/Codegen构建的RingCentral API的Go SDK,其中包含此类事件。您可以在下面的文件夹中查看Swagger Codegen生成的自动生成类/结构体,筛选以_event.go
结尾的20个文件。当前使用的是swagger-codegen
2.3.1。
如果您有多个事件类型,拥有一个事件属性可以区分接收到的消息类型可以帮助将其解析为正确的事件类/结构体。在Go中,您可以将数据解组两次,一次解组到一个通用结构体中以查看事件类型属性,然后第二次解组为实际的事件类型。
我还在Chathooks webhook reformatter project中维护了一个示例事件和解析代码的集合,供您参考。您可以在此处查看示例事件和(手动编写的)语言定义:
与OpenAPI的替代方案是使用AsyncAPI,它是一种面向事件驱动架构的规范。它是协议不可知的,因此可以与基于消息的Kafka、Websocket、MQTT、AMQP和其他任何东西一起使用。
"$ref": "#/definitions/User"
,就像主Swagger示例一样。