1. 引言
事件驱动架构(EDA)是一种以事件为纽带,将不同系统之间解耦的异步架构设计模型。在EDA中,事件驱动的运行流程天然地划分了各个系统的业务语义,用户可以根据需求对事件与针对此事件做出的响应灵活定制,这使得基于EDA架构可以方便地构建出高伸缩性的应用。据Daitan Group 的调研报告,早在2017年,例如UBER、Deliveroo、Monzo等公司就已经采用了EDA去设计他们的系统。
为了便于用户更加轻松地开发以EDA为架构的应用,在2020年云栖大会上,阿里云正式推出了EventBridge。EventBridge是一款无服务器事件总线服务,能够以标准化的CloudEvents 1.0协议在应用之间路由事件。目前,EventBridge已经集成了众多成熟的阿里云产品,用户可以以低代码甚至零代码完成各个阿里云产品和应用之间的事件打通,轻松高效地构建分布式事件驱动架构。
除了阿里云之外,针对市场上其他云厂商和垂直领域的SaaS服务,EventBridge也提供优秀的集成与被集成能力,帮助客户更加高效、便捷地实现业务上云。
2. EventBridge基本概念
EventBridge产品包含若干基本概念:事件、事件总线、事件源、事件规则与事件目标。
事件
事件的定义是宽泛的。从业务角度看,任何数据的变更都可以是事件;从应用的角度看,任何基础组件、关联组件状态的变化、水位的浮动也可以看做事件。用户通过定义事件来描述他们期望看到的系统状态变化。
EventBridge采用云原生事件标准CloudEvents来描述事件,后者作为云原生事件的事实标准,可以保证EventBridge使用的通用性,用户也无需担心厂商锁定,可以便捷地在同样支持CloudEvents的云服务间进行迁移。
事件总线
事件总线负责接收来自事件源的事件,是EventBridge中事件的载体。目前EventBridge的事件总线类型包含以下2类:
云服务专用事件总线:一个无需创建且不可修改的内置事件总线,用于接收阿里云官方事件源的事件。阿里云官方事件源的事件只能发布到云服务专用总线。
自定义事件总线:用户自行创建并管理的事件总线,用于接收自定义应用或存量消息数据的事件。自定义应用或存量消息数据的事件只能发布到自定义总线。
事件源
事件源即为事件的来源,事件源生产事件并将其发布到事件总线。目前EventBridge支持的事件源类型也分为2类:
阿里云官方事件源:此类事件源已由EventBridge集成,只要开通相应的阿里云服务,就可以自动接入事件总线EventBridge。通过配置预定义的事件源、事件类型和事件目标,轻松完成从事件源发布事件到云服务专用总线,经过事件模式过滤后把事件路由到事件目标的流程。
自定义事件源:用户在使用自定义事件源时,可以使用EventBridge提供的官方SDK,将事件发布到自定义事件总线,也可以配置事件提供方把事件主动拉取到事件总线EventBridge。当然,也可以使用本文中提到的HTTP Source,通过请求webhook的方式来将事件发布到EventBridge。
事件规则
事件规则用于过滤和转换事件。事件源按照云原生事件标准CloudEvents发布事件到事件总线,在事件到达事件总线之后,用户可以使用事件规则中的过滤功能来提取事件中的部分信息,也可以使用事件规则中的转换功能将CloudEvents标准事件转换为事件目标能接收的事件类型。
事件目标
事件目标是事件的处理终端,负责消费事件。
3. HTTP Source事件源
接入EventBridge应用有多种情况:用户自定义应用、阿里云服务、其他云厂商服务或者其他SaaS产品。对于用户自定义应用,用户可以使用EventBridge官方的HTTP接口、多语言客户端以及CloudEvents社区的开源客户端来完成接入。至于其他类型,其接入方式也存在区别。对于阿里云的云产品,EventBridge原生支持,用户可以在默认事件总线中选择对应的云产品与其相关的触发事件。而对于其他云厂商、SaaS产品,EventBridge将提供便捷的接入方式便于用户进行集成,HTTP Source事件源便是一种典型的接入方式。
具体而言,HTTP Source事件源是EventBridge支持的事件源的一种,它以webhook形式暴露了发布事件的接口,用户可以在有URL回调的场景配置HTTP Source事件源,或者直接使用最简单的HTTP客户端来完成事件的发布。HTTP Source事件源提供了支持HTTP与HTTPS,公网与阿里云VPC等不同请求方式、不同网络环境的webhook URL,便于用户将其集成到各类应用中,接入时无需使用客户端,仅需保证应用可以访问到对应webhook URL即可,这使得接入过程变得简单而高效。
在将HTTP请求转换为CloudEvent的时候,EventBridge会将请求的头部和消息体部分置于CloudEvent字段中,其余字段会依据用户EventBridge资源属性以及系统默认规则进行填充。用户可以在事件规则中,对所需的内容进行过滤、提取,最终按照模板拼装成所需的消息内容投递给事件目标。
HTTP Source事件源目前支持3种类型的安全设置,分别是请求方法、源IP以及请求来源域名。
请求方法:用户可以配置当前请求此事件源时合法的HTTP 请求方法,如果方法类型不满足配置规则,请求将被过滤,不会投递到事件总线。
源IP:用户可以设置允许访问此事件源时合法的源IP(支持IP段和IP),当请求源IP不在设置的范围内时,请求将被过滤,不会投递到事件总线。
请求来源域名:即HTTP 请求的referer字段,当请求的referer与用户配置不相符时,请求被过滤,不会投递到事件总线。
4. 最佳实践
下面我们将介绍几种使用EventBridge HTTP Source构建SaaS应用集成的最佳实践。
钉钉监控GitHub代码推送事件
GitHub提供了webhook功能,代码仓库在发生某些特定操作(push、fork等)时,可以通过回调来帮助用户完成特定功能。针对多人开发的项目,将GitHub事件推送到特定钉钉群可以帮助成员有效关注代码变更,提高协同效率。
本节我们展示如何通过钉钉监控GitHub代码推送事件的最佳实践,主要包含以下几个步骤:
创建一个钉钉机器人;
创建EventBridge相关资源:事件总线、事件源(HTTP Source类型)、事件规则、事件目标(钉钉);
选择GitHub代码仓库创建webhook;
向GitHub代码仓库推送代码变更;
钉钉群接收此次代码推送相关信息。
1.创建钉钉机器人
参考钉钉官方文档,创建一个群机器人。创建群机器人时,安全设置请勾选“加签”并妥善保管密钥和稍后生成的机器人webhook地址。
2.创建EventBridge相关资源
创建EventBus事件总线。
创建事件源。事件源配置完成之后,点击跳过,我们接下来会专门配置事件规则与目标。
创建完成后,进入事件源详情页,保存刚刚生成的webhook URL。
在EventBridge控制台页面点击进入刚刚创建的EventBus详情页,在左侧一栏中“事件规则”选择“创建规则”。
创建事件目标。选择钉钉,并将钉钉机器人的webhook地址和密钥填入,推送内容侧可以按照需求设计。
我们填写模板变量为:
{ "repo": "$.data.body.repository.full_name", "branch": "$.data.body.ref", "pusher": "$.data.body.pusher.name" }
模板为:
{ "msgtype": "text", "text": { "content": "Github push event is triggered. repository: ${repo}, git reference: ${branch}, pusher: ${pusher}." } }
3.在GitHub代码仓库创建webhook
登录GitHub,在GitHub代码仓库“setting”中选择左侧“Webhooks”,选择新建webhook。
在创建webhook的配置项中填入HTTP Source事件源的webhook地址,Content type部分选择“application/json”,下方触发事件类型选择“Just the push event.”,随后点击“Add webhook”,创建完成。
4.向GitHub代码仓库推送代码变更
本地仓库做一定变更,commit后推送GitHub。
5.钉钉群接收此次代码推送相关信息
阿里云云监控报警驱动Kubernetes Service
在基于EventBridge和容器服务构建云原生事件驱动程序最佳实践中,作者展示了EventBridge如何实现事件驱动Kubernetes Service。在本章节我们更进一步,将阿里云SLS报警与Kubernetes Service集成起来,实现业务针对报警信息做出响应的场景。主要包含以下几个步骤:
创建Deployment与Service;
创建EventBridge相关资源;
创建阿里云SLS监控报警;
触发报警,观察K8s资源响应。
1.创建Deployment与Service
这里可以参考基于EventBridge和容器服务构建云原生事件驱动程序最佳实践中的实现,完成配置后记录好Service的服务地址。
2.创建EventBridge相关资源
为了减少不必要的描述,EventBridge相关资源创建可以参考上面的描述。
创建事件目标时,服务类型选择“HTTP”,URL部分填写上面的Service服务地址。
3.创建阿里云SLS监控
3.1 新建或者选择已有Project、Logtail和日志采集。
创建这些SLS资源可以参考SLS产品文档。
3.2 创建内容模板
在发送内容部分可以填写必要的报警信息,示例中填写内容如下:
{ "aliuid": "${aliuid}", "alert_instance_id": "${alert_instance_id}", "alert_id": "${alert_id}", "alert_name": "${alert_name}", "region": "${region}", "project": "${project}", "logstore": "${results[0].store}", "alert_time": "${alert_time}" }
3.3 配置行动策略
在“SLS-告警中心-告警管理-行动策略”中新建行动策略。
渠道选择“Webhook-自定义”,请求地址填入HTTP Source webhook地址,请求头中添加“Content-Type: application/json”,内容模板选择我们上面创建的内容模板。
3.4 创建报警规则
参考SLS文档创建报警规则,在“告警策略”中选择我们上面创建的行动策略。
4.触发报警,观察K8s资源响应
SLS侧监控报警配置完成之后,当触发报警规则时可以在EventBridge控制台看到对应事件的推送轨迹,也可以在Pod日志中看到对应的推送内容。
异步消费监控报警信息
业务上存在异步消费报警信息的场景,例如报警内容备份,根据报警频率自适应调整报警阈值等。而且对于多云业务的用户,如何将跨云服务的报警信息整合起来也是一个麻烦的问题。依托HTTP Source,用户可以将不同云厂商(腾讯云、华为云等)、不同监控产品(Grafana、Zabbix、Nagios等)统一集成到EventBridge平台,以便于实现对报警信息的异步消费。
本节我们介绍如何使用EventBridge集成Grafana,实现异步消费监控报警信息。Grafana是一款开源数据可视化工具,也同时具有监控报警功能,具体使用可以参阅Grafana官方文档。本节主要包含以下步骤:
创建MNS队列;
创建EventBridge相关资源;
Grafana上配置webhook;
测试接收结果。
1.创建MNS队列
在MNS控制台,选择“队列列表-创建队列”。
2.创建EventBridge相关资源
同上文所述,这里仅示例创建事件目标时相关配置。
3.Grafana上配置webhook
点击Grafana控制台左侧“Alerting-Notification channels”,选择“Add channel”。
在“type”一栏中选择“Webhook”,url填写HTTP Source事件源的Webhook地址,点击下方“Test”。
4.测试接收结果
登录MNS控制台,进入队列详情页,点击页面右上角“收发消息”,可以看到MNS已经接收到刚刚Grafana发送的消息。
点击对应消息详情可以看到消息内容,说明消息已经被成功消费。
5. 总结
本文介绍了EventBridge的新特性:HTTP Source事件源。作为一款无服务器事件总线服务,EventBridge已经将阿里云云产品管控链路数据、消息产品业务数据整和到事件源生态中,提高了上云用户业务集成的便捷性,OpenAPI与多语言SDK的支持,为客户自身业务接入EventBridge提供了便利。在此基础之上,HTTP Source事件源更进一步,以Webhook形式开放了针对了其他云厂商、SaaS应用的集成能力,用户无需代码改动,仅需要简单配置即可完成EventBridge集成操作,在扩大事件源生态的同时也可以吸引更多潜在客户,提升产品竞争力。