11.3.1 架构设计

Knative为开发人员提供Kubernetes定制化资源,这些资源可用于事件的生产与消费。为了实现向多种类型的服务传递事件,Knative Eventing定义了两个可以由多个Kubernetes资源实现的通用接口:

·Addressable可寻址对象:能够接收和确认通过HTTP传递到由status.address.hostname字段定义的地址的事件。作为一种特殊情况,Kubernetes的Service对象也可以实现Addressable接口。

·Callable可调用对象:能够接收通过HTTP传递的事件并且能够转换事件,在HTTP响应中返回0或1个新事件。可以以与来自外部事件源的事件相同的处理方式进一步处理这些返回的事件。

Knative Eventing还定义了单个事件转发和持久层,称为Channel。消息传递实现可以通过ClusterChannelProvisioner对象提供Channel的实现。事件使用订阅(Subscriptions)传递到服务或转发到其他不同类型的Channel。

如图11-3所示,事件基础架构目前支持两种形式的事件传递:

·从源直接传递到单个服务(可寻址端点,包括Knative Service或核心Kubernetes服务)。在这种情况下,如果目标服务不可用,则Source负责重试或排队事件。

·使用Channel和订阅从源或服务传递到多个响应端点。在这种情况下,Channel实现可确保将消息传递到请求的目标,并在目标服务不可用时缓冲事件。

图11-3 事件基础架构

如图11-4所示,实际的消息转发由多个数据平面组件实现,这些组件提供不同消息传递协议之间的可观察性、持久性和转换。

图11-4 消息转发组件

每个源都是一个单独的Kubernetes自定义资源,每种类型的Source可以定义实例化源所需的参数。Knative Eventing在sources.eventing.knative.devAPI组中定义以下Source:

·KubernetesEventSource:每次创建或更新Kubernetes事件时,KubernetesEventSource都会触发一个新事件。

·GitHubSource:GitHubSource为选定的GitHub事件类型触发一个新事件。

·ContainerSource:ContainerSource将实例化一个容器镜像,该镜像可以生成事件,直到删除ContainerSource。