概述
webhook 是一种基于 HTTP 的回调函数,可在 2 个应用编程接口(API)之间实现轻量级的事件驱动通信。许多种类的应用使用 webhook 来从其他应用接收少量数据,但 webhook 也可用于在 GitOps 环境中触发自动化工作流。
Webhook 用于应用开发
什么是 API?
API 由一组定义和协议组合而成,可用于构建和集成应用软件。有时我们可以把 API 之间的通信当做信息用户和信息提供者之间的合同——建立消费者(呼叫)所需的内容和制作者(响应)要求的内容。这种关系也可描述为客户端应用调用服务器应用,但两种角色可以相互颠倒,具体取决于所给情景中是哪个应用在请求数据。
Web API 通常使用 HTTP 从其他应用请求数据并定义响应报文的结构,其通常采用 XML 或 JSON 文件的格式。XML 和 JSON 都是首选格式,因为它们会以易于其他应用操纵的方式来呈现数据。
当客户端 API 从服务器 API 请求数据时,它会通过调用来了解是否发生了特定的事件,即服务器的数据是否发生了可能对客户端有用的改变。在这个过程(称为轮询)中,客户端以固定间隔发送 HTTP 请求,直到服务器 API 发送相关的数据,此数据有时称为有效负载。
客户端应用不知道服务器应用的状态,因此会轮询服务器 API 来获取更新,不断调用到发生特定事件为止,但服务器只会在信息可用时发送所请求数据。客户端应用必须一直索取更新,并等待到相关事件发生为止。
Webhook 与 API 的区别是什么?
为了设置 webhook,客户端向服务器 API 提供唯一 URL,并指定它想要知道的事件。设置 webhook 后,客户端不再需要轮询服务器;发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL。
Webhook 通常被称为逆向 API 或推送 API,因为它们让通信责任落在了服务器而不是客户端身上。不再是客户端发送 HTTP 请求来索取数据,直到服务器响应为止,而是服务器等到数据可用时向客户端发送一个 HTTP POST 请求。虽然有这样的昵称,但 webhook 不是 API;两者相互配合。应用必须具有 API 才能使用 webhook。
如何理解 Webhook 的概念?
名称 webhook 是 web(指明其是基于 HTTP 的通信)与 hooking 编程函数(允许应用截获调用或可能感兴趣的其他事件)这两者的简单组合。Webhook 钩住服务器应用上发生的事件,并提示服务器通过 web 将有效负载发送给客户端。Jeff Lindsay 在 2007 年发表的题为《Webhook 革新 Web 世界》的博客文章,帮助推广了这一概念。
IT 团队使用各种方法来保护通过 webhook 通信的应用。大多数支持 webhook 的应用会将一个机密密钥添加至有效负载的请求标头中,以便客户端能够确认服务器的身份。Webhook 通常使用相互传输层安全(mTLS)身份验证进行保护,在有效负载被发送之前对客户端和服务器进行验证。此外,客户端应用往往将 SSL 加密用于 webhook URL,确保传输的数据保持私密。
Webhook:
- 消除轮询的必要。 这为客户端应用节省了资源。
- 设置轻松快捷。如果应用支持 webhook,就能通过服务器应用的用户界面进行设置。在这里,客户端输入其应用的 webhook URL ,并设置一些基本参数,例如它们对哪些事件感兴趣。
- 自动传输数据。服务器应用上发生指定的事件时,就会立即发送有效负载。此交换由事件发起,因此发生速度与数据从服务器传输到客户端一样快,实时性可以媲美任何数据传输。
- 适合特定的轻量级有效负载。Webhook 依靠服务器来确定所发送的数据量,让客户端去解译有效负载并以高效的方式加以使用。由于客户端不控制数据传输的确切时间或大小,webhook 能够处理 2 个端点之间的少量信息,这些信息通常采用通知形式。
Webhook 用于基础架构开发
Webhook 最常用于简化两个应用之间的通信,但也可用于自动化基础架构即代码(IaC)工作流并启用 GitOps 实践。
什么是基础架构即代码(IaC)?
基础架构即代码(IaC)是通过代码(而非手动流程)来管理和置备基础架构的方法。版本控制是 IaC 的一个重要组成部分,就像其他任何软件源代码文件一样,配置文件也应该在源代码控制之下。以基础架构即代码方式部署还意味着基础架构可被划分为若干模块化组件,然后通过自动化以不同的方式进行组合。
借助 IaC 实现基础架构置备的自动化,意味着开发人员无需再在每次开发或部署应用时手动置备和管理服务器、操作系统、存储及其他基础架构组件。将基础架构进行代码化可以提供在置备时参照的模板。这依然可以手动完成,但也可利用企业级期望状态引擎(如红帽® Ansible® 自动化平台)对这些流程进行自动化。
什么是 GitOps?
GitOps 常被视为 IaC 的一种演进,是一套使用 Git 来管理基础架构和应用配置的战略性实践,而 Git 指的是一种开源版本控制系统。遵循 GitOps 实践时,开发人员将 Git 用作声明性基础架构和应用的单一数据源,并使用 Git 拉取请求来自动管理基础架构的置备和部署。Git 存储库包含系统的全部状态,因此系统状态的修改记录既可查看也可审计。
Webhook 的作用是什么?
Webhook 减少了实施和管理以 git 为中心的部署管道所需的步骤,并可用于自动启动完整的 IaC 工作流。在 GitOps 环境中,webhook 发挥的作用与它在 2 个应用之间所扮演的角色相同;由指定的事件触发时,一个 API 会将有效负载发送至另一个 API。区别在于触发 webhook 的事件的类型,以及接收方对有效负载的处理。
在这一背景中,git 存储库扮演服务器应用的角色,而期望状态引擎(负责管理基础架构状态)则扮演客户端应用的角色。通过设置 webhook,即可在每当存储库中出现更改时触发通信。例如,如果一段代码得到更新并被推送到 Git 存储库,这个事件就会触发相应的 webhook。接着,存储库自动将有效负载发送到期望状态引擎的 webhook 地址,以告知代码更改。
通过这种方式使用 webhook,期望状态引擎可以密切关注任何基础架构更改,而不必主动去监控存储库。如果期望状态引擎也支持自动化,那么可以使用 webhook 来触发 IaC 工作流。例如,对于红帽 Ansible 自动化平台等企业级期望状态引擎,系统管理员可以使用 webhook 来部署受管主机上的最新更改。
红帽能为您做些什么?
红帽® Ansible® 自动化平台中内置了自动化 Webhook,可以为开展 IaC 和 GitOps 实践提供支持。借助 Ansible 自动化平台,Webhook 可以通过 GitHub 或 GitLab 等服务实现原生集成 Git 存储库。一旦建立了存储库链接,Ansible 自动化平台就会从 Git 系统中捕获 Git 提交,并使用这些事件来触发自动化作业,以更新项目、管理库存和执行部署。
借助自动化 webhook,您可以在源代码控制系统中发生事件时自动激活自动化工作流。这样一来,便不再需要 Jenkins 等其他 CI/CD 工具来监控存储库并在变更的同时启动自动化作业,不仅简化 GitOps 工作流,也简化了运维。红帽 Ansible 自动化平台可与各种开发和部署工具配合使用,因此您可使用会首选的工具和流程来定制 GitOps 工作流。