作者:​冬岛、​肯梦​

导读

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

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

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

服务架构

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

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

用到的云服务:

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

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

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

场景实践

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

OSS 资源配置

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

zip:放置需要解压的zip包

unzip:放置解压后的文件

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

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

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

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

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

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

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

  • 点击「添加权限」。

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

ASK 资源配置及代码解析

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

1)创建 ASK 集群

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

  • 选择 ASK 集群

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

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

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

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

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

2)部署解压服务

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

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

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

  • 把下面的 YAML 内容提交上去,注意 OSS_ACCESSKEYID 和 OSS_ACCESSKEYSECRET 这两个环境变量需要设置成你的 ak、sk,并且需要有从 OSS 下载、上传文件的权限。然后点击创建,即可完成服务的创建。
---
apiVersion: apps/v1
kind: Deployment
metadata:name: eb-ask-demo
spec:selector:matchLabels:app: eb-ask-demotemplate:metadata:labels:app: eb-ask-demospec:containers:- name: eb-ask-demoimage: "registry.cn-hangzhou.aliyuncs.com/kubeway/demo-ossunzip:v0.0.1-20211218152144_master_37323b1"resources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 8080env:- name: OSS_ACCESSKEYIDvalue: "ak"- name: OSS_ACCESSKEYSECRETvalue: "sk"- name: OSS_ENDPOINTvalue: "oss-cn-hangzhou.aliyuncs.com"
  • 解压服务源代码可在 github [5] 获取。

3)获取到服务暴露 URL

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

EB 资源配置

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

  • 配置云服务总线

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

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

{"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 ),点击完成即可完成总线配置。

效果验证

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

  • 准备 zip 文件

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

  • 上传 zip 文件

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

  • 点击「上传文件」。

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

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

  • 点击「上传文件」。

  • 文件很快就上传成功。

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

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

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

优势及总结

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

  • 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​​

基于 ASK + EB 构建容器事件驱动服务相关推荐

  1. 五、基于github+阿里云容器镜像服务进行docker部署

    将代码(jar包)托管在github上,使用阿里云容器镜像服务绑定github上的源代码,实现github上发生变更时,阿里云自动构建镜像,docker从阿里云拉取最新镜像并运行,关系如下: 本例主要 ...

  2. 基于nerdctl + buildkitd构建容器镜像,运行tomcat后端服务和nginx前端服务

    目录 简介: 一.部署buildkitd 1.下载二进制包 2. 解压二进制包,并移到全局变量中 3.创建socket文件,service文件 4.启动服务 二.使用nerdctl命令测试镜像构建 1 ...

  3. [译] 基于事件流构建的服务

    [译] 基于事件流构建的服务 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 原文:https://www.confluent.i ...

  4. 详解如何使用Istio监控基于容器的服务

    https://www.itcodemonkey.com/article/5617.html 来自:高效开发运维(微信号:DevOpsGeek),无明 译,作者:Fred Moyer 我们应该监控服务 ...

  5. docker构建容器服务

    文章目录 构建容器服务 构建sshd容器服务步骤 构建systemctl容器服务步骤 容器开启ssh 配置systmctl docker容器中配置nginx docker容器中配置tomcat doc ...

  6. 使用Spring 3.1和基于Java的配置构建RESTful Web服务,第2部分

    1.概述 本文介绍了如何在Spring中设置REST –控制器和HTTP响应代码,有效负载编组配置和内容协商. 2.在Spring了解REST Spring框架支持两种创建RESTful服务的方式: ...

  7. jersey tomcat MySQL_基于jersey和Apache Tomcat构建Restful Web服务(一)

    基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...

  8. jib构建镜像(使用阿里云容器镜像服务拉取镜像)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhangjingao/article/details/83542452 jib的基本使用(使用阿里云 ...

  9. 基于阿里云容器镜像服务加速K8S镜像下载

    简单说明: 部署K8S最大的难题是镜像下载 可以使用阿里云容器镜像服务由海外机器构建 国内同时可以使用阿里云的镜像加速器加速镜像下载 仅需要将含有相关镜像的Dockerfile提交到阿里云即可 申请云 ...

最新文章

  1. 北科院分子互作实战专题培训班(10月底/11月底班)(生物医药与营养健康协同创新中心)...
  2. 一文聊透 Dubbo 优雅停机
  3. table1函数----一维查表
  4. C#枚举中的位运算权限分配浅谈
  5. 微信公众平台向特定用户推送消息
  6. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)
  7. 《Nginx文件类型错误解析漏洞--攻击演练》 (转)
  8. 200813_C指针
  9. SecureCRT SSH 语法高亮
  10. Linux学习总结(72)——Linux系统安全加固
  11. 地面指示标志_消防应急照明与疏散指示系统的设计和施工安装规范,收藏学习!...
  12. 好用的MessageFormat类
  13. qt 无框dockwidget_QT解决通过菜单方式无法让QDockWidget 显示和隐藏
  14. NeHe OpenGL第九课:移动图像
  15. 题目29 英文输入法单词联想
  16. Excel中VBA合并工作表
  17. 【FXCG】什么是风险?
  18. html自动全屏js,js实现简单页面全屏
  19. Arcgis填补栅格空缺值Nodata
  20. C#根据IP地址查询所属地区(调用免费的IP查询接口)

热门文章

  1. 7、CSS 属性选择器
  2. 11、流程控制语句详解,IF,CASE,LOOP,LEAVE, ITERATE,REPEAT,WHILE
  3. bs4之标签树的下行遍历
  4. 还觉得linux命令难吗,看这篇2w多字的linux命令详解,通俗易懂
  5. C语言指针和二维数组
  6. Quartz表达式触发
  7. ubuntu获取root权限_群辉 SSH 获取 root 权限
  8. 【Java】6.3 类成员
  9. 10000 字讲清楚 Spring Boot 注解原理
  10. 死磕 synchronized 底层实现