This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 6e4cb4cd98 docs(apollo): announce staged plugin-store migration (#7627)
6e4cb4cd98 is described below
commit 6e4cb4cd98dc7464131a9a2e27ce4fe3d295bf5f
Author: redyyang <[email protected]>
AuthorDate: Thu Oct 15 12:58:25 2026 +0800
docs(apollo): announce staged plugin-store migration (#7627)
---
README.md | 2 +-
RELEASE-NOTES.md | 8 ++
docs/plugin-store-apollo.md | 210 ++++++++++++++++++++++++++++++++++++++++++++
shenyu-registry/README.md | 2 +-
4 files changed, 220 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index aa217f08d2..44efde0696 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ Apache ShenYu is a Java-based gateway for service proxying,
protocol conversion,
| Registration and discovery | Client SDKs register service addresses and API
metadata with Admin. Registry integrations support discovery; an optional
Kubernetes controller reconciles Ingress and Endpoints resources. |
| Security and traffic control | WAF, signing, authentication plugins, load
balancing, rate limiting, and fault tolerance through Resilience4j and
Sentinel; deprecated Hystrix remains available as an external plugin (see
[plugin-store-hystrix](docs/plugin-store-hystrix.md)). |
| Caching and transformation | In-memory or Redis-backed response caching, URL
rewriting, redirection, and request/response transformation. |
-| Dynamic configuration | Admin persists plugins, selectors, rules, metadata,
and authentication data. WebSocket sync is the default; HTTP long polling,
ZooKeeper, Nacos, etcd, and Apollo are available. Consul sync is available as
an external extension (see [plugin-store-consul](docs/plugin-store-consul.md)).
Gateway replicas apply updates to their local caches. |
+| Dynamic configuration | Admin persists plugins, selectors, rules, metadata,
and authentication data. WebSocket sync is the default; HTTP long polling,
ZooKeeper, Nacos, and etcd are available. Apollo remains available during its
deprecation release and is planned to move to an external extension (see
[Apollo migration](docs/plugin-store-apollo.md)). Consul sync is available as
an external extension (see [plugin-store-consul](docs/plugin-store-consul.md)).
Gateway replicas apply updates [...]
| Observability | Metrics and logging plugins, including Kafka and
Elasticsearch destinations; email and DingTalk alerts from Admin. |
| AI and MCP | AI proxy, prompt processing, token limits, sensitive-word
filtering, AI request/response transformation, and an MCP server plugin with
SSE and Streamable HTTP. |
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 65a7892c91..fb14b1835e 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -2,6 +2,14 @@
### API Changes
+- Apollo's in-tree registry, sync adapter, Admin listener and sync starter are
+ deprecated for transfer to plugin-store (#7599). All four remain available in
+ the release carrying this notice. Removal requires dev-list consensus, a full
+ released deprecation cycle, compatible external artifact publication and an
+ announced rollback window; no removal release is scheduled. See the
+ [migration guide](docs/plugin-store-apollo.md). Existing `apollo` type names,
+ keys and `ApolloPathConstants` remain compatibility contracts.
+
- `MemorySafeLRUMap` is deprecated since 2.7.2. The class, public constructors,
serialization identifier and existing behavior are retained for downstream
source and binary compatibility. No removal release is scheduled; a future
diff --git a/docs/plugin-store-apollo.md b/docs/plugin-store-apollo.md
new file mode 100644
index 0000000000..1c6bd65bae
--- /dev/null
+++ b/docs/plugin-store-apollo.md
@@ -0,0 +1,210 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+# Apollo plugin-store migration
+
+## Status and deprecation cycle
+
+Apollo is currently an optional, supported in-tree integration. Issue
[#7599](https://github.com/apache/shenyu/issues/7599)
+proposes transferring its registry, data-sync, Admin listener and gateway
starter to
+[plugin-store](https://github.com/apache/shenyu-plugin-store), extending
[#7306](https://github.com/apache/shenyu/issues/7306).
+This guide is the advance deprecation notice: the in-tree modules remain
available
+for the release carrying this notice. No removal release has been selected.
+The separate removal PR is a draft and must not be merged in that deprecation
release.
+
+| Stage | Required action |
+| --- | --- |
+| Agreement | Obtain and link the dev-list decision approving Apollo
externalization. |
+| Deprecation release | Ship this notice and migration guide in a core release
while retaining all four in-tree modules. Record that released version
publicly. |
+| Receiving parity | Build/test all four modules together in plugin-store,
verify external SPI loading and unchanged sync/registry configuration. |
+| Publication | Announce compatible core/store versions, publish external
artifacts before cutover, and reserve one publisher per Maven
group/artifact/version. |
+| Later core release | After the deprecation release has shipped, merge the
separate removal, update the release inventory, and announce the rollback
window. |
+
+Do not treat creating PRs, merging documentation, or producing local snapshot
JARs
+as completing the dev-list decision, a released deprecation cycle, or artifact
publication.
+Keep the issue open until all stages and their release evidence are complete.
+
+## Artifact ownership and installation
+
+The receiving `shenyu-extension-apollo` reactor owns these artifacts together:
+
+- `shenyu-admin-listener-apollo`
+- `shenyu-sync-data-apollo`
+- `shenyu-registry-apollo`
+- `shenyu-spring-boot-starter-sync-data-apollo`
+
+The preparation branch uses store `2.7.1-SNAPSHOT` against core
`2.7.2-SNAPSHOT`.
+These are development coordinates, not an announced release compatibility
matrix.
+For deployment, select the published store release declared compatible with
your core release.
+Use the core version for retained APIs and the store version for **all four**
Apollo artifacts.
+Keep exactly one provider version on each runtime classpath; the in-tree and
external
+implementations retain identical packages and must not coexist.
+
+Admin needs:
+
+```xml
+<dependency>
+ <groupId>org.apache.shenyu</groupId>
+ <artifactId>shenyu-admin-listener-apollo</artifactId>
+ <version>${store.version}</version>
+</dependency>
+```
+
+Gateway data synchronization needs:
+
+```xml
+<dependency>
+ <groupId>org.apache.shenyu</groupId>
+ <artifactId>shenyu-spring-boot-starter-sync-data-apollo</artifactId>
+ <version>${store.version}</version>
+</dependency>
+```
+
+Applications using Apollo instance registration or SDK instance discovery
additionally need:
+
+```xml
+<dependency>
+ <groupId>org.apache.shenyu</groupId>
+ <artifactId>shenyu-registry-apollo</artifactId>
+ <version>${store.version}</version>
+</dependency>
+```
+
+Gateway registration also requires the retained core
`shenyu-spring-boot-starter-registry`;
+SDK discovery requires the appropriate SDK starter. Apollo was never included
in the
+compatibility registry starter, so it remains an explicit provider dependency.
+For binary distributions, resolve the complete runtime dependency closure into
`lib/`,
+replace old Apollo JARs, and retain the extension's licensing information and
dependency notices.
+
+Shading continues to package Apollo client dependencies, but excludes retained
ShenYu
+API artifacts and sibling extension modules. API classes come from the
application's core artifacts, preserving
+class identity for external SPI loading. The published POM retains runtime
dependencies.
+
+## Enable Admin and gateway synchronization
+
+Admin keeps its existing property prefix and portal publishing settings:
+
+```yaml
+shenyu:
+ sync:
+ websocket:
+ enabled: false
+ apollo:
+ appId: shenyu
+ meta: http://apollo-config-service:8080
+ portalUrl: http://apollo-portal:8070
+ env: DEV
+ clusterName: default
+ namespace: application
+ token: ${APOLLO_OPENAPI_TOKEN}
+ operatorUser: apollo
+```
+
+Gateway keeps the same reading settings; remove or disable the previous sync
channel:
+
+```yaml
+shenyu:
+ namespace: 649330b6-c2d7-4edc-be8e-8a54df9eb385
+ sync:
+ websocket:
+ urls: false
+ apollo:
+ appId: shenyu
+ meta: http://apollo-config-service:8080
+ env: DEV
+ clusterName: default
+ namespace: application
+ accessKey: ${APOLLO_ACCESS_KEY:}
+```
+
+The portal OpenAPI token and config-service access key serve different APIs.
+Ensure the publishing app, environment, cluster and Apollo namespace match the
reader.
+The preserved reader calls Apollo `ConfigService.getAppConfig()`, so the
example uses
+`application`. This migration does not add arbitrary namespace selection.
+The ShenYu namespace ID is a separate tenant prefix inside Apollo item keys.
+The Apollo client sets JVM-wide app/meta/cluster properties; preserve the
existing
+process-level configuration when using sync and registry together.
+
+## Registry and SPI contract
+
+The external JAR continues to publish:
+
+```text
+META-INF/shenyu/org.apache.shenyu.registry.api.ShenyuInstanceRegisterRepository
+apollo=org.apache.shenyu.registry.apollo.ApolloInstanceRegisterRepository
+```
+
+`ShenyuInstanceRegisterRepositoryFactory.loadRepository("apollo")` resolves
that
+resource without any factory or core runtime change, and preserves the
non-singleton provider.
+Registry configuration remains:
+
+```yaml
+shenyu:
+ register:
+ enabled: true
+ registerType: apollo
+ serverLists: http://apollo-config-service:8080
+ props:
+ appId: shenyu
+ portalUrl: http://apollo-portal:8070
+ token: ${APOLLO_OPENAPI_TOKEN}
+ env: DEV
+ clusterName: default
+ namespace: application
+```
+
+SDK discovery uses the same `apollo` type and registry settings via its
existing SDK
+configuration; it does not replace backend HTTP annotation/API registration.
+Instance registration writes persistent portal items and publishes the
namespace.
+Existing shutdown removes listeners; it does not deregister persistent
instance items.
+Preserve that behavior during migration and apply your existing
instance-removal procedure.
+
+## Stored keys and shared compatibility shim
+
+| Data | Existing Apollo item key |
+| --- | --- |
+| Plugin | `<shenyuNamespace>.plugin.<pluginName>` |
+| Selector | `<shenyuNamespace>.selector.<pluginName>.<selectorId>` |
+| Rule | `<shenyuNamespace>.rule.<pluginName>.<selectorId>.<ruleId>` |
+| Authentication | `<shenyuNamespace>.auth.<appKey>` |
+| Metadata | `<shenyuNamespace>.meta.<metadataId>` |
+| Proxy selector |
`<shenyuNamespace>.proxy.selector.<pluginName>.<selectorId>` |
+| Discovery upstream | `<shenyuNamespace>.discovery.<pluginName>.<selectorId>`
|
+| Instance | `/shenyu/register/instance/<appName>/<host>:<port>` |
+
+The existing `.list` index items under each category/group are retained
alongside the data keys.
+JSON DTOs, key prefixes, namespace IDs and the `apollo` type remain unchanged.
+`org.apache.shenyu.common.constant.ApolloPathConstants` stays in core as a
small
+constants/path compatibility shim with no Apollo SDK dependency. Do not
duplicate that
+class in store JARs or migrate/delete existing keyspaces as part of this
transfer.
+
+The client versions remain `apollo-client`, `apollo-openapi` and `apollo-core`
`2.1.0`.
+Source and the Apollo clients are Apache-2.0; preserve licenses when
assembling custom packages.
+Existing unit tests, real Apollo `DefaultConfig` listener filtering tests and
starter
+configuration tests move with their modules. Those tests do not claim a full
live Apollo
+portal/config-service deployment; validate your staging deployment before
production cutover.
+
+## Upgrade and rollback
+
+1. After publication and release gates pass, back up the Admin database and
Apollo
+ application/namespace configuration, recording exact core/store versions
and deployed JARs.
+2. Verify the external artifacts in staging using unchanged namespace,
endpoints, tokens,
+ keys and registry properties. Check initial sync, create/update/delete and
instance updates.
+3. Roll Admin and gateways with complete external dependency closures, then
confirm
+ subsequent changes propagate and existing instance discovery still works.
+4. Retain the last in-tree release for the announced rollback window. To roll
back,
+ restore its images/JARs and configuration and remove the external Apollo
versions.
+ Reuse the same Admin database and Apollo keyspace; do not clear either
during rollback.
diff --git a/shenyu-registry/README.md b/shenyu-registry/README.md
index d91f0f8ef0..66ea84e1b5 100644
--- a/shenyu-registry/README.md
+++ b/shenyu-registry/README.md
@@ -40,7 +40,7 @@ runtime classpath, using the same ShenYu version as the
application:
| `zookeeper` | `shenyu-registry-zookeeper` |
| `etcd` | `shenyu-registry-etcd` |
| `nacos` | `shenyu-registry-nacos` |
-| `apollo` | `shenyu-registry-apollo` |
+| `apollo` | `shenyu-registry-apollo`; in-tree deprecation and planned
external ownership: [migration guide](../docs/plugin-store-apollo.md) |
| `eureka` | `shenyu-registry-eureka` |
| `kubernetes` | `shenyu-registry-kubernetes` |