基于 ASK + EB 构建容器事件驱动服务

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
容器镜像服务 ACR,镜像仓库100个 不限时长
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 本篇文章以“在线文件解压场景”为例为大家展示经典 EDA 事件驱动与容器如何搭配使用。

作者:冬岛、肯梦


导读


EDA 事件驱动架构( Event-Driven Architecture ) 是一种系统架构模型,它的核心能力在于能够发现系统“事件”或重要的业务时刻(例如交易节点、站点访问等)并实时或接近实时地对相应的事件采取必要行动。那么 EDA + 容器能擦出怎样的火花呢?本篇文章将带领大家一起在云上借助 ASK 容器服务 + EB 能力构建一套完整的事件驱动架构。


本篇文章以“在线文件解压场景”为例为大家展示经典 EDA 事件驱动与容器如何搭配使用。


关注【Apache RocketMQ】公众号,获取更多相关信息!


服务架构


在线文件解压以 EB OSS 事件通知为驱动点,架构方案如下:

1.png


EDA 架构的核心是对事件的应用,OSS 事件默认可以通过云服务总线完成采集,自定义通知事件。本场景是通过 EventBridge 把 OSS 上传文件的事件实时传递给 ASK 中的服务,然后 ASK 中的服务对上传的 ZIP 文件进行下载、解压和再次回传到 OSS。


用到的云服务:


  • ASK:Serverless 容器服务是一款基于阿里云弹性计算基础架构,同时完全兼容 Kubernetes 生态,安全、可靠的容器产品。


  • EB:EventBridge 事件总线是一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS 应用的事件接入,适用于轻松构建松耦合、分布式的事件驱动架构。


  • OSS:对象存储服务,提供海量、安全、低成本、高可靠的云存储服务。


场景实践


OSS、ASK 以及 EventBridge 三个云产品的操作步骤如下:


OSS 资源配置


  • 在 OSS 控制台创建相关地域的 Bucket,并记住 Bucket 路径信息。


2.png


image.gifzip:放置需要解压的zip包


unzip:放置解压后的文件


  • 创建一个可以操作 OSS  文件的用户,并生成 ak/sk 。


打开 RAM 控制台[1],点击「创建用户」。


3.png

image.gif

  • 输入「登陆名称」和「显示名称」并勾选 「Open API 调用访问」然后点击确定即可创建一个用户身份。


4.png

image.gif

  • 创建好账号以后再打开 RAM 控制台[1]能看到刚才创建的账号信息。


image.gif5.png


  • 点击账号名称,然后来到账号详情页面。点击「创建 AccessKey」。


6.png

image.gif

  • 然后就能生成 ak、sk 信息,如下所示。保存这两个关键信息,后面配置 ask 解压服务的时候需要使用,也可以点击「下载 CSV 文件」的方式下载下来保存。


7.png

image.gif

  • 有了 ask sk 还不行,要能访问 OSS 服务,还需要给这个子账号授予 OSS 的操作权限,点击「权限管理」。


8.png


  • 点击「添加权限」。


9.png


  • 在 「系统策略」中输入 OSS,然后勾选「AliyunOSSFullAccess」,点击确定即可完成对 OSS 的访问授权。


10.png


ASK 资源配置及代码解析


ASK(Serverless Kubernetes) 运行应用程序用于接受来自 EventBridge 发过来的关于 OSS 的事件,所以您首先需要创建一个 ASK 集群,然后部署解压服务。


1)创建 ASK 集群


  • 打开容器服务控制台[2]点击右上角的创建集群


11.png

image.gif

  • 选择 ASK 集群


填写集群名称,勾选最下面的《服务协议》,其他都使用默认配置然后就可以创建一个集群出来。


12.png

image.gif

  • 点击右上角的创建,开始创建集群。


13.png

image.gif

  • 弹出确认创建,确认没问题以后点击「确定」 即可开始创建。


14.png

image.gif

  • 等几分钟后集群即可创建完成。


15.png

image.gif

如果创建集群过程中遇到问题,可参考创建集群文档[3]解决,也可以通过群号 31544226 加钉钉群找答疑解决。


2)部署解压服务


  • 集群部署成功以后点击容器服务页面[4]可以看到刚刚创建的集群,然后点击集群名称调转到集群详情页面;


image.gif16.png


  • 在集群详情页面点击 「工作负载」中的「无状态」可以通过提交解压服务 YAML 的方式创建 Deployment 和 Service


17.png

image.gif

  • 点击右上角的「使用 YAML 创建资源」


image.gif18.png

19.png


  • 把下面的 YAML 内容提交上去,注意 OSS_ACCESSKEYID 和 OSS_ACCESSKEYSECRET 这两个环境变量需要设置成你的 ak、sk,并且需要有从 OSS 下载、上传文件的权限。然后点击创建,即可完成服务的创建。


---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: eb-ask-demo
spec:
  selector:
    matchLabels:
      app: eb-ask-demo
  template:
    metadata:
      labels:
        app: eb-ask-demo
    spec:
      containers:
      - name: eb-ask-demo
        image: "registry.cn-hangzhou.aliyuncs.com/kubeway/demo-ossunzip:v0.0.1-20211218152144_master_37323b1"
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8080
        env:
        - name: OSS_ACCESSKEYID
          value: "ak"
        - name: OSS_ACCESSKEYSECRET
          value: "sk"
        - name: OSS_ENDPOINT
          value: "oss-cn-hangzhou.aliyuncs.com"


  • 解压服务源代码可在 github[5] 获取。


3)获取到服务暴露 URL  


  • 服务部署好以后点击「网络」中的「服务」即可看到 eb-ask-demo 这个 Service,然后能看到 「外部端点」的地址。「外部端点」地址就是解压服务的地址,全路径是 http://121.43.97.107/unzip  


20.png

image.gif

EB 资源配置


EB 总线分为云服务总线和自定义总线,云服务总线用于接受云服务事件 E.g. OSS ,自定义总线用于接受自定义事件 E.g. 解压完成信息。


  • 配置云服务总线


21.png

image.gif

  • 配置事件模式,事件模式即事件的筛选规则,需认真配置,否则会造成循环触发。


更多事件模式说明[6]参考文末更多链接。


image.gif22.png


{
    "source": [
        "acs.oss"
    ],
    "type": [
        "oss:ObjectCreated:PostObject",
        "oss:ObjectCreated:UploadPart",
        "oss:ObjectCreated:PutObject",
        "oss:ObjectCreated:UploadPartCopy",
        "oss:ObjectCreated:InitiateMultipartUpload",
        "oss:ObjectCreated:AppendObject",
        "oss:ObjectCreated:CompleteMultipartUpload"
    ],
    "subject": [
        {
            "suffix": ".zip"
        }
    ],
    "data": {
        "oss": {
            "bucket": {
                "name": [
                    "eb-ask"
                ]
            },
            "object": {
                "key": [
                    {
                        "prefix": "zip/"
                    }
                ]
            }
        }
    }
}


  • 填写 ASK 暴露的 URL 地址(http://121.43.97.107/unzip ),点击完成即可完成总线配置。


23.png


效果验证


服务已经准备好了,现在找一个 zip 文件上传到 OSS 就能看到效果了。上传一个 zip 文件到 zip 目录以后应该能在 unzip 目录中看到解压后的文件。


  • 准备 zip 文件


您可以创建一个文本文件,然后压缩成 zip 格式。或者可以打开我们的示例程序Github 工程[7],下载此工程源码的 zip 文件,可以直接获得一个 zip 文件。


24.png


  • 上传 zip 文件


打开 OSS 控制台[8] ,选择配置好的 bucket,进入 zip 目录。
image.gif

  • 点击「上传文件」。


26.png

image.gif

  • 点击「扫描文件」,然后找到刚才下载的 zip 文件。


27.png

image.gif

  • 选择刚才下载的 zip 文件。


28.png

image.gif

  • 点击「上传文件」。


29.png

image.gif

  • 文件很快就上传成功。


30.png

image.gif

  • 现在打开 unzip 目录能看到解压后的文件已经上传上来了。


31.png

image.gif

  • 现在打开 EventBridge 控制台[9]查看事件轨迹。选择查看最近 5 分钟的事件。


32.png


  • 点击「事件轨迹」 能看到事件是通过 EventBridge 成功投递到了 ASK 暴露的解压服务上。


33.png

优势及总结


  • 基于该方案的事件驱动架构场景是高度松耦合且高度分布式的架构模型,事件的创建者(来源)只知道发生的事件,并不知道事件的处理方式,也不需要关心有多少相关方订阅该事件。


  • ASK + EB 可解决业务层大部分容器事件驱动的场景,通过 EB 解耦并针对具体事件进行分发。通过松耦合架构快速且灵活的上线业务组件,为企业提供更敏捷高效的容器业务部署方案。


参考资料


[1] RAM 控制台:

https://ram.console.aliyun.com/users


[2] 容器服务控制台

https://cs.console.aliyun.com/


[3] 创建集群文档

https://help.aliyun.com/document_detail/86377.htm?spm=a2c4g.11186623.0.0.350f3e068qu6bW#task-e3c-311-ydb


[4] 容器服务页面

https://cs.console.aliyun.com/#/k8s/cluster/list


[5] github

https://github.com/AliyunContainerService/serverless-k8s-examples/oss-unzip


[6] 更多事件模式说明:

https://help.aliyun.com/document_detail/181432.html


[7] 示例程序 Github 工程

https://github.com/AliyunContainerService/serverless-k8s-examples


[8] OSS 控制台

https://oss.console.aliyun.com/ 


[9] EventBridge 控制台

https://eventbridge.console.aliyun.com 


[10] zip 解压源代码

https://github.com/AliyunContainerService/serverless-k8s-examples/tree/master/oss-unzip


相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7天前
|
运维 监控 Devops
构建高效自动化运维体系:DevOps与容器化实践
【7月更文挑战第44天】在现代IT基础设施管理中,自动化运维已成为提升效率、降低成本、确保系统稳定性的关键。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系。我们将分析这一体系对提高软件交付速度、优化资源利用率以及增强系统可靠性的积极影响,并提供一系列实施策略和最佳实践,帮助企业实现运维自动化转型。
|
8天前
|
弹性计算 Kubernetes 开发者
利用容器化服务实现游戏服务器的动态资源配置
【8月更文第12天】在游戏行业中,用户基数的变化往往呈现出明显的波动性,特别是在推广活动期间,用户基数会显著增加,而在非推广期则会有所下降。为了应对这种变化,游戏开发者需要一种能够根据用户基数动态调整服务器资源的解决方案,以确保用户体验的同时最大限度地节省成本。容器化服务因其灵活的资源管理和成本控制能力,成为了理想的解决方案。
19 2
|
14天前
|
存储 Kubernetes 调度
通过重新构建Kubernetes来实现更具弹性的容器编排系统
通过重新构建Kubernetes来实现更具弹性的容器编排系统
33 8
|
22天前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化部署的实践
【7月更文挑战第29天】 在现代软件开发中,后端服务的构建不再仅仅是代码的堆砌,而是需要考虑到可扩展性、可靠性和快速迭代等多重因素。本文将探讨如何通过微服务架构和容器化技术来构建一个高效的后端服务系统。我们将从微服务的概念出发,分析其在后端开发中的应用优势,并结合容器化技术,特别是Docker和Kubernetes的使用,来展示如何在保证服务高可用性和伸缩性的同时,简化开发和部署流程。文章还将涵盖如何应对微服务架构下的数据一致性挑战,以及如何利用现代云平台资源来优化后端服务的性能和成本效益。
|
1月前
|
Ubuntu 网络协议 Android开发
使用ruri快速构建跨架构chroot容器
【7月更文挑战第3天】使用ruri在x86_64系统上构建arm64 Ubuntu容器的简要步骤: 1. 确认binfmt_misc支持,检查/proc/filesystems。 2. 安装qemu-user-static以模拟arm64指令。 3. 通过rootfstool脚本获取arm64的Ubuntu rootfs。 4. 下载最新版的ruri二进制文件。 5. 解压rootfs,将qemu-aarch64-static复制进去,用ruri启动容器。 6. 在容器内配置DNS(如设置resolv.conf)。 注意:需以root权限运行ruri,并根据系统环境调整步骤。
56 20
|
24天前
|
运维 Kubernetes 负载均衡
构建高效后端:微服务架构与容器化实践
【7月更文挑战第27天】在数字化浪潮的推动下,后端技术不断演进以满足日益增长的性能和可扩展性需求。本文深入探讨了微服务架构的设计原则、优势及其挑战,并结合容器化技术,分析了如何在现代软件开发中实现高效、灵活的后端系统。通过实际案例,我们揭示了微服务与容器化相结合的最佳实践,旨在为开发者提供一条清晰的技术路线图。
|
23天前
|
Shell 应用服务中间件 nginx
docker 服务,镜像,容器命令总结
docker 服务,镜像,容器命令总结
111 4
|
27天前
|
Ubuntu 网络协议 Android开发
使用ruri快速构建跨架构chroot容器
【7月更文挑战第10天】使用ruri快速构建跨架构chroot容器:先确认binfmt_misc支持;安装qemu-user-static;用rootfstool脚本获取rootfs;下载最新ruri二进制;解压rootfs并启动容器;配置DNS。完成这些步骤后,可在x86_64上运行arm64的Ubuntu容器。注意,ruri处于实验阶段,使用前需评估风险,并根据需求调整与优化。此流程提供基础参考,具体操作可能需微调。
|
1月前
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
24天前
|
存储 运维 Kubernetes
容器镜像的构建与管理实践
在云原生时代,容器技术已成为现代软件开发和运维不可或缺的一部分。本文将深入探讨容器镜像的构建流程、管理策略以及安全性考量,旨在为读者提供一套系统化的容器镜像管理方案。我们将从实际案例出发,分析容器镜像构建的最佳实践,同时指出常见的陷阱与误区。此外,文章还将介绍如何有效利用现有的工具和平台来提升容器镜像的安全性和管理效率,确保在快速迭代的开发周期中,能够维护镜像的一致性和可靠性。
43 0