基於雲原生CloudEvent實現服務目錄

2021-10-16 05:23:10 字數 2383 閱讀 8175

基於事件驅動的系統架構在日常的平台開發中早已司空見慣,通過訊息佇列進行事件的傳送,然後分別構建對應的生產者和消費者。不過在傳統的業務開發模式不同的事件會有不同的格式,不同的生產者生成出的事件格式也各不相同,消費者能消費的格式也是千差萬別,本質上事件、生產者、消費者還是耦合的。那如何解決該問題呢?那就是我們今天要聊的cloudevent。

對於cloudevents的學習筆者採用自頂向下的方式來進行學習,即先去了解cloudevents是如何在平台上進行事件、消費者、生產者的解耦,然後在去思考底層的相關欄位的細節

在傳統的開發模式下不同的業務生產的的事件也各不相同,並且事件本身資料會相對較少,更多的是類似訊號傳遞的角色,即通知後端服務某個型別事件發生了,然後由對應的系統構建事件的上下文資料,進行業務邏輯處理。而在cloudevents中則更注重事件的一致性與完整性。

完整性是我個人的理解,即我們在cloud的環境中構建的事件需要包含其當前的完整上下文資料,以便後續系統有足夠的資訊可以進行業務邏輯處理與決策。這樣可以避免後端系統在接收到事件後,需要進行當前事件對應上下文的組裝,主要是解決由於傳輸存在的延遲導致相關資料可能已經不再是事件發生時的狀態,存在狀態不一致的情況

事件產生後通常要傳送到對應的訊息**服務進行暫存,在傳統的業務中通常會選擇特定的訊息協議來進行傳輸,這中間通常會涉及兩部分:序列化與傳輸協議。

在序列化方面cloudevents支援http、 amqp、 kafka等常見的標準協議,而不需要使用者手動進行相關協議的序列化

事件的消費端通常會對其關注的事件型別感興趣,並且由於訊息的格式是統一的我們很容易就可以通過對應的平台來根據訊息體裡面的內容進行訊息路由,分發給對應的事件消費者,事件的消費者只要負責對應事件的接收即可,而並不關注其他的資訊

關於cloudevents事件更多的內容,後面再繼續分享,然後接下來就介紹下我們基於cloudevent是怎麼設計系統的

在前面的文章中,介紹過我們的服務目錄系統,服務目錄中要接入不同的基礎服務,基礎服務的格式各不相同,而且還要對接計費、效率統計等系統,後期可能還會對接公司的事件流平台,那如何對這些這些異構模組中異構的資料進行統一的分發和處理,我們的架構如下:

結合cloudevents的規範,我們定義自己內部的系統的資料結構。主要使用的結構如下:

這裡主要介紹下我們附加的一些字段以及根據自己場景的定義:

type

從表面上看source和type都描述了當前事件發生的系統,不同的是type中是乙個結構化的資料,按照這個結構我們對應的計費、效率統計模組,就可以拿到這個資料去做相關一些支線邏輯的處理了。

resources: 變更資源列表

即標識當前事件觸發了哪些相關資源的改變,比如虛機新增硬碟,實際上是包含了兩種資源即虛機與對應的磁碟資源

前面提到我們使用服務和提供的api規範實現了乙個服務**模組,在服務**模組中cloudevent的主要使用場景如下:

1.服務目錄接收到服務變更請求後,儲存資料庫後,發生對應的cloudevent事件到訊息佇列 2.在訊息佇列中設定對應的路由**規則,將對應的事件發生給服務**模組 3.服務**模組根據type欄位進行解析,獲取對應的後端服務位址,並從訊息中解析出對應的資料,將資料傳送給後端真實的服務 4.後端真實服務接收到結構化資料後,進行自己的業務邏輯處理,處理完成後傳送對應的事件 5.服務**模組根據事件解析出相關的資源,呼叫對應的平台獲取當前資源的資料,生成事件 6.服務目錄模組接收到對應的服務例項資料,儲存到自己的資料庫中

如果後續有變更則只需要產生對應的事件發生到訊息佇列中,會重複進行5-6階段

鏈路雖然有點長,但其實整個鏈路的系統設計非常簡單,系統之間的通訊、可靠性、容錯、耦合性都不需要關注(訊息佇列服務來保障),後續如果要擴充套件,就再懟個模組就可以了。要消費新的事件,就再寫個新的介面,然後編輯下路由規則,就可以實現新的模組的接入了。

雲原生 雲原生簡介

進一年我們都在使用雲原生框架 springcloud微服務開發專案,敏捷快速 部署在容器中,解決部署環境差異 使用devops自動部署,減少運維壓力 本質是乙個與宿主機系統共享核心,但與系統中的其他程序資源相隔離的執行環境。docker容器,是當前認可度高 社群和生態最活躍的開源容器技術。devop...

雲原生概述

雲原生技術生態是乙個龐大的技術集合。cncf 有一張雲原生全景圖 在這個全景圖裡已經有 200 多個專案和產品。cncf 目前正式託管的 20 多個專案共同構成了現代雲計算生態的基石,其中像 kubernetes 這樣的專案已經成為了世界第四活躍的開源專案。現在全球各大公有云廠商都已經支援了 kub...

雲原生應用

在峰會的第二天很多企業分享了他們在云原應用方面的實踐和思考。雲原生應用 雲原生是一種方法,用於構建和執行充分利用雲計算模型優勢的應用。雲原生應用充分借助雲計算平台的計算,儲存,網路以及負載均衡等一系列的能力來構建應用。應用本身不用再關注基礎架構,高可用以及服務水平擴充套件等能力,而將重點放在業務本身...