This document defines gray release semantics for Config.
A Config resource may have:
- one formal config;
- zero or more gray config variants.
Gray variants are subordinate release state of the same Config identity:
namespaceId -> groupName -> dataId -> grayName
grayName is not a new top-level Config resource. Formal and gray variants
share the same namespaceId, groupName, and dataId, but may have different
content, md5, encrypted data key, last modified time, and gray rule.
A gray rule contains:
| Field | Meaning |
|---|---|
type |
Rule type, such as beta or tag. |
version |
Rule parser version. |
expr |
Raw rule expression. |
priority |
Higher priority rules are matched first. |
Rule implementations are loaded through Java SPI using GrayRule. A rule must
be parseable, valid, and able to match request labels.
| Rule | grayName |
Match label | Priority |
|---|---|---|---|
| Beta | beta |
ClientIp is in the comma-separated beta IP list. |
Integer.MAX_VALUE |
| Tag | tag_{tag} |
Vipserver-Tag equals the requested tag value. |
Integer.MAX_VALUE - 1 |
When multiple gray variants exist, matching uses descending priority and then
grayName order as the tie breaker.
A publish with betaIps writes the beta gray variant. A publish with tag
writes a tag gray variant. A formal publish writes the formal config when no
gray selector is provided.
Gray publish must:
- validate rule type, version, expression, and priority;
- enforce the maximum gray-version count, default
10throughnacos.config.gray.version.max.count; - persist gray content and rule metadata;
- publish a Config change event with the affected
grayName, following the Event Dispatch And NotifyCenter Spec; - record persistence trace with a gray-specific event type.
Deleting a gray variant removes only that variant and not the formal config.
Runtime query matches gray rules before formal config fallback:
- Build request labels from client IP, explicit tag, and connection labels.
- Iterate sorted gray variants.
- Return the first matching gray variant.
- If an explicit tag was requested and no tag gray matches, return tag-specific not-found.
- Otherwise return the formal config.
Admin beta query returns the beta variant when present. Admin formal query does not silently return gray content.
The current domain model is config_info_gray plus GrayRule. Beta and tag
gray variants are also represented in config_info_gray with their
corresponding grayName and serialized rule metadata.
Starting with the Nacos 3.3 line, runtime compatibility migration from the
legacy config_info_beta and config_info_tag tables into config_info_gray
is removed. Deployments that upgrade from versions before 3.0 and used beta
gray release must migrate that data before upgrading.
- TODO: Define a general rollout governance spec if future Config gray rules go beyond beta IP and tag matching.