基于 Kyma 的企业级云原生应用的扩展案例分享
什么是 Kyma?其官網(wǎng)的定義是,Kyma 是一個(gè)開源的云原生應(yīng)用開發(fā)平臺(tái)和運(yùn)行時(shí),底層基于 Kubernetes,借助一系列包括 Istio, NATS, Serverless 和 Prometheus 在內(nèi)的其他優(yōu)秀開源項(xiàng)目和組件,能夠開發(fā)、運(yùn)行和操作云原生應(yīng)用程序,支持對(duì)傳統(tǒng)的 On-Premises(本地部署)應(yīng)用程序和云原生應(yīng)用基于事件驅(qū)動(dòng)模式的松耦合擴(kuò)展。
本文分為兩部分,分別給大家介紹使用 Kyma 對(duì)本地部署的傳統(tǒng)應(yīng)用和企業(yè)級(jí)云原生應(yīng)用進(jìn)行擴(kuò)展的案例。
使用 Kyma 擴(kuò)展本地部署的 WordPress 應(yīng)用
WordPress 是一個(gè)基于 PHP 的開源內(nèi)容管理系統(tǒng),很多朋友喜歡使用 WordPress 搭建自己的個(gè)人博客網(wǎng)站。
設(shè)想這樣一個(gè)場(chǎng)景:某程序員是一個(gè)社交媒體達(dá)人,喜歡將自己的見聞經(jīng)歷,同步到 Twitter,Facebook,Youtube,微信等多個(gè)社交媒體上。手動(dòng)登錄一個(gè)個(gè)媒體平臺(tái)然后逐一更新狀態(tài),無疑是一件費(fèi)時(shí)費(fèi)力的事情。
還好我們是程序員,可以充分發(fā)揮自己的動(dòng)手能力。
假設(shè)我們自己的 WordPress 網(wǎng)站可以同 Kyma 連接,每當(dāng) WordPress 有新的動(dòng)態(tài)(比如一篇博客)發(fā)布時(shí),會(huì)給 Kyma 發(fā)送一個(gè) post.published 事件。Kyma 接收到該事件后,觸發(fā)注冊(cè)在該事件上的監(jiān)聽函數(shù),逐一調(diào)用社交媒體平臺(tái)的 API,創(chuàng)建對(duì)應(yīng)的動(dòng)態(tài)即可。
我們本地部署的 WordPress,扮演的就是下圖左邊 Business Solution 代表的角色。
安裝 Kyma for WordPress 的插件之后,我們能夠在 WordPress Settings 標(biāo)簽頁里,看到一個(gè)新的 Kyma Connector Settings 頁面,維護(hù) Kyma 實(shí)例的 url,登錄用戶名和密碼等信息。
在上圖 Kyma Connection 字段里維護(hù)的 url,會(huì)被 Kyma Application Connector 解析,并在 WordPress 和 Kyma 間建立互相信任的連接。
在 Kyma 控制臺(tái)創(chuàng)建一個(gè)新應(yīng)用,點(diǎn)擊 Connection Application 按鈕,把彈出的 url 維護(hù)到 WordPress Kyma Connection 字段。
如果把該 url 直接粘貼到瀏覽器里,可以看到以下內(nèi)容:
- csrUrl(Certificate Signing Request) 和 certificate:用來生成在 WordPress 和 Kyma 之間建立 SSL 連接所必需的數(shù)字證書
- api:Kyma Service Catalog 注冊(cè)的 endpoint
我們通過單步調(diào)式 WordPress 的方式,來深入了解 WordPress 與 Kyma 建立安全連接的技術(shù)細(xì)節(jié)。
WordPress 向傳入的 url 發(fā)起 HTTP GET 請(qǐng)求(下圖第 22 行代碼的 wp_remote_get),獲取到 CSR Certificate 和 API end point,存儲(chǔ)在第 32 行的變量 $body_json 內(nèi)。
第 73 行從變量 $body_json 的 csrUrl 字段拿到 Kyma 的 CSR(Certificate Signning Request)url,第 75 行向該 url 發(fā)送一個(gè) POST 請(qǐng)求,拿到響應(yīng):
將 HTTP 響應(yīng)數(shù)據(jù)另存為WordPress 目錄下的三個(gè)本地文件:
- crt.pem
- clientCrt.pem
- caCrt.pem
接下來 WordPress 同 Kyma 的安全連接,就是基于這些本地?cái)?shù)字證書文件來完成。
建立了安全連接后,下一步需要將 WordPress 指定的事件發(fā)布到 Kyma 上去。
點(diǎn)擊上圖 Save Changes 之后,WordPress 的 Kyma 插件會(huì)將用戶維護(hù)的待注冊(cè)事件,拼裝成對(duì)應(yīng)的 JSON 字符串,通過 HTTP POST 請(qǐng)求 向 Kyma 發(fā)送:
事件注冊(cè)成功后,在 Kyma Application 控制臺(tái),就能看到發(fā)起連接請(qǐng)求的 WordPress 實(shí)例的對(duì)應(yīng)記錄:
同時(shí)在 Kyma Service Catalog 里,也能看到 WordPress 通過注冊(cè)事件暴露出來的可訪問 API 入口:
WordPress 事件發(fā)布成功后,這些事件就會(huì)出現(xiàn)在 Kyma 實(shí)例控制臺(tái)的 Service Catalog(服務(wù)目錄)界面里,如下圖所示。
這種事件注冊(cè)機(jī)制,確保了 WordPress 和 Kyma 的松耦合關(guān)系:在 Kyma 平臺(tái)上編寫事件監(jiān)聽函數(shù)的開發(fā)人員,完全不需要了解關(guān)于 WordPress 的任何技術(shù)細(xì)節(jié),這些事件監(jiān)聽函數(shù)在 Kyma 上的載體就是一個(gè)個(gè) Lambda Function,開發(fā)人員可以用自己喜歡的編程語言來實(shí)現(xiàn)函數(shù)。
創(chuàng)建一個(gè) Lambda Function,為 WordPress 暴露給 Kyma 的 post.published 事件實(shí)現(xiàn)監(jiān)聽函數(shù)的邏輯。
函數(shù)實(shí)現(xiàn)的技術(shù)棧,選擇 Node.js:
Select Function Trigger 即觸發(fā)方式選擇,我們選擇 WordPress 暴露給 Kyma 的 post.published 事件。這樣當(dāng) WordPress 里有新的 post 創(chuàng)建時(shí),WordPress 會(huì)發(fā)送 post.published 事件,連同 post 的具體內(nèi)容,傳給 Kyma,后者會(huì)自動(dòng)調(diào)用創(chuàng)建好的基于 Serverless 的 Lambda Function.
剩下的 Lambda Function 的實(shí)現(xiàn)工作就是純粹的 Node.js 編程:從事件參數(shù) event 對(duì)象里將 WordPress 傳入的 post 內(nèi)容解析出來,調(diào)用 axios 工具庫將此條 post 進(jìn)行轉(zhuǎn)發(fā)。
Lambda Function 實(shí)現(xiàn)里,我選擇了調(diào)用微信 Open API,將該條 post 推送給一個(gè)用于測(cè)試的硬編碼的微信用戶:
以上就是使用 Kyma 將 WordPress 里發(fā)布的內(nèi)容自動(dòng) “同步” 到其他社交媒體平臺(tái)比如微信的步驟。我們簡(jiǎn)單回顧一下思路:
(1) 通過 Kyma Application Connector 與 WordPress 建立互相信任的安全連接。
(2) 將 WordPress 暴露出的 post.published 事件,發(fā)布到 Kyma Service Catalog 里。
(3) 實(shí)現(xiàn) Kyma Lambda Function,監(jiān)聽 WordPress 所發(fā)布的 post.published 事件,實(shí)現(xiàn)對(duì)應(yīng)的內(nèi)容轉(zhuǎn)發(fā)到社交媒體平臺(tái)的功能。如果除了微信之后,還希望轉(zhuǎn)發(fā)到其他社交媒體平臺(tái)上,只需再創(chuàng)建一個(gè)新的 Lambda Function,然后調(diào)用其他的社交媒體平臺(tái)的發(fā)布 API 即可。
以上步驟同樣適用于通過 Kyma 對(duì)其他的云原生應(yīng)用進(jìn)行擴(kuò)展。
按照上述三個(gè)步驟,對(duì) WordPress 進(jìn)行擴(kuò)展之后,發(fā)布一條新的帖子,關(guān)于影片《切爾諾貝利》的觀后感:
單步調(diào)試 WordPress 的帖子發(fā)布功能,發(fā)現(xiàn)發(fā)布的帖子內(nèi)容被推送到了 Kyma API Gateway 對(duì)應(yīng)的 url:
回到 Kyma Lambda Function 函數(shù)的控制臺(tái),確認(rèn) WordPress 發(fā)送的事件內(nèi)容,已經(jīng)成功被 Kyma 接收到了:
最后我的微信號(hào)上成功收到了 Kyma Lambda Function 里調(diào)用微信 Open API 發(fā)送的消息:
使用 Kyma 擴(kuò)展企業(yè)級(jí)云原生應(yīng)用
在 Kyma 官網(wǎng)的客戶成功案例中,赫然有 SAP,Netconomy,Accenture,Digital Lights 這些企業(yè)用戶。
SAP 在客戶體驗(yàn)產(chǎn)品線(Customer Experience) 這一領(lǐng)域推出的 C/4HANA 套件,包含市場(chǎng)云,電商云,銷售云,服務(wù)云和客戶數(shù)據(jù)云。Kyma 正是 SAP 推薦的對(duì)這些企業(yè)家云原生應(yīng)用進(jìn)行擴(kuò)展的推薦平臺(tái)和工具之一。
下面我們來了解一些具體的擴(kuò)展案例。
SAP 電商云(Commerce Cloud) 有一套訂單狀態(tài)編排模型,從用戶下單到訂單最終處于 Complete 狀態(tài),狀態(tài)的遷移通過一系列 Action 進(jìn)行驅(qū)動(dòng)。
假設(shè)我們期望在 SAP 電商云里實(shí)現(xiàn)這樣一個(gè)增強(qiáng)場(chǎng)景:在用戶下單之后,發(fā)貨之前,增添一個(gè)自定義的檢查步驟 Fraud Check(訂單欺詐檢查),如下圖流程圖內(nèi)淺色矩形框所示。
一種比較直接的方式,是在 SAP 電商云源代碼里,查找訂單編排流程里基于 Spring 框架的 Hook,通過自定義 Java Bean 的方式,實(shí)現(xiàn)自定義檢查邏輯。這種方式在開發(fā)完成后,需要重新構(gòu)建 SAP 電商云的 Java 源代碼。這就是所謂的 In-App extension 方式。
如果選擇 Kyma 以事件驅(qū)動(dòng)的方式對(duì) SAP 電商云進(jìn)行增強(qiáng),則增強(qiáng)邏輯以 Lambda Function 的載體存儲(chǔ)在 Kyma 平臺(tái)上,而非對(duì) SAP 電商云本身的源代碼進(jìn)行增強(qiáng)。這種方式又稱為 Side-by-Side extension 方式。
主要的開發(fā)步驟如下:
(1) 在 SAP 電商云進(jìn)行配置,將自定義事件 Fraud Check 發(fā)布給 Kyma.
(2) SAP 電商云的增強(qiáng)開發(fā)人員,登錄 Kyma 控制臺(tái),創(chuàng)建 Lambda Function,將 Function Triggers 選擇為步驟一在 SAP 電商云里發(fā)布的自定義事件。Lambda Function 的實(shí)現(xiàn)內(nèi)容,即從事件對(duì)象里解析出下單的客戶信息,然后調(diào)用 Marketing Cloud 和 SAP 云平臺(tái)提供的 Restful API,對(duì)該客戶身份的有效性進(jìn)行檢查。
運(yùn)行時(shí),當(dāng)用戶下單后,SAP 電商云向 Kyma 拋出一個(gè)事件。Kyma 分別調(diào)用 SAP Marketing Cloud 和 SAP 云平臺(tái)的 Business Partner API,將檢查結(jié)果返回給 SAP 電商云。
登錄 SAP 電商云 Backoffice 配置頁面,定義一個(gè)新的Action,ID 為 EXTERNAL_KYMA_FRAUD_CHECK.
登錄 Kyma 控制臺(tái),創(chuàng)建一個(gè)新的 Lambda Function,Function Triggers 選擇為 SAP 電商云 Backoffice 里維護(hù)的自定義事件:
Lambda Function 的具體實(shí)現(xiàn):
- 代碼 18~19 行:從 輸入的 event 事件對(duì)象參數(shù)里,解析出訂單 Code
- 26 行:消費(fèi) SAP 電商云的 OCC(Omni Commerce Channel) Restul API,獲得訂單明細(xì),從中獲得下單的客戶 ID
- 30 行:根據(jù)客戶 ID 拿到客戶明細(xì)
- 37 行:檢查該客戶的郵箱地址是否有效
- 40 行:檢查該客戶是否第一次下單
- 43 行:調(diào)用 SAP Marketing Cloud API 檢查客戶身份有效性
- 46 行:調(diào)用 SAP 云平臺(tái) Business Partner API 檢查客戶身份有效性
下面對(duì)這種基于事件驅(qū)動(dòng)方式所完成的增強(qiáng)實(shí)現(xiàn)進(jìn)行測(cè)試。
在 SAP 電商云里創(chuàng)建一個(gè)新的訂單,記下訂單 ID 2139.
登錄 SAP 電商云 Backoffice 控制臺(tái),檢查自定義 Fraud Check 邏輯是否按照我們期望的流程來執(zhí)行。
根據(jù) ID EXTERNAL_KYMA_FRAUD_CHECK 進(jìn)行搜索,找到了之前新建的 Action 對(duì)應(yīng)的流程日志記錄:
打開訂單的 Fraud Reports 面板,查看檢查記錄:
Email 字段檢查結(jié)果:客戶維護(hù)的 Email 字段是一個(gè)有效的郵箱地址。
首單檢查(First Time Order Check)返回的分?jǐn)?shù)是 100,根據(jù) SAP 電商云當(dāng)前配置,這個(gè)結(jié)果被判定為首單。
SAP Marketing Cloud API 調(diào)用返回的結(jié)果:
SAP 云平臺(tái) Business Partner API 調(diào)用返回的結(jié)果:
我們?cè)賮砜纯戳硪粋€(gè)使用 Kyma 擴(kuò)展 SAP 銷售云即 SAP Cloud for Customer Sales 模塊的例子。
這是一個(gè)所謂 Account Address Enrichment 的場(chǎng)景,用戶在 SAP 銷售云里創(chuàng)建 Account 主數(shù)據(jù)時(shí),只需維護(hù)基本的地址信息,點(diǎn)擊保存后,銷售云發(fā)送事件給 Kyma,后者響應(yīng)該事件,調(diào)用 SAP API Hub上的 Address 微服務(wù),把 Enrich 之后的地址詳情,通過銷售云 Account OData API 進(jìn)行寫回。這個(gè)增強(qiáng)可以減少銷售云用戶錄入 Account 數(shù)據(jù)的工作量。
這個(gè)增強(qiáng)最關(guān)鍵的一步,就是打通 SAP 銷售云與 Kyma 的連接,讓 Kyma 能夠接收到 SAP 銷售云運(yùn)行業(yè)務(wù)流程時(shí)拋出的事件。
進(jìn)入 SAP 銷售云 Administration 工作中心 的 Event Notification 配置頁面:
新建一個(gè)銷售云 OData 事件的消費(fèi)者,即 Kyma 實(shí)例。
Consumer 創(chuàng)建頁面需要維護(hù)遠(yuǎn)端 Kyma Application Connector url:
這個(gè) url 可以通過登錄 Kyma 控制臺(tái),點(diǎn)擊 Connect Application 按鈕生成:
回到銷售云配置頁面,指定將 Account 和 Opportunity 這兩個(gè) Business Object 的創(chuàng)建和更新事件,發(fā)送給 Kyma.
這些 Business Object 的事件發(fā)布行為,通過銷售云的 Subscription 來描述:
保存配置后,到 Kyma 控制臺(tái),此時(shí)就能觀察到 SAP 銷售云(Sales Cloud) 注冊(cè)的事件了。
點(diǎn)擊 SAP Sales Cloud,能夠查閱注冊(cè)事件的技術(shù)明細(xì),比如事件負(fù)載(Payload) 格式,包含的字段名和數(shù)據(jù)類型等。
剩下的就是和之前擴(kuò)展 WordPress 以及 SAP 電商云一樣的操作,在 Kyma 中基于 SAP 銷售云注冊(cè)的事件,創(chuàng)建 Lambda Function,解析事件參數(shù)并進(jìn)行相應(yīng)處理。出于文章篇幅限制,在 Lambda Function 里僅僅簡(jiǎn)單將銷售云傳入的事件對(duì)象的內(nèi)容打印出來。
在 SAP 銷售云里新建一個(gè) Opportunity 并保存。
到 Kyma Lambda Function 日志控制臺(tái)里,觀察到了函數(shù)體里使用 console.log 打印出的來自 SAP 銷售云的 Opportunity 創(chuàng)建事件包含的字段:
總結(jié)
本文首先簡(jiǎn)要介紹了 Kyma 這個(gè)底層基于 Kubernetes 的開源云原生應(yīng)用開發(fā)平臺(tái)和運(yùn)行時(shí),接著分成兩大部分,分別分享了使用 Kyma 對(duì)傳統(tǒng)的 On-Premises 應(yīng)用(WordPress) 和企業(yè)級(jí)云原生應(yīng)用(SAP 電商云和 SAP 銷售云)進(jìn)行擴(kuò)展的案例。
這些擴(kuò)展案例均來自筆者實(shí)際工作中的項(xiàng)目經(jīng)歷,希望能起到拋磚引玉的作用,感謝閱讀。
更多Jerry的原創(chuàng)文章,盡在:“汪子熙”:
總結(jié)
以上是生活随笔為你收集整理的基于 Kyma 的企业级云原生应用的扩展案例分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于施加在 div 标签上的 ngTem
- 下一篇: 形容自己无奈的歌词