一個開源的云原生事件中間件!
一、項(xiàng)目介紹
EventMesh 是一個動態(tài)的云原生事件驅(qū)動架構(gòu)基礎(chǔ)設(shè)施,旨在簡化分布式應(yīng)用和服務(wù)之間的事件通信。它構(gòu)建了一個高性能、可擴(kuò)展、松耦合的事件中間件層,支持多種協(xié)議(如 HTTP、gRPC、TCP)和消息模式(Pub/Sub, Event Streaming),并提供了豐富的治理功能。其核心目標(biāo)是成為連接應(yīng)用程序、云服務(wù)和中間件的事件樞紐,構(gòu)建響應(yīng)式、彈性的分布式系統(tǒng)。
多運(yùn)行時:
編排:
聯(lián)邦:
二、應(yīng)用場景
- 微服務(wù)解耦與異步通信: 服務(wù)間通過事件發(fā)布/訂閱進(jìn)行異步交互,提高系統(tǒng)響應(yīng)性和容錯性,避免服務(wù)雪崩。
- 事件驅(qū)動架構(gòu) (EDA) 實(shí)現(xiàn): 構(gòu)建基于事件的業(yè)務(wù)系統(tǒng),如訂單處理、庫存更新、支付通知等業(yè)務(wù)流程的驅(qū)動。
- 實(shí)時數(shù)據(jù)管道: 將數(shù)據(jù)庫變更日志 (CDC)、應(yīng)用日志、IoT 設(shè)備數(shù)據(jù)等實(shí)時事件流接入并分發(fā)到下游處理系統(tǒng)(如 Flink, Spark, Kafka Streams)。
- 云服務(wù)集成: 作為橋梁,連接 SaaS 應(yīng)用、云函數(shù)(如 AWS Lambda, Azure Functions, 阿里云 FC)以及傳統(tǒng)應(yīng)用,實(shí)現(xiàn)跨云、跨環(huán)境的事件驅(qū)動集成。
- 混合云/多云事件總線: 在混合云或多云環(huán)境中提供統(tǒng)一的事件路由和管理能力。
- Serverless 事件源: 為 Serverless 函數(shù)提供可靠、高吞吐的事件觸發(fā)源。
三、功能模塊
(1) EventMesh Runtime:
- 通信網(wǎng)關(guān): 接收來自不同協(xié)議(HTTP, gRPC, TCP, CloudEvents)的事件發(fā)布請求。
- 協(xié)議適配: 將不同協(xié)議的事件統(tǒng)一轉(zhuǎn)換為 CloudEvents 格式(業(yè)界標(biāo)準(zhǔn))進(jìn)行內(nèi)部處理。
- 事件存儲與轉(zhuǎn)發(fā): 支持將事件持久化到后端存儲(如 RocketMQ, Kafka, Pulsar, Pravega)或直接轉(zhuǎn)發(fā)。
- 連接器 (Connector): 可插拔的插件,負(fù)責(zé)與具體的事件存儲/消息隊(duì)列(MQ)進(jìn)行讀寫交互。
- ACL (訪問控制列表): 提供基于 Topic 和用戶的權(quán)限控制。
(2) EventMesh SDK:
- 提供多種語言(Java, Go, Python, C++, Node.js, Rust)的客戶端庫,方便應(yīng)用集成發(fā)布/訂閱事件。
- 封裝與 EventMesh Runtime 的通信協(xié)議細(xì)節(jié)。
- 支持 CloudEvents 規(guī)范。
(3) EventMesh Catalog:
- 事件元數(shù)據(jù)管理,提供事件定義(Schema)、發(fā)布者、訂閱者的注冊與發(fā)現(xiàn)功能。
- 增強(qiáng)系統(tǒng)的可觀察性和治理能力。
(4) EventMesh Dashboard (控制臺):可視化 Web UI,用于監(jiān)控集群狀態(tài)(TPS、延遲、連接數(shù))、管理 Topics、查看訂閱關(guān)系、配置 ACL、管理連接器、事件追蹤等。
(5) EventMesh Admin:提供 RESTful API 和管理 CLI,用于集群的運(yùn)維管理、配置管理、健康檢查等。
(6) EventMesh SPI (Service Provider Interface):插件化擴(kuò)展機(jī)制,允許開發(fā)者自定義協(xié)議插件、存儲插件、安全插件、注冊中心插件等。
四、功能特點(diǎn)
(1) 云原生設(shè)計(jì):
- 輕量級,容器化友好(Docker, Kubernetes)。
- 支持動態(tài)配置、服務(wù)發(fā)現(xiàn)、彈性伸縮。
- 健康檢查、優(yōu)雅啟停。
(2) 協(xié)議多語言支持:
- 原生支持 HTTP/1.1, HTTP/2 (gRPC), TCP 協(xié)議接入。
- 提供多語言 SDK,降低接入門檻。
(3) 擁抱 CloudEvents:內(nèi)部采用并推廣 CloudEvents 規(guī)范,提供跨平臺、跨供應(yīng)商的事件數(shù)據(jù)互操作性。
(4) 高性能與高擴(kuò)展:
- 采用 Netty 等高性能網(wǎng)絡(luò)框架。
- 連接器架構(gòu)支持水平擴(kuò)展 Runtime 節(jié)點(diǎn)和靈活替換后端存儲(如 RocketMQ, Kafka, Pulsar)。
- 事件處理鏈路優(yōu)化。
(5) 強(qiáng)大的治理能力:
- 可視化 Dashboard 提供實(shí)時監(jiān)控。
- 細(xì)粒度的 ACL 權(quán)限控制。
- 事件鏈路追蹤(集成 OpenTracing/OpenTelemetry)。
- 事件元數(shù)據(jù)管理(Catalog)。
(6) 松耦合與靈活性:
- 發(fā)布者與訂閱者完全解耦。
- 插件化架構(gòu)(SPI)支持高度自定義和擴(kuò)展。
- 支持多種事件傳遞語義(至少一次、至多一次)。
(7) 開源與社區(qū)驅(qū)動: Apache 孵化器項(xiàng)目,擁有活躍的社區(qū)和持續(xù)迭代。
五、項(xiàng)目架構(gòu)
1. 技術(shù)架構(gòu)
EventMesh 采用分層、插件化的架構(gòu):
(1) 接入層:
- 由 EventMesh Runtime 節(jié)點(diǎn)組成,負(fù)責(zé)接收來自 EventMesh SDK 或其他客戶端(通過 HTTP/gRPC/TCP)的事件。
- 進(jìn)行協(xié)議解析、身份認(rèn)證(可選)、ACL 校驗(yàn)。
- 將事件統(tǒng)一轉(zhuǎn)換為 CloudEvents 格式。
(2) 處理層:
- 在 Runtime 內(nèi)部,事件經(jīng)過可能的過濾、轉(zhuǎn)換(通過 SPI 插件)后,由 Connector 插件處理。
- Connector 負(fù)責(zé)與具體的 事件存儲層 交互,執(zhí)行事件發(fā)布(Pub)或持久化。
(3) 事件存儲層:
可插拔的后端存儲系統(tǒng),如 Apache RocketMQ, Apache Kafka, Apache Pulsar, Pravega 等。由 Connector 對接。負(fù)責(zé)事件的可靠存儲、排序和分發(fā)。
(4) SDK 層:
部署在應(yīng)用程序端,提供簡潔 API 供應(yīng)用發(fā)布和訂閱事件。屏蔽底層協(xié)議和 EventMesh 細(xì)節(jié)。
(5) 治理與管控層:
- EventMesh Dashboard/Admin: 提供可視化管理和 API 接口。
- EventMesh Catalog: 管理事件元數(shù)據(jù)(可選部署)。
- 依賴注冊中心(如 Nacos, etcd, Zookeeper)進(jìn)行 Runtime 節(jié)點(diǎn)發(fā)現(xiàn)和配置管理。
- 集成 Metrics (Prometheus), Tracing (Jaeger/Zipkin) 用于監(jiān)控。
(6) SPI 層: 貫穿各層,提供協(xié)議、存儲、安全、注冊中心等擴(kuò)展點(diǎn)。
(7) 架構(gòu)圖
(8) EventMesh云原生結(jié)構(gòu)
2. 技術(shù)棧
(1) 核心語言: Java (Runtime, SDK-Java, Dashboard 后端), Go (SDK-Go), Vue.js (Dashboard 前端)
(2) 網(wǎng)絡(luò)通信: Netty (高性能 TCP/HTTP), gRPC (HTTP/2), Reactor Netty (可選)
(3) 事件規(guī)范: CloudEvents SDK
(4) 存儲插件 (Connector): Apache RocketMQ Client, Apache Kafka Client, Apache Pulsar Client, Pravega Client (Java)
(5) 注冊中心: Nacos, etcd, Zookeeper, Consul (通過 SPI 插件支持)
(6) 配置中心: Nacos, Apollo, Zookeeper (通過 SPI 插件支持)
(7) 治理與監(jiān)控:
- Metrics: Micrometer -> Prometheus
- Tracing: OpenTracing (Jaeger) / OpenTelemetry
- 日志: SLF4J + Logback/Log4j2
(8) 前端: Vue 2/3, Element UI / Ant Design Vue, ECharts (Dashboard)
(9) 構(gòu)建與依賴管理: Maven, npm/yarn
(10) 部署: Docker, Kubernetes (Helm Chart), 獨(dú)立 JAR 包
(11) 其他關(guān)鍵庫: Spring Boot (Dashboard 后端), Guava, Lombok, Jackson, Protobuf (gRPC), RxJava (異步處理)
七、部署指南
1. 依賴
- 建議使用64位操作系統(tǒng),建議使用Linux / Unix;
- 64位JDK 1.8+;
- Gradle至少為5.6, 推薦 5.6.*
2. 本地構(gòu)建運(yùn)行
(1) 下載
https://github.com/apache/incubator-eventmesh 您將獲得EventMesh-master.zip
(2) 項(xiàng)目結(jié)構(gòu)
- eventmesh-common : eventmesh公共類與方法模塊
- eventmesh-connector-api : eventmesh connector插件接口定義模塊
- eventmesh-connector-plugin : eventmesh connector插件模塊
- eventmesh-runtime : eventmesh運(yùn)行時模塊
- eventmesh-sdk-java : eventmesh java客戶端sdk
- eventmesh-starter : eventmesh本地啟動運(yùn)行項(xiàng)目入口
- eventmesh-spi : eventmesh SPI加載模塊
(3) 插件說明
① 安裝插件
有兩種方式安裝插件:
- classpath加載:本地開發(fā)可以通過在eventmesh-starter模塊build.gradle中進(jìn)行聲明,例如聲明使用rocketmq插件
implementation project(":eventmesh-connector-plugin:eventmesh-connector-rocketmq")
- 文件加載:通過將插件安裝到插件目錄,EventMesh在運(yùn)行時會根據(jù)條件自動加載插件目錄下的插件,可以通過執(zhí)行以下命令安裝插件
./gradlew clean jar dist && ./gradlew installPlugin
② 使用插件
EventMesh會默認(rèn)加載dist/plugin目錄下的插件,可以通過-DeventMeshPluginDir=your_plugin_directory來改變插件目錄。運(yùn)行時需要使用的插件實(shí)例可以在 confPath目錄下面的eventmesh.properties中進(jìn)行配置。例如通過以下設(shè)置聲明在運(yùn)行時使用rocketmq插件。
#connector plugin
eventMesh.connector.plugin.type=rocketmq
③ 配置VM啟動參數(shù)
-Dlog4j.cnotallow=eventmesh-runtime/conf/log4j2.xml
-Deventmesh.log.home=eventmesh-runtime/logs
-Deventmesh.home=eventmesh-runtime
-Dcnotallow=eventmesh-runtime/conf
注:如果操作系統(tǒng)為Windows, 可能需要將文件分隔符換成\
④ 啟動運(yùn)行
運(yùn)行org.apache.eventmesh.starter.StartUp的主要方法
3. Docker 運(yùn)行
(1) 拉取鏡像
執(zhí)行 docker pull eventmesh/eventmesh-rocketmq:v1.3.0 , 你將會獲取到EventMesh的鏡像,如下圖所示:
(2) 配置
預(yù)先準(zhǔn)備 : 你可能需要從github上下載源代碼,并參考這兩個文件(eventMesh.properties 和 rocketmq-client.properties)的內(nèi)容來做下面的操作
① 需要配置的文件
在運(yùn)行容器之前,你需要配置如下文件:
eventMesh.properties:
配置項(xiàng) | 默認(rèn)值 | 備注 |
eventMesh.server.http.port | 10105 | EventMesh http 服務(wù)端口 |
eventMesh.server.tcp.port | 10000 | EventMesh tcp 服務(wù)端口 |
rocketmq-client.properties:
配置項(xiàng) | 默認(rèn)值 | 備注 |
eventMesh.server.rocketmq.namesrvAddr | 127.0.0.1:9876;127.0.0.1:9876 | RocketMQ namesrv 地址 |
拉取了EventMesh鏡像到你的宿主機(jī)后,你可以執(zhí)行下面的命令來完成eventMesh.properties和rocketmq-client.properties 文件的配置。
② 創(chuàng)建文件
mkdir -p /data/eventmesh/rocketmq/conf
cd /data/eventmesh/rocketmq/conf
vi eventMesh.properties
vi rocketmq-client.properties
這兩個文件內(nèi)容可以參考 eventMesh.properties 和 rocketmq-client.properties
(3) 運(yùn)行
① 運(yùn)行
執(zhí)行下面的命令來運(yùn)行容器:
docker run -d -p 10000:10000 -p 10105:10105 -v /data/eventmesh/rocketmq/conf/eventMesh.properties:/data/app/eventmesh/conf/eventMesh.properties -v /data/eventmesh/rocketmq/conf/rocketmq-client.properties:/data/app/eventmesh/conf/rocketmq-client.properties docker.io/eventmesh/eventmesh-rocketmq:v1.3.0
- -p : 將容器內(nèi)端口與宿主機(jī)端口綁定,容器的端口應(yīng)與配置文件中的端口一致
- -v : 將容器內(nèi)的配置文件掛載到宿主機(jī)下,需注意配置文件的路徑
② 檢查容器的運(yùn)行狀況
執(zhí)行 docker ps 來檢查容器的運(yùn)行狀況:
執(zhí)行 docker logs [container id] 可以得到如下結(jié)果:
執(zhí)行 docker exec -it [container id] /bin/bash 可以進(jìn)入到容器中并查看詳細(xì)信息。
八、源碼地址
https://gitee.com/bemy/incubator-eventmesh