基於 ASK + EB 構建容器事件驅動服務
作者:冬島、肯夢
導讀
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-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] 建立叢集文件
[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