[ISSUE #5411] Serve the legacy SDK gRPC protocol on the v2 runtime (port 10205 bridge) + connector plugin tests 23/23 (#5412)

* [ISSUE #5411] Serve the legacy SDK gRPC protocol on the v2 runtime (port 10205 bridge)

EventMeshGrpcServer binds PublisherService/ConsumerService/HeartbeatService on
eventmesh.grpc.port (opt-in, 0/-1 = off) and maps every call onto the v2
UniIngressService pipeline (WAL at-least-once, shared retry/DLQ):
- publish/batchPublish/publishOneWay/batchPublishOneWay -> ingress.publish (topic = subject)
- requestReply -> ingress.request with the legacy TTL attribute
- webhook subscribe -> WebHookChannel target; CLUSTERING->LOAD_BALANCE, BROADCASTING->BROADCAST
- subscribeStream (bidi) -> GrpcStreamChannel push target, ACKs ride back on the stream
- heartbeat -> GrpcClientRegistry TTL refresh + reaper unsubscribes stale clients
GrpcCloudEventMapper holds the proto<->v2 CloudEvent mapping + legacy Response envelope.
ruleGrpcProtocolHidden grants the sanctioned runtime.grpc.. adapter (TCP-rule precedent).

* [ISSUE #5411] gRPC bridge tests: hermetic mapping unit tests + real-SDK integration

GrpcCloudEventMapperTest covers every proto attribute flavor + the 3-key response
envelope. GrpcLegacyBridgeIntegrationTest boots the bridge over the in-memory
storage and drives it with the real EventMeshGrpcProducer/Consumer (the SDK as its
own conformance suite): publish, batch publish, stream subscription round-trip.

* Add unit tests for the remaining 19 connector plugins (23/23 coverage)

Hermetic where possible: webhook sinks (dingtalk/http/knative/lark/slack/wechat/
wecom/chatgpt) verified against a local capturing HTTP server; mcp (JSON-RPC
envelope), openfunction (Ce-* context headers), prometheus (single merged push),
spring (EventForwarder contract) exercised with their exact wire contracts;
webhook sources (10 plugins) POST their native callback payloads through the
lazy-bound hook port; prometheus/spring sources cover scrape + buffer drains;
external-client plugins (canal/jdbc/mongodb/rabbitmq/redis/s3/pravega) get
contract-level tests (init config-parse where lazy, commit no-op) since their
backends cannot boot in CI. Closes the "4 of 23 plugins carry the only unit
tests" gap tracked under the #5296 review.

* [ISSUE #5411] docs: legacy gRPC bridge served (opt-in); Connector Runtime test status

configuration.md flips eventmesh.grpc.port from RESERVED to served (opt-in, 1.x
default 10205); protocols.md gains the legacy-gRPC mapping table section; both
READMEs note the served bridge and update the Connector Runtime row to 23/23
plugin test coverage (drops the stale "4 of 23" wording).

* docs: make the Connector Runtime GA-criteria cell concrete

Replace the vague "GA criteria tracked under the #5296 architecture review"
wording with the actual remaining GA blockers: per-plugin real-backend
integration tests and the connector-runtime HA story. Also reference #5412
for the 23/23 unit-test coverage.

* docs: refresh remaining cross-references for the #5411 bridge and 23/23 tests

- deployment.md: connector-runtime status drops the stale "only 4 of 23
  plugins carry unit tests" (now 23/23 since #5412; real-backend ITs stay
  the GA gate)
- architecture/overview.md: protocol-status bullet + legacy-SDK paragraph
  mention the served opt-in gRPC bridge; Key-classes table gains the
  EventMeshGrpcServer entry
- quickstart/getting-started.md: port list mentions the opt-in 10205
  legacy gRPC bridge
56 files changed
tree: 74a6e42b7939291a62f99229498428b4122aae41
  1. .github/
  2. deploy/
  3. docker/
  4. docs/
  5. eventmesh-agent-plugin/
  6. eventmesh-agent-runtime/
  7. eventmesh-architecture-guard/
  8. eventmesh-common/
  9. eventmesh-connector-plugin/
  10. eventmesh-connector-runtime/
  11. eventmesh-examples/
  12. eventmesh-protocol-plugin/
  13. eventmesh-runtime/
  14. eventmesh-sdks/
  15. eventmesh-spi/
  16. eventmesh-storage-plugin/
  17. gradle/
  18. resources/
  19. style/
  20. tools/
  21. .asf.yaml
  22. .dockerignore
  23. .gitattributes
  24. .gitignore
  25. .gitmodules
  26. .licenserc.yaml
  27. build.gradle
  28. CONTRIBUTING.md
  29. gradle.properties
  30. gradlew
  31. gradlew.bat
  32. install.sh
  33. LICENSE
  34. maturity.md
  35. NOTICE
  36. README.md
  37. README.zh-CN.md
  38. settings.gradle
README.md




CI status CodeCov Code Scanning

License GitHub Release Slack Status

๐Ÿ“ฆ Documentation | ๐Ÿ“” Examples | โš™๏ธ Roadmap | ๐ŸŒ ็ฎ€ไฝ“ไธญๆ–‡

Apache EventMesh

Apache EventMesh is a new generation serverless event middleware for building distributed event-driven applications.

EventMesh Architecture

EventMesh Architecture

EventMesh adopts a unified CloudEvents-over-MQ architecture. The message queue (MQ) acts as a pure write-ahead log (WAL) for durable storage only โ€” there are no consumer groups, no tags, and no broker-side subscription semantics. Instead, the stateless EventMesh Runtime owns all delivery logic: its SubscriptionManager maintains the subscription registry and offset tracking, and dispatches events with load-balance, broadcast, and multicast semantics. Applications interact through a lightweight HTTP + CloudEvents 1.0 SDK (publish / subscribe / unsubscribe), while integration with external systems runs in a standalone Connector Runtime via the connector SPI.

Features

Apache EventMesh is packed with features that help users build event-driven applications with ease. Here are the highlights that set EventMesh apart:

Core architecture

  • CloudEvents-native, end to end โ€” built entirely around the CloudEvents 1.0 specification, so events stay vendor-neutral and portable.
  • Lightweight, language-agnostic SDK โ€” just three operations over plain HTTP (publish, subscribe, unsubscribe); no heavyweight client, no vendor lock-in.
  • Runtime-owned subscription & dispatch โ€” subscription state and delivery semantics (load-balance / broadcast / multicast) are managed by EventMesh itself, not the underlying MQ, giving you consistent behavior across any storage backend.
  • MQ as a pure write-ahead log (WAL) โ€” append-only, no consumer groups, no tags; the broker is reduced to durable storage, dramatically simplifying operations.
  • Guaranteed at-least-once delivery โ€” EventMesh owns reliability through self-managed offsets and explicit ACK.
  • Multiple delivery transports โ€” subscribers choose HTTP long-polling, Server-Sent Events (SSE), or WebSocket push, with request-reply support.
  • Effortless horizontal scaling โ€” stateless Runtime instances scale out seamlessly with no rebalancing cost.

Extensibility & ecosystem

  • Agent-to-Agent (A2A) collaboration โ€” a built-in A2A protocol turns EventMesh into an agent collaboration bus, bridging synchronous MCP / JSON-RPC 2.0 tool calls and asynchronous event-driven pub/sub for LLM and multi-agent systems.
  • LLM streaming agent runtime โ€” a standalone agent process hosts OpenAI-compatible LLM streaming sessions on the mesh, with function-calling tools: any connector becomes an agent tool, custom tools ship as agent plugins (SPI), and topics can drive agents as event triggers with decisions published back for sink delivery.
  • Pluggable storage layer โ€” Apache RocketMQ (4.x / 5.x) and Apache Kafka ship today, plus a zero-dependency in-memory backend as the dev/CI default; more backends via the MeshStoragePlugin SPI.
  • Pluggable interconnector layer โ€” connectors run as standalone processes acting as the source or sink of SaaS, CloudService, Database, etc.
  • Pluggable meta service โ€” Nacos ships today (multi-instance coordination); more backends via the same storage SPI.
  • Event schema management via catalog service.
  • Powerful event orchestration through the Serverless workflow engine.
  • Powerful event filtering and transformation.

Capability status

Each EventMesh surface carries an explicit maturity status. The table below is the single source of truth โ€” module-level docs link here instead of restating their status. See docs for the per-capability guides.

CapabilityStatusRecommendationMigration target
HTTP + CloudEventsGA targetRecommended โ€” the primary user path (CloudEventsClient + /events/*)Primary path
Kafka / RocketMQ storage (4.x, 5.x)GA targetRecommended โ€” pluggable WAL backends, TCK-covered (MeshStoragePluginTCK)Primary path
Memory storage (default)BetaZero-dependency dev/CI/quick-start backend (docker run apache/eventmesh with no broker); state is process-local โ€” not for productionSwitch EVENTMESH_STORAGE_TYPE to kafka / rocketmq / rocketmq5
SSE / WebSocket pushBetaUsable โ€” integration-tested; ACK-tracked redelivery + DLQ are shared with long-polling (same ReliableDispatcher), e2e-real-broker suite in #5389Unified push transports
Connector RuntimeBetaUsable โ€” working end-to-end; all 23 plugins fully implemented since #5394 (no template stubs left), data-loss hardening in #5328; unit tests cover all 23 plugins since #5412Promote to GA once the remaining #5296 review items land (real-backend integration tests per plugin, connector-runtime HA story)
A2A / Agent GatewayBetaUsable โ€” task store + runtime bridge (#5302/#5304), task reaper + Meta-backed agent cards in #5346, quota classification in #5373; the Testcontainers E2E gate (#5340) closed in September 2026Unified Runtime A2A
Agent tools & event triggersExperimentalEvaluate โ€” LlmClient/ConversationMemory/AgentTool extension points, connector-backed tools and SPI plugin deployment landed in #5408/#5409; runtime in eventmesh-agent-runtime, plugins in eventmesh-agent-plugin/Agent tool ecosystem
TCP / gRPC / OpenMessaging SDKsLegacy-compatibleExisting users only โ€” kept so old clients run unmodified; not extendedHTTP + CloudEvents

Status meanings:

  • GA target โ€” feature-complete for the current architecture, integration-tested against real brokers; safe for production.
  • Beta โ€” functional and tested, but semantics or deployment shape may still shift in a minor release.
  • Experimental โ€” under active development; APIs and storage layouts may break; wire it up on dev clusters first.
  • Legacy-compatible โ€” maintained for zero-change compatibility with existing clients; receives fixes but no new features. New integrations should not start here.

Migrating off TCP / gRPC SDKs? The legacy clients keep working against the current runtime; see the client guide for the HTTP + CloudEvents replacement (CloudEventsClient). The legacy gRPC SDK surface is served again since the #5411 bridge (opt-in via eventmesh.grpc.port=10205) โ€” old EventMeshGrpcProducer / EventMeshGrpcConsumer clients run unmodified on the v2 runtime.

Documentation

The docs tree is organized by audience โ€” start from the documentation map:

Subprojects

Quick start

A full step-by-step walkthrough โ€” prerequisites, backend choice, run via Docker or from source, first publish, three receive transports, unsubscribe, and the SDK path โ€” lives in Getting started. The first-event examples in that guide work against the standard ports (10105 HTTP, 10106 admin, 10107 WebSocket opt-in).

Contributing

GitHub repo Good Issues for newbies GitHub Help Wanted issues GitHub Help Wanted PRs GitHub repo Issues

Each contributor has played an important role in promoting the robust development of Apache EventMesh. We sincerely appreciate all contributors who have contributed code and documents.

CNCF Landscape

Apache EventMesh enriches the CNCF Cloud Native Landscape.

License

Apache EventMesh is licensed under the Apache License, Version 2.0.

Community

WeChat AssistantWeChat Public AccountSlack
Join Slack Chat(Please open an issue if this link is expired)

Bi-weekly meeting : #Tencent meeting : 346-6926-0133

Bi-weekly meeting record : bilibili

Mailing List

NameDescriptionSubscribeUnsubscribeArchive
UsersUser discussionSubscribeUnsubscribeMail Archives
DevelopmentDevelopment discussion (Design Documents, Issues, etc.)SubscribeUnsubscribeMail Archives
CommitsCommits to related repositoriesSubscribeUnsubscribeMail Archives
IssuesIssues or PRs comments and reviewsSubscribeUnsubscribeMail Archives