OpenWhisk 是一个开源的、事件驱动的计算平台。
在上一篇文章中,我介绍了一个微服务架构,它使用队列、发布/订阅频道或消息中心来排列“工作”列表。 每个工作项都是一个数据块,将以某种方式(通常是 JSON 文档)进行处理、保存或操作。 我使用 Redis、RabbitMQ 或 Apache Kafka 创建了一个指标收集器微服务,用于从移动或 Web 应用程序收集 Web 指标数据,并将其写入队列或发布/子通道。
另一个指标收集器存储微服务使用的收集数据,并将其写入 Cloudant、MongoDB 或 Elasticsearch 选项。 然后,我向您展示了如何添加其他微服务,以便在流数据传入时对其进行聚合。 幸运的是,作曲IO 支持部署 Redis、Rabbimq、MongoDB 或 Elasticsearch,IBM 提供 Cloudant 和 Apache Kafka 即服务,因此很容易上手,但有很多变化的部分。
今天,我正在使用一项新服务 OpenWhisk,它简化了微服务的部署,无需管理自己的消息传递或部署自己的工作服务器。
OpenWhisk 是一个开源的、事件驱动的计算平台。 您可以将操作发送到 OpenWhisk,然后提供要由 OpenWhisk 处理的数据流。 OpenWhisk 处理处理工作负载所需的计算资源的扩展; 您只需要处理操作**和触发这些操作的数据。 您只需为已完成的工作量付费,而不必为等待工作的闲置服务器付费。
您可以在 jAscript 或 Swift 中编写操作。 这意味着 Web 开发人员和 iOS 开发人员可以使用相同的语言来创建服务器端和前端。
本文中提供的部分和命令行调用假定您已在 IBM Cloud(以前称为 Bluemix)(现在更名为 IBM Cloud Functions,基于 Apache OpenWHISK)中注册了 OpenWHISK beta 计划,并且您已经安装了“WSK”命令行工具。 请访问我们创建一个名为“hello”的文件。js 的 j**ascript 文件,其中包含一个返回简单对象的函数:
function main()
这是最简单的 OpenWhisk 操作; 它只返回一个静态字符串作为有效负载。 使用以下命令将操作部署到 openwhisk:
> wsk action create hello hello.jsok: created action hello
这将创建一个名为“hello”的操作来运行 hellojs的。 我们可以使用以下命令在云中运行它:
> wsk action invoke --blocking hello
我们也可以要求我们输入一些参数:
function main(params) ;
然后更新我们的操作:
> wsk action update hello hello.jsok: created updated hello
使用参数运行我们的 **:
> wsk action invoke --blocking --result hello --param name 'jennie' --param place 'the block'
我们创建了一个简单的 j**ascript 函数来处理一些数据,而不必担心队列、员工或任何网络基础设施,并且我们能够在 OpenWhisk 平台上做到这一点。
我们可以在操作中做更复杂的事情,比如做 API 调用。 我创建了以下操作,该操作调用包含《权力的游戏》数据的简单搜索服务实例,并传入 q 参数:
var request = require('request');function main(msg) ,json:true}request(opts, function(error, response, body) )return whisk.async();
我们可以创建这个动作,并给它一个不同的名称:
> wsk action create gameofthrones gameofthrones.jsok: created action gameofthrones
然后用参数 q 调用它;
> wsk action invoke --blocking --result gameofthrones --param q 'melisandre',"gender":},"from_cache":true,"rows":"total_rows":1}}
我们可以在 OpenWhisk 操作中执行的另一个任务是在 Slack 中发布消息。 Slack 有一个很好的 API 来创建自定义集成:Slack 管理员可以设置一个“传入 Webhook”,这样他们就可以通过简单地向 HTTP 端点发送 POST 请求来将字符串发布到频道。 我们可以用几行创建 Slack 发布操作:
var request = require('request');function main(msg) )json:true}request(opts, function(error, response, body) )return whisk.async();
将“我的自定义 Slack Webhook URL”替换为 Slack 在创建“传入 Webhook”集成时创建的 Webhook URL。 请注意,此操作是异步执行的,并且仅在请求完成时回收。
然后,我们可以像往常一样部署和运行它:
> wsk action create slack slack.jsok: created action slack
> wsk action invoke --blocking --result slack --param text'you know nothing, jon snow'
碰巧的是,Whisk 有一个内置的 Slack 集成,但你自己构建一个对您来说也不错,不是吗? 然后,您可以执行自己的逻辑,根据传入的数据决定是否发布 Slack 消息。
将自己的自定义操作写入 Cloudant 相对简单,因为您可以:
Cloudant Node 的“要求”js 库使用 Cloudant 的 HTTP API 将数据写入 Cloudant 这种方法的缺点是您需要将 Cloudant 凭据硬编码到操作中,就像我们在上一个示例中硬编码 Slack webhook URL 一样,这不是最佳实践。
幸运的是,OpenWhisk 有一个预构建的 Cloudant 集成,您无需任何自定义即可调用它**。 如果您已经拥有 Cloudant 帐户,则可以使用以下命令行授予对 Cloudant 服务的访问权限:
> wsk package bind /whisk.system/cloudant mycloudant -pusername 'myusername' -p password 'mypassword' -p host'mydomainname.cloudant.com'
然后,您可以查看 OpenWHISK 可以与之交互的连接列表:
> wsk package listpackages/[email protected]_dev/mycloudant private binding
其中[email protected] 是我的 IBM Cloud 用户名(或您的 IBM Cloud 组织的名称),Dev 是您的 IBM Cloud 空间。
您可以调用包的 write 命令将数据写入 cloudant:
> wsk action invoke /[email protected]_dev/mycloudant/ write --blocking --result --param dbname testdb --param doc ''
到目前为止,我们已经创建并更新了 openwhisk 操作,并且我们还触发了每个操作以将任务作为一组命令执行。 “wsk”工具允许您触发一些操作,在后台运行它们,还允许您将操作链接在一起以形成序列,但我们不打算在本文中介绍这一点。
我们是一个简单的 j**ascript 块,其中只调用“main”函数。 这意味着我们可以使用常见的自动化测试和持续集成工具来测试我们的。 部署只需要一个命令行语句; 无需担心服务器、操作系统或网络硬件。
OpenWhisk 是一个事件驱动的系统。 你已了解如何通过手动部署**来创建事件。 但是我们如何设置 OpenWhisk 来处理事件流呢?
OpenWhisk 中的触发器是触发事件和执行 ** 的另一种方式。 我们可以创建一些指定的触发器,然后创建一些规则来定义要对哪些触发器执行哪些操作(而不是直接调用操作,我们将调用触发器; 为这些触发器定义的规则决定了要执行的操作。 这允许我们将操作链接在一起,允许触发器触发多个操作的执行,还可以通过将其分配给多个触发器来重用相同的操作。
触发器可以单独触发,也可以与外部源关联触发,例如:
来自 cloudant 数据库的更改源 - 每次添加、更新或删除文档时,都会触发一个触发器 GitHub 存储库提交源 - 每次提交时,都会触发一个触发器,因此我们可以使用 cloudant 数据库触发触发器,以便将一些数据写入 Slack:
> wsk trigger create mycloudanttrigger --feed /[email protected]_dev/ mycloudant/changes --param dbname mydb --param includedocs true
然后配置该触发器以触发我们的 Slack 发布操作:
> wsk rule create --enable myrule mycloudanttriggerslack
现在,每次在 Cloudant 数据库中添加、更新或删除文档时,都会触发我的自定义操作,在这种情况下,它会向 Slack 发布一条消息!
OpenWhisk 适用于您不想管理任何基础设施的项目。 您只需为您所做的工作付费,而不会在闲置的服务器上浪费金钱。 OpenWhisk 易于管理活动峰值,因为它可以横向扩展以满足该需求。
将 OpenWHISK 与其他即服务数据库(如 Cloudant)结合使用,因此您不必管理任何数据存储基础设施。 Cloudant 旨在存储大型数据集、处理高并发率并提供高可用性。
由于运行 OpenWhisk 操作需要资源,因此最好将 OpenWhisk 用于以下不常见的计算任务,例如:
处理上传的图像以创建缩略图,将它们保存到对象存储中,从移动应用程序获取地理位置数据,并调用天气 API 来增强它OpenWHISK 对于处理具有高并发性的系统也很有用,例如:
在将数据发送到云端时,还有一些我没有涉及的 OpenWHISK 功能,其中数据由移动应用程序存储和处理,例如 Swift 支持、使用 docker 容器作为操作而不是上传源的能力,以及移动 SDK。