基于 ASK + EB 构建容器事件驱动服务
简介:本篇文章以“在线文件解压场景”为例为大家展示经典 EDA 事件驱动与容器如何搭配使用。
作者:冬岛、肯梦
导读
EDA 事件驱动架构( Event-Driven Architecture ) 是一种系统架构模型,它的核心能力在于能够发现系统“事件”或重要的业务时刻(例如交易节点、站点访问等)并实时或接近实时地对相应的事件采取必要行动。那么 EDA + 容器能擦出怎样的火花呢?本篇文章将带领大家一起在云上借助 ASK 容器服务 + EB 能力构建一套完整的事件驱动架构。
本篇文章以“在线文件解压场景”为例为大家展示经典 EDA 事件驱动与容器如何搭配使用。
服务架构
在线文件解压以 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-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
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 构建容器事件驱动服务的更多相关文章
- docker compose服务编排简介、基于发布包构建多个webapi容器 和 基于镜像实现Nginx反向代理webapi
一. docker compose服务编排简介 1. 背景 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大: A. 要创建镜 ...
- 基于Dubbo框架构建分布式服务
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- [转载] 基于Dubbo框架构建分布式服务
转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...
- 基于容器微服务的PaaS云平台设计(一) 实现容器微服务和持续集成
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 前言:关于什么是容器微服务PaaS和容器微服务PaaS的 ...
- 基于jersey和Apache Tomcat构建Restful Web服务(一)
基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- 字节跳动基于Apache Hudi构建EB级数据湖实践
来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...
- 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)
原文:Building Microservices On .NET Core – Part 1 The Plan 时间:2019年1月14日 作者:Wojciech Suwała, Head Arch ...
- 基于jib-maven-plugin快速构建微服务docker镜像
一.说明 本文介绍基于 Maven 插件 jib-maven-plugin 实现快速构建 Spring Boot 程序镜像,并推送到远程仓库中,且 无需安装 Docker 环境 . Jib 是 Goo ...
- 基于Dubbo框架构建分布式服务(一)
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
随机推荐
- 微信小程序开发:异步处理接入的生成式图像卡通化
书接上文,我们完成了对接阿里云人像动漫化接口,现已完成的界面是这样的: 就是效果看着一般,看看效果: 然后我就在阿里云api市场转悠,就想看看还有没有什么其他奇奇怪怪的api,结果就发现了这个: ap ...
- HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(1) --- 环境搭建
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 3DCAT首届行业生态交流会|升大科技CEO邱杰:5G云渲染助力企业培训
2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕 .此次活动围绕"云XR ...
- 在Centos7上安装Redis6
一.背景 Redis是一个非常流行的NOSQL数据库,拥有的数据类型非常丰富,此处我们简单记录一下在Centos7上是如何安装Redis6的.Redis的安装是推荐使用源码进行安装的. 二.安装步骤 ...
- KingbaseES参数track_activity_query_size介绍
背景 同事A在客户现场,最近注意到客户的主数据库性能有所下降,尤其是在高峰时段.怀疑可能有一些复杂的查询影响了数据库的性能,但尚未确定具体是哪些查询. 为了诊断问题,A决定查看高峰期正在执行的查询,先 ...
- KingbaseES V8R6集群运维系列 -- 修改ssh通信为 sys_securecmdd 通信
一.适用于: 本文档使用于KingbaseES V008R006版本. 二.关于SYS_SECURECMDD: sys_securecmdd是KingbaseES集群自带的工具,集群监控.管理集群时通 ...
- 渗透项目1-GoldenEye
靶机地址:https://www.vulnhub.com/entry/goldeneye-1,240/ 靶机难度:中等(CTF) 目标:得到root权限&找到flag.txt 信息收集 收集目 ...
- python [pymysql] 操作MySQL数据库
python [pymysql] 操作MySQL数据库 连接.关闭数据库 def get_conn_(): """ :return: 连接,游标 "" ...
- Python企业面试题1 —— 基础篇
1. b.B.KB.MB.GB的关系? b ---- 位(bit) B ---- 字节(一个字节等于8位) 1 B = 8 bit 1 KB = 1024 B 1 MB = 1024 KB 1 GB ...
- 前端使用 Konva 实现可视化设计器(1)
使用 konva 实现一个设计器交互,首先考虑实现设计器的画布. 一个基本的画布: [展示]网格.比例尺 [交互]拖拽.缩放 "拖拽"是无尽的,"缩放"是基于鼠 ...