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