Repository: alibaba/nacos
Branch: develop
Commit: 5ac5c39971e7
Files: 4319
Total size: 30.4 MB
Directory structure:
gitextract_u6qmkl26/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── ISSUE_TEMPLATE.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── anti-spam.yml
│ ├── ci.yml
│ ├── it.yml
│ ├── pr-ci.yml
│ ├── pr-comment.yml
│ ├── pr-e2e-test.yml
│ ├── push-ci.yaml
│ └── stale.yml
├── .gitignore
├── .mvn/
│ └── wrapper/
│ └── maven-wrapper.properties
├── .travis.yml
├── BUILDING
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTING_zh.md
├── LICENSE
├── NOTICE
├── README.md
├── REPORTING-BUGS.md
├── address/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── address/
│ │ │ ├── AddressServer.java
│ │ │ ├── component/
│ │ │ │ ├── AddressServerGeneratorManager.java
│ │ │ │ └── AddressServerManager.java
│ │ │ ├── config/
│ │ │ │ └── AddressServerSecurityConfiguration.java
│ │ │ ├── constant/
│ │ │ │ └── AddressServerConstants.java
│ │ │ ├── controller/
│ │ │ │ ├── AddressServerClusterController.java
│ │ │ │ └── ServerListController.java
│ │ │ └── misc/
│ │ │ └── Loggers.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ ├── logback/
│ │ │ │ └── nacos-included.xml
│ │ │ └── nacos-default.properties
│ │ └── application.properties
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── address/
│ ├── component/
│ │ ├── AddressServerGeneratorManagerTest.java
│ │ └── AddressServerManagerTests.java
│ └── controller/
│ ├── AddressServerClusterControllerTest.java
│ └── ServerListControllerTest.java
├── ai/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── ai/
│ │ │ ├── config/
│ │ │ │ ├── AiEnabledFilter.java
│ │ │ │ ├── McpCacheIndexProperties.java
│ │ │ │ ├── McpConfiguration.java
│ │ │ │ └── McpServerIndexConfiguration.java
│ │ │ ├── constant/
│ │ │ │ ├── Constants.java
│ │ │ │ └── McpServerValidationConstants.java
│ │ │ ├── controller/
│ │ │ │ ├── A2aAdminController.java
│ │ │ │ ├── McpAdminController.java
│ │ │ │ ├── PromptAdminController.java
│ │ │ │ ├── PromptClientController.java
│ │ │ │ └── SkillAdminController.java
│ │ │ ├── enums/
│ │ │ │ ├── ExternalDataTypeEnum.java
│ │ │ │ └── McpImportResultStatusEnum.java
│ │ │ ├── form/
│ │ │ │ ├── a2a/
│ │ │ │ │ └── admin/
│ │ │ │ │ ├── AgentCardForm.java
│ │ │ │ │ ├── AgentCardUpdateForm.java
│ │ │ │ │ ├── AgentForm.java
│ │ │ │ │ └── AgentListForm.java
│ │ │ │ ├── mcp/
│ │ │ │ │ └── admin/
│ │ │ │ │ ├── McpDetailForm.java
│ │ │ │ │ ├── McpForm.java
│ │ │ │ │ ├── McpImportForm.java
│ │ │ │ │ ├── McpListForm.java
│ │ │ │ │ └── McpUpdateForm.java
│ │ │ │ ├── prompt/
│ │ │ │ │ ├── PromptForm.java
│ │ │ │ │ ├── PromptHistoryForm.java
│ │ │ │ │ ├── PromptLabelBindForm.java
│ │ │ │ │ ├── PromptLabelForm.java
│ │ │ │ │ ├── PromptListForm.java
│ │ │ │ │ ├── PromptMetadataForm.java
│ │ │ │ │ ├── PromptPublishForm.java
│ │ │ │ │ └── PromptQueryForm.java
│ │ │ │ └── skills/
│ │ │ │ └── admin/
│ │ │ │ ├── SkillDetailForm.java
│ │ │ │ ├── SkillForm.java
│ │ │ │ ├── SkillListForm.java
│ │ │ │ └── SkillUpdateForm.java
│ │ │ ├── index/
│ │ │ │ ├── AbstractMcpServerIndex.java
│ │ │ │ ├── CachedMcpServerIndex.java
│ │ │ │ ├── McpCacheIndex.java
│ │ │ │ ├── McpServerIndex.java
│ │ │ │ ├── MemoryMcpCacheIndex.java
│ │ │ │ └── PlainMcpServerIndex.java
│ │ │ ├── model/
│ │ │ │ └── mcp/
│ │ │ │ ├── McpServerIndexData.java
│ │ │ │ ├── McpServerStorageInfo.java
│ │ │ │ └── UrlPageResult.java
│ │ │ ├── param/
│ │ │ │ ├── AgentHttpParamExtractor.java
│ │ │ │ ├── McpHttpParamExtractor.java
│ │ │ │ ├── PromptHttpParamExtractor.java
│ │ │ │ └── SkillHttpParamExtractor.java
│ │ │ ├── remote/
│ │ │ │ ├── handler/
│ │ │ │ │ ├── McpServerEndpointRequestHandler.java
│ │ │ │ │ ├── QueryMcpServerRequestHandler.java
│ │ │ │ │ ├── QueryPromptRequestHandler.java
│ │ │ │ │ ├── ReleaseMcpServerRequestHandler.java
│ │ │ │ │ └── a2a/
│ │ │ │ │ ├── AgentEndpointRequestHandler.java
│ │ │ │ │ ├── BatchAgentEndpointRequestHandler.java
│ │ │ │ │ ├── QueryAgentCardRequestHandler.java
│ │ │ │ │ └── ReleaseAgentCardRequestHandler.java
│ │ │ │ └── manager/
│ │ │ │ └── AiConnectionBasedClientManager.java
│ │ │ ├── service/
│ │ │ │ ├── McpEndpointOperationService.java
│ │ │ │ ├── McpExternalDataAdaptor.java
│ │ │ │ ├── McpServerCacheInvalidateService.java
│ │ │ │ ├── McpServerImportService.java
│ │ │ │ ├── McpServerOperationService.java
│ │ │ │ ├── McpServerValidationService.java
│ │ │ │ ├── McpToolOperationService.java
│ │ │ │ ├── SimpleSyncEffectService.java
│ │ │ │ ├── SyncEffectService.java
│ │ │ │ ├── a2a/
│ │ │ │ │ ├── A2aServerOperationService.java
│ │ │ │ │ └── identity/
│ │ │ │ │ ├── AgentIdCodec.java
│ │ │ │ │ ├── AgentIdCodecHolder.java
│ │ │ │ │ └── AsciiAgentIdCodec.java
│ │ │ │ ├── prompt/
│ │ │ │ │ ├── PromptAdminOperationService.java
│ │ │ │ │ ├── PromptAdminOperationServiceImpl.java
│ │ │ │ │ ├── PromptClientOperationService.java
│ │ │ │ │ ├── PromptClientOperationServiceImpl.java
│ │ │ │ │ ├── PromptLabelVersionMappingSnapshot.java
│ │ │ │ │ ├── PromptMetaCacheInvalidateService.java
│ │ │ │ │ ├── PromptMetaSnapshot.java
│ │ │ │ │ └── PromptMetaUtils.java
│ │ │ │ └── skills/
│ │ │ │ ├── SkillOperationService.java
│ │ │ │ └── SkillOperationServiceImpl.java
│ │ │ └── utils/
│ │ │ ├── AgentCardUtil.java
│ │ │ ├── AgentEndpointUtil.java
│ │ │ ├── AgentRequestUtil.java
│ │ │ ├── McpConfigUtils.java
│ │ │ ├── McpRequestUtil.java
│ │ │ ├── PromptDataIdUtils.java
│ │ │ ├── PromptVersionUtils.java
│ │ │ ├── SkillRequestUtil.java
│ │ │ └── SkillZipParser.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.ai.service.McpServerOperationService
│ │ ├── com.alibaba.nacos.core.paramcheck.AbstractHttpParamExtractor
│ │ └── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── ai/
│ ├── config/
│ │ ├── AiEnabledFilterTest.java
│ │ ├── McpCacheIndexPropertiesTest.java
│ │ ├── McpConfigurationTest.java
│ │ └── McpServerIndexConfigurationTest.java
│ ├── controller/
│ │ ├── A2aAdminControllerTest.java
│ │ ├── McpAdminControllerTest.java
│ │ └── PromptClientControllerTest.java
│ ├── form/
│ │ ├── a2a/
│ │ │ └── admin/
│ │ │ ├── AgentCardFormTest.java
│ │ │ ├── AgentFormTest.java
│ │ │ └── AgentListFormTest.java
│ │ ├── mcp/
│ │ │ └── admin/
│ │ │ └── McpImportFormTest.java
│ │ └── prompt/
│ │ ├── PromptFormTest.java
│ │ ├── PromptHistoryFormTest.java
│ │ ├── PromptLabelBindFormTest.java
│ │ ├── PromptLabelFormTest.java
│ │ ├── PromptListFormTest.java
│ │ └── PromptPublishFormTest.java
│ ├── index/
│ │ ├── AbstractMcpServerIndexTest.java
│ │ ├── CachedMcpServerIndexTest.java
│ │ ├── McpCachePerformanceTest.java
│ │ ├── MemoryMcpCacheIndexTest.java
│ │ └── PlainMcpServerIndexTest.java
│ ├── param/
│ │ ├── AgentHttpParamExtractorTest.java
│ │ └── McpHttpParamExtractorTest.java
│ ├── remote/
│ │ ├── handler/
│ │ │ ├── McpServerEndpointRequestHandlerTest.java
│ │ │ ├── QueryMcpServerRequestHandlerTest.java
│ │ │ ├── QueryPromptRequestHandlerTest.java
│ │ │ ├── ReleaseMcpServerRequestHandlerTest.java
│ │ │ └── a2a/
│ │ │ ├── AgentEndpointRequestHandlerTest.java
│ │ │ ├── BatchAgentEndpointRequestHandlerTest.java
│ │ │ ├── QueryAgentCardRequestHandlerTest.java
│ │ │ └── ReleaseAgentCardRequestHandlerTest.java
│ │ └── manager/
│ │ └── AiConnectionBasedClientManagerTest.java
│ ├── service/
│ │ ├── McpEndpointOperationServiceTest.java
│ │ ├── McpExternalDataAdaptorTest.java
│ │ ├── McpServerCacheInvalidateServiceTest.java
│ │ ├── McpServerImportServiceTest.java
│ │ ├── McpServerOperationServiceTest.java
│ │ ├── McpServerValidationServiceTest.java
│ │ ├── McpToolOperationServiceTest.java
│ │ ├── SimpleSyncEffectServiceTest.java
│ │ ├── SyncEffectServiceTest.java
│ │ ├── a2a/
│ │ │ ├── A2aServerOperationServiceTest.java
│ │ │ └── identity/
│ │ │ ├── AgentIdCodecHolderTest.java
│ │ │ └── AsciiAgentIdCodecTest.java
│ │ ├── prompt/
│ │ │ ├── PromptAdminOperationServiceImplTest.java
│ │ │ ├── PromptClientOperationServiceImplTest.java
│ │ │ ├── PromptMetaCacheInvalidateServiceTest.java
│ │ │ └── PromptMetaUtilsTest.java
│ │ └── skills/
│ │ └── SkillOperationServiceImplTest.java
│ └── utils/
│ ├── AgentCardUtilTest.java
│ ├── AgentEndpointUtilTest.java
│ ├── AgentRequestUtilTest.java
│ ├── McpConfigUtilsTest.java
│ ├── McpRequestUtilTest.java
│ ├── McpRequestUtilsTest.java
│ ├── PromptDataIdUtilsTest.java
│ └── SkillZipParserTest.java
├── api/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── api/
│ │ │ ├── NacosFactory.java
│ │ │ ├── PropertyKeyConst.java
│ │ │ ├── SystemPropertyKeyConst.java
│ │ │ ├── ability/
│ │ │ │ ├── ClientAbilities.java
│ │ │ │ ├── ServerAbilities.java
│ │ │ │ ├── constant/
│ │ │ │ │ ├── AbilityKey.java
│ │ │ │ │ ├── AbilityMode.java
│ │ │ │ │ └── AbilityStatus.java
│ │ │ │ ├── initializer/
│ │ │ │ │ ├── AbilityInitializer.java
│ │ │ │ │ └── AbilityPostProcessor.java
│ │ │ │ └── register/
│ │ │ │ ├── AbstractAbilityRegistry.java
│ │ │ │ └── impl/
│ │ │ │ ├── ClusterClientAbilities.java
│ │ │ │ ├── SdkClientAbilities.java
│ │ │ │ └── ServerAbilities.java
│ │ │ ├── ai/
│ │ │ │ ├── A2aService.java
│ │ │ │ ├── AiFactory.java
│ │ │ │ ├── AiService.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── AiConstants.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── AbstractNacosAgentCardListener.java
│ │ │ │ │ ├── AbstractNacosMcpServerListener.java
│ │ │ │ │ ├── AbstractNacosPromptListener.java
│ │ │ │ │ ├── AbstractNacosSkillListener.java
│ │ │ │ │ ├── NacosAgentCardEvent.java
│ │ │ │ │ ├── NacosAiEvent.java
│ │ │ │ │ ├── NacosAiListener.java
│ │ │ │ │ ├── NacosMcpServerEvent.java
│ │ │ │ │ ├── NacosPromptEvent.java
│ │ │ │ │ └── NacosSkillEvent.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── a2a/
│ │ │ │ │ │ ├── AgentAuthentication.java
│ │ │ │ │ │ ├── AgentCapabilities.java
│ │ │ │ │ │ ├── AgentCard.java
│ │ │ │ │ │ ├── AgentCardBasicInfo.java
│ │ │ │ │ │ ├── AgentCardDetailInfo.java
│ │ │ │ │ │ ├── AgentCardVersionInfo.java
│ │ │ │ │ │ ├── AgentEndpoint.java
│ │ │ │ │ │ ├── AgentExtension.java
│ │ │ │ │ │ ├── AgentInterface.java
│ │ │ │ │ │ ├── AgentProvider.java
│ │ │ │ │ │ ├── AgentSkill.java
│ │ │ │ │ │ ├── AgentVersionDetail.java
│ │ │ │ │ │ └── SecurityScheme.java
│ │ │ │ │ ├── mcp/
│ │ │ │ │ │ ├── EncryptObject.java
│ │ │ │ │ │ ├── FrontEndpointConfig.java
│ │ │ │ │ │ ├── McpCapability.java
│ │ │ │ │ │ ├── McpEndpointInfo.java
│ │ │ │ │ │ ├── McpEndpointSpec.java
│ │ │ │ │ │ ├── McpServerBasicInfo.java
│ │ │ │ │ │ ├── McpServerDetailInfo.java
│ │ │ │ │ │ ├── McpServerImportRequest.java
│ │ │ │ │ │ ├── McpServerImportResponse.java
│ │ │ │ │ │ ├── McpServerImportResult.java
│ │ │ │ │ │ ├── McpServerImportValidationResult.java
│ │ │ │ │ │ ├── McpServerRemoteServiceConfig.java
│ │ │ │ │ │ ├── McpServerValidationItem.java
│ │ │ │ │ │ ├── McpServerVersionInfo.java
│ │ │ │ │ │ ├── McpServiceRef.java
│ │ │ │ │ │ ├── McpTool.java
│ │ │ │ │ │ ├── McpToolAnnotations.java
│ │ │ │ │ │ ├── McpToolMeta.java
│ │ │ │ │ │ ├── McpToolSpecification.java
│ │ │ │ │ │ ├── SecurityScheme.java
│ │ │ │ │ │ └── registry/
│ │ │ │ │ │ ├── Argument.java
│ │ │ │ │ │ ├── Icon.java
│ │ │ │ │ │ ├── Input.java
│ │ │ │ │ │ ├── InputWithVariables.java
│ │ │ │ │ │ ├── KeyValueInput.java
│ │ │ │ │ │ ├── McpErrorResponse.java
│ │ │ │ │ │ ├── McpRegistryServerDetail.java
│ │ │ │ │ │ ├── McpRegistryServerList.java
│ │ │ │ │ │ ├── McpServerStatusEnum.java
│ │ │ │ │ │ ├── NamedArgument.java
│ │ │ │ │ │ ├── OfficialMeta.java
│ │ │ │ │ │ ├── Package.java
│ │ │ │ │ │ ├── PositionalArgument.java
│ │ │ │ │ │ ├── Remote.java
│ │ │ │ │ │ ├── Repository.java
│ │ │ │ │ │ ├── ServerResponse.java
│ │ │ │ │ │ ├── ServerVersionDetail.java
│ │ │ │ │ │ ├── SseTransport.java
│ │ │ │ │ │ ├── StdioTransport.java
│ │ │ │ │ │ └── StreamableHttpTransport.java
│ │ │ │ │ ├── prompt/
│ │ │ │ │ │ ├── Prompt.java
│ │ │ │ │ │ ├── PromptDescriptor.java
│ │ │ │ │ │ ├── PromptLabelVersionMapping.java
│ │ │ │ │ │ ├── PromptMetaInfo.java
│ │ │ │ │ │ ├── PromptMetaSummary.java
│ │ │ │ │ │ ├── PromptVariable.java
│ │ │ │ │ │ ├── PromptVersionInfo.java
│ │ │ │ │ │ └── PromptVersionSummary.java
│ │ │ │ │ └── skills/
│ │ │ │ │ ├── Skill.java
│ │ │ │ │ ├── SkillBasicInfo.java
│ │ │ │ │ ├── SkillResource.java
│ │ │ │ │ └── SkillUtils.java
│ │ │ │ └── remote/
│ │ │ │ ├── AiRemoteConstants.java
│ │ │ │ ├── request/
│ │ │ │ │ ├── AbstractAgentRequest.java
│ │ │ │ │ ├── AbstractMcpRequest.java
│ │ │ │ │ ├── AbstractPromptRequest.java
│ │ │ │ │ ├── AgentEndpointRequest.java
│ │ │ │ │ ├── BatchAgentEndpointRequest.java
│ │ │ │ │ ├── McpServerEndpointRequest.java
│ │ │ │ │ ├── QueryAgentCardRequest.java
│ │ │ │ │ ├── QueryMcpServerRequest.java
│ │ │ │ │ ├── QueryPromptRequest.java
│ │ │ │ │ ├── ReleaseAgentCardRequest.java
│ │ │ │ │ └── ReleaseMcpServerRequest.java
│ │ │ │ └── response/
│ │ │ │ ├── AgentEndpointResponse.java
│ │ │ │ ├── McpServerEndpointResponse.java
│ │ │ │ ├── QueryAgentCardResponse.java
│ │ │ │ ├── QueryMcpServerResponse.java
│ │ │ │ ├── QueryPromptResponse.java
│ │ │ │ ├── ReleaseAgentCardResponse.java
│ │ │ │ └── ReleaseMcpServerResponse.java
│ │ │ ├── annotation/
│ │ │ │ ├── NacosApi.java
│ │ │ │ ├── NacosInjected.java
│ │ │ │ └── NacosProperties.java
│ │ │ ├── cmdb/
│ │ │ │ ├── pojo/
│ │ │ │ │ ├── Entity.java
│ │ │ │ │ ├── EntityEvent.java
│ │ │ │ │ ├── EntityEventType.java
│ │ │ │ │ ├── Label.java
│ │ │ │ │ └── PreservedEntityTypes.java
│ │ │ │ └── spi/
│ │ │ │ └── CmdbService.java
│ │ │ ├── common/
│ │ │ │ ├── Constants.java
│ │ │ │ ├── NodeState.java
│ │ │ │ └── ResponseCode.java
│ │ │ ├── config/
│ │ │ │ ├── ConfigChangeEvent.java
│ │ │ │ ├── ConfigChangeItem.java
│ │ │ │ ├── ConfigFactory.java
│ │ │ │ ├── ConfigQueryResult.java
│ │ │ │ ├── ConfigService.java
│ │ │ │ ├── ConfigType.java
│ │ │ │ ├── PropertyChangeType.java
│ │ │ │ ├── ability/
│ │ │ │ │ ├── ClientConfigAbility.java
│ │ │ │ │ └── ServerConfigAbility.java
│ │ │ │ ├── annotation/
│ │ │ │ │ ├── NacosConfigListener.java
│ │ │ │ │ ├── NacosConfigurationProperties.java
│ │ │ │ │ ├── NacosIgnore.java
│ │ │ │ │ ├── NacosProperty.java
│ │ │ │ │ └── NacosValue.java
│ │ │ │ ├── convert/
│ │ │ │ │ └── NacosConfigConverter.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── AbstractConfigFilter.java
│ │ │ │ │ ├── IConfigContext.java
│ │ │ │ │ ├── IConfigFilter.java
│ │ │ │ │ ├── IConfigFilterChain.java
│ │ │ │ │ ├── IConfigRequest.java
│ │ │ │ │ └── IConfigResponse.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── AbstractFuzzyWatchEventWatcher.java
│ │ │ │ │ ├── AbstractListener.java
│ │ │ │ │ ├── AbstractSharedListener.java
│ │ │ │ │ ├── ConfigChangeParser.java
│ │ │ │ │ ├── ConfigFuzzyWatchChangeEvent.java
│ │ │ │ │ ├── FuzzyWatchEventWatcher.java
│ │ │ │ │ ├── FuzzyWatchLoadWatcher.java
│ │ │ │ │ └── Listener.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── ConfigBasicInfo.java
│ │ │ │ │ ├── ConfigCloneInfo.java
│ │ │ │ │ ├── ConfigDetailInfo.java
│ │ │ │ │ ├── ConfigGrayInfo.java
│ │ │ │ │ ├── ConfigHistoryBasicInfo.java
│ │ │ │ │ ├── ConfigHistoryDetailInfo.java
│ │ │ │ │ ├── ConfigListenerInfo.java
│ │ │ │ │ └── SameConfigPolicy.java
│ │ │ │ └── remote/
│ │ │ │ ├── request/
│ │ │ │ │ ├── AbstractConfigRequest.java
│ │ │ │ │ ├── AbstractFuzzyWatchNotifyRequest.java
│ │ │ │ │ ├── ClientConfigMetricRequest.java
│ │ │ │ │ ├── ConfigBatchListenRequest.java
│ │ │ │ │ ├── ConfigChangeNotifyRequest.java
│ │ │ │ │ ├── ConfigFuzzyWatchChangeNotifyRequest.java
│ │ │ │ │ ├── ConfigFuzzyWatchRequest.java
│ │ │ │ │ ├── ConfigFuzzyWatchSyncRequest.java
│ │ │ │ │ ├── ConfigPublishRequest.java
│ │ │ │ │ ├── ConfigQueryRequest.java
│ │ │ │ │ ├── ConfigRemoveRequest.java
│ │ │ │ │ └── cluster/
│ │ │ │ │ └── ConfigChangeClusterSyncRequest.java
│ │ │ │ └── response/
│ │ │ │ ├── ClientConfigMetricResponse.java
│ │ │ │ ├── ConfigChangeBatchListenResponse.java
│ │ │ │ ├── ConfigChangeNotifyResponse.java
│ │ │ │ ├── ConfigFuzzyWatchChangeNotifyResponse.java
│ │ │ │ ├── ConfigFuzzyWatchResponse.java
│ │ │ │ ├── ConfigFuzzyWatchSyncResponse.java
│ │ │ │ ├── ConfigPublishResponse.java
│ │ │ │ ├── ConfigQueryResponse.java
│ │ │ │ ├── ConfigRemoveResponse.java
│ │ │ │ └── cluster/
│ │ │ │ └── ConfigChangeClusterSyncResponse.java
│ │ │ ├── exception/
│ │ │ │ ├── NacosException.java
│ │ │ │ ├── api/
│ │ │ │ │ └── NacosApiException.java
│ │ │ │ └── runtime/
│ │ │ │ ├── NacosDeserializationException.java
│ │ │ │ ├── NacosLoadException.java
│ │ │ │ ├── NacosRuntimeException.java
│ │ │ │ └── NacosSerializationException.java
│ │ │ ├── grpc/
│ │ │ │ └── auto/
│ │ │ │ ├── BiRequestStreamGrpc.java
│ │ │ │ ├── Metadata.java
│ │ │ │ ├── MetadataOrBuilder.java
│ │ │ │ ├── NacosGrpcService.java
│ │ │ │ ├── Payload.java
│ │ │ │ ├── PayloadOrBuilder.java
│ │ │ │ └── RequestGrpc.java
│ │ │ ├── lock/
│ │ │ │ ├── LockService.java
│ │ │ │ ├── NacosLockFactory.java
│ │ │ │ ├── common/
│ │ │ │ │ └── LockConstants.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── PropertyConstants.java
│ │ │ │ ├── model/
│ │ │ │ │ └── LockInstance.java
│ │ │ │ └── remote/
│ │ │ │ ├── AbstractLockRequest.java
│ │ │ │ ├── LockOperationEnum.java
│ │ │ │ ├── request/
│ │ │ │ │ └── LockOperationRequest.java
│ │ │ │ └── response/
│ │ │ │ └── LockOperationResponse.java
│ │ │ ├── model/
│ │ │ │ ├── NacosForm.java
│ │ │ │ ├── Page.java
│ │ │ │ ├── response/
│ │ │ │ │ ├── ConnectionInfo.java
│ │ │ │ │ ├── ConnectionMetaInfo.java
│ │ │ │ │ ├── IdGeneratorInfo.java
│ │ │ │ │ ├── NacosMember.java
│ │ │ │ │ ├── Namespace.java
│ │ │ │ │ ├── ServerLoaderMetric.java
│ │ │ │ │ └── ServerLoaderMetrics.java
│ │ │ │ └── v2/
│ │ │ │ ├── ErrorCode.java
│ │ │ │ ├── Result.java
│ │ │ │ └── SupportedLanguage.java
│ │ │ ├── naming/
│ │ │ │ ├── CommonParams.java
│ │ │ │ ├── NamingFactory.java
│ │ │ │ ├── NamingMaintainFactory.java
│ │ │ │ ├── NamingMaintainService.java
│ │ │ │ ├── NamingResponseCode.java
│ │ │ │ ├── NamingService.java
│ │ │ │ ├── PreservedMetadataKeys.java
│ │ │ │ ├── ability/
│ │ │ │ │ ├── ClientNamingAbility.java
│ │ │ │ │ └── ServerNamingAbility.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── AbstractEventListener.java
│ │ │ │ │ ├── AbstractFuzzyWatchEventWatcher.java
│ │ │ │ │ ├── Event.java
│ │ │ │ │ ├── EventListener.java
│ │ │ │ │ ├── FuzzyWatchChangeEvent.java
│ │ │ │ │ ├── FuzzyWatchEventWatcher.java
│ │ │ │ │ ├── FuzzyWatchLoadWatcher.java
│ │ │ │ │ └── NamingEvent.java
│ │ │ │ ├── pojo/
│ │ │ │ │ ├── Cluster.java
│ │ │ │ │ ├── Instance.java
│ │ │ │ │ ├── ListView.java
│ │ │ │ │ ├── Service.java
│ │ │ │ │ ├── ServiceInfo.java
│ │ │ │ │ ├── builder/
│ │ │ │ │ │ └── InstanceBuilder.java
│ │ │ │ │ ├── healthcheck/
│ │ │ │ │ │ ├── AbstractHealthChecker.java
│ │ │ │ │ │ ├── HealthCheckType.java
│ │ │ │ │ │ ├── HealthCheckerFactory.java
│ │ │ │ │ │ └── impl/
│ │ │ │ │ │ ├── Http.java
│ │ │ │ │ │ ├── Mysql.java
│ │ │ │ │ │ └── Tcp.java
│ │ │ │ │ └── maintainer/
│ │ │ │ │ ├── ClientPublisherInfo.java
│ │ │ │ │ ├── ClientServiceInfo.java
│ │ │ │ │ ├── ClientSubscriberInfo.java
│ │ │ │ │ ├── ClientSummaryInfo.java
│ │ │ │ │ ├── ClusterInfo.java
│ │ │ │ │ ├── InstanceMetadataBatchResult.java
│ │ │ │ │ ├── MetricsInfo.java
│ │ │ │ │ ├── ServiceDetailInfo.java
│ │ │ │ │ ├── ServiceView.java
│ │ │ │ │ └── SubscriberInfo.java
│ │ │ │ ├── remote/
│ │ │ │ │ ├── NamingRemoteConstants.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── AbstractFuzzyWatchNotifyRequest.java
│ │ │ │ │ │ ├── AbstractNamingRequest.java
│ │ │ │ │ │ ├── BatchInstanceRequest.java
│ │ │ │ │ │ ├── InstanceRequest.java
│ │ │ │ │ │ ├── NamingFuzzyWatchChangeNotifyRequest.java
│ │ │ │ │ │ ├── NamingFuzzyWatchRequest.java
│ │ │ │ │ │ ├── NamingFuzzyWatchSyncRequest.java
│ │ │ │ │ │ ├── NotifySubscriberRequest.java
│ │ │ │ │ │ ├── PersistentInstanceRequest.java
│ │ │ │ │ │ ├── ServiceListRequest.java
│ │ │ │ │ │ ├── ServiceQueryRequest.java
│ │ │ │ │ │ └── SubscribeServiceRequest.java
│ │ │ │ │ └── response/
│ │ │ │ │ ├── BatchInstanceResponse.java
│ │ │ │ │ ├── InstanceResponse.java
│ │ │ │ │ ├── NamingFuzzyWatchChangeNotifyResponse.java
│ │ │ │ │ ├── NamingFuzzyWatchResponse.java
│ │ │ │ │ ├── NamingFuzzyWatchSyncResponse.java
│ │ │ │ │ ├── NotifySubscriberResponse.java
│ │ │ │ │ ├── QueryServiceResponse.java
│ │ │ │ │ ├── ServiceListResponse.java
│ │ │ │ │ └── SubscribeServiceResponse.java
│ │ │ │ ├── selector/
│ │ │ │ │ ├── NamingContext.java
│ │ │ │ │ ├── NamingResult.java
│ │ │ │ │ └── NamingSelector.java
│ │ │ │ ├── spi/
│ │ │ │ │ └── generator/
│ │ │ │ │ └── InstanceIdGenerator.java
│ │ │ │ └── utils/
│ │ │ │ └── NamingUtils.java
│ │ │ ├── plugin/
│ │ │ │ ├── ConfigItemDefinition.java
│ │ │ │ ├── ConfigItemType.java
│ │ │ │ ├── PluginConfigSpec.java
│ │ │ │ ├── PluginProvider.java
│ │ │ │ ├── PluginStateChecker.java
│ │ │ │ ├── PluginStateCheckerHolder.java
│ │ │ │ └── PluginType.java
│ │ │ ├── remote/
│ │ │ │ ├── AbstractPushCallBack.java
│ │ │ │ ├── AbstractRequestCallBack.java
│ │ │ │ ├── DefaultRequestFuture.java
│ │ │ │ ├── Payload.java
│ │ │ │ ├── PushCallBack.java
│ │ │ │ ├── RemoteConstants.java
│ │ │ │ ├── RequestCallBack.java
│ │ │ │ ├── RequestFuture.java
│ │ │ │ ├── Requester.java
│ │ │ │ ├── RpcScheduledExecutor.java
│ │ │ │ ├── ability/
│ │ │ │ │ ├── ClientRemoteAbility.java
│ │ │ │ │ └── ServerRemoteAbility.java
│ │ │ │ ├── request/
│ │ │ │ │ ├── ClientDetectionRequest.java
│ │ │ │ │ ├── ConnectResetRequest.java
│ │ │ │ │ ├── ConnectionSetupRequest.java
│ │ │ │ │ ├── HealthCheckRequest.java
│ │ │ │ │ ├── InternalRequest.java
│ │ │ │ │ ├── PushAckRequest.java
│ │ │ │ │ ├── Request.java
│ │ │ │ │ ├── RequestMeta.java
│ │ │ │ │ ├── ServerCheckRequest.java
│ │ │ │ │ ├── ServerLoaderInfoRequest.java
│ │ │ │ │ ├── ServerReloadRequest.java
│ │ │ │ │ ├── ServerRequest.java
│ │ │ │ │ └── SetupAckRequest.java
│ │ │ │ └── response/
│ │ │ │ ├── ClientDetectionResponse.java
│ │ │ │ ├── ConnectResetResponse.java
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ ├── HealthCheckResponse.java
│ │ │ │ ├── Response.java
│ │ │ │ ├── ResponseCode.java
│ │ │ │ ├── ServerCheckResponse.java
│ │ │ │ ├── ServerLoaderInfoResponse.java
│ │ │ │ ├── ServerReloadResponse.java
│ │ │ │ └── SetupAckResponse.java
│ │ │ ├── selector/
│ │ │ │ ├── AbstractCmdbSelector.java
│ │ │ │ ├── AbstractSelector.java
│ │ │ │ ├── ExpressionSelector.java
│ │ │ │ ├── NoneSelector.java
│ │ │ │ ├── Selector.java
│ │ │ │ ├── SelectorType.java
│ │ │ │ ├── client/
│ │ │ │ │ ├── SelectResult.java
│ │ │ │ │ └── Selector.java
│ │ │ │ └── context/
│ │ │ │ ├── CmdbContext.java
│ │ │ │ └── SelectorContextBuilder.java
│ │ │ └── utils/
│ │ │ ├── NetUtils.java
│ │ │ └── StringUtils.java
│ │ ├── proto/
│ │ │ └── nacos_grpc_service.proto
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.api.remote.Payload
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ ├── api/
│ │ ├── NacosFactoryTest.java
│ │ ├── ability/
│ │ │ ├── ClientAbilitiesTest.java
│ │ │ ├── ServerAbilitiesTest.java
│ │ │ └── register/
│ │ │ └── impl/
│ │ │ ├── ClusterClientAbilitiesTest.java
│ │ │ ├── SdkClientAbilitiesTest.java
│ │ │ └── ServerAbilitiesTest.java
│ │ ├── ai/
│ │ │ ├── A2aServiceDefaultMethodTest.java
│ │ │ ├── AiFactoryTest.java
│ │ │ ├── constant/
│ │ │ │ └── AiConstantsStatusMappingTest.java
│ │ │ ├── listener/
│ │ │ │ ├── NacosAgentCardEventTest.java
│ │ │ │ ├── NacosAiListenerDefaultMethodTest.java
│ │ │ │ └── NacosMcpServerEventTest.java
│ │ │ ├── model/
│ │ │ │ ├── a2a/
│ │ │ │ │ ├── AgentAuthenticationTest.java
│ │ │ │ │ ├── AgentCapabilitiesTest.java
│ │ │ │ │ ├── AgentCardBasicInfoTest.java
│ │ │ │ │ ├── AgentCardDetailInfoTest.java
│ │ │ │ │ ├── AgentCardTest.java
│ │ │ │ │ ├── AgentCardVersionInfoTest.java
│ │ │ │ │ ├── AgentEndpointTest.java
│ │ │ │ │ ├── AgentExtensionTest.java
│ │ │ │ │ ├── AgentInterfaceTest.java
│ │ │ │ │ ├── AgentProviderTest.java
│ │ │ │ │ ├── AgentSkillTest.java
│ │ │ │ │ ├── AgentVersionDetailTest.java
│ │ │ │ │ └── SecuritySchemeTest.java
│ │ │ │ ├── mcp/
│ │ │ │ │ ├── EncryptObjectTest.java
│ │ │ │ │ ├── FrontEndpointConfigTest.java
│ │ │ │ │ ├── McpCapabilityTest.java
│ │ │ │ │ ├── McpEndpointInfoTest.java
│ │ │ │ │ ├── McpEndpointSpecTest.java
│ │ │ │ │ ├── McpServerBasicInfoEnhancedFieldsTest.java
│ │ │ │ │ ├── McpServerBasicInfoTest.java
│ │ │ │ │ ├── McpServerDetailInfoTest.java
│ │ │ │ │ ├── McpServerImportRequestTest.java
│ │ │ │ │ ├── McpServerImportResponseTest.java
│ │ │ │ │ ├── McpServerImportResultTest.java
│ │ │ │ │ ├── McpServerImportValidationResultTest.java
│ │ │ │ │ ├── McpServerRemoteServiceConfigTest.java
│ │ │ │ │ ├── McpServerValidationItemTest.java
│ │ │ │ │ ├── McpServerVersionInfoTest.java
│ │ │ │ │ ├── McpServiceRefTest.java
│ │ │ │ │ ├── McpToolMetaTest.java
│ │ │ │ │ ├── McpToolSpecificationTest.java
│ │ │ │ │ ├── McpToolTest.java
│ │ │ │ │ ├── SecuritySchemeTest.java
│ │ │ │ │ └── registry/
│ │ │ │ │ ├── IconTest.java
│ │ │ │ │ ├── InputTest.java
│ │ │ │ │ ├── InputWithVariablesTest.java
│ │ │ │ │ ├── KeyValueInputTest.java
│ │ │ │ │ ├── McpErrorResponseTest.java
│ │ │ │ │ ├── McpRegistryServerListTest.java
│ │ │ │ │ ├── McpServerStatusEnumTest.java
│ │ │ │ │ ├── MetaTest.java
│ │ │ │ │ ├── NacosMcpRegistryServerDetailTest.java
│ │ │ │ │ ├── NamedArgumentTest.java
│ │ │ │ │ ├── OfficialMetaTest.java
│ │ │ │ │ ├── PackageTest.java
│ │ │ │ │ ├── PackageTransportTest.java
│ │ │ │ │ ├── PositionalArgumentTest.java
│ │ │ │ │ ├── RemoteTest.java
│ │ │ │ │ ├── RepositoryTest.java
│ │ │ │ │ ├── ServerResponseTest.java
│ │ │ │ │ ├── ServerVersionDetailTest.java
│ │ │ │ │ └── TransportTest.java
│ │ │ │ └── skills/
│ │ │ │ └── SkillUtilsTest.java
│ │ │ └── remote/
│ │ │ ├── request/
│ │ │ │ ├── AbstractAgentRequestTest.java
│ │ │ │ ├── AgentEndpointRequestTest.java
│ │ │ │ ├── BatchAgentEndpointRequestTest.java
│ │ │ │ ├── McpServerEndpointRequestTest.java
│ │ │ │ ├── QueryAgentCardRequestTest.java
│ │ │ │ ├── QueryMcpServerRequestTest.java
│ │ │ │ ├── ReleaseAgentCardRequestTest.java
│ │ │ │ └── ReleaseMcpServerRequestTest.java
│ │ │ └── response/
│ │ │ ├── AgentEndpointResponseTest.java
│ │ │ ├── McpServerEndpointResponseTest.java
│ │ │ ├── QueryAgentCardResponseTest.java
│ │ │ ├── QueryMcpServerResponseTest.java
│ │ │ ├── ReleaseAgentCardResponseTest.java
│ │ │ └── ReleaseMcpServerResponseTest.java
│ │ ├── annotation/
│ │ │ └── NacosPropertiesTest.java
│ │ ├── cmdb/
│ │ │ └── pojo/
│ │ │ ├── EntityEventTest.java
│ │ │ ├── EntityTest.java
│ │ │ └── LabelTest.java
│ │ ├── config/
│ │ │ ├── ConfigChangeEventTest.java
│ │ │ ├── ConfigChangeItemTest.java
│ │ │ ├── ConfigFactoryTest.java
│ │ │ ├── ConfigTypeTest.java
│ │ │ ├── ability/
│ │ │ │ ├── ClientRemoteAbilityTest.java
│ │ │ │ ├── ServerConfigAbilityTest.java
│ │ │ │ └── ServerRemoteAbilityTest.java
│ │ │ ├── listener/
│ │ │ │ ├── AbstractFuzzyWatchEventWatcherTest.java
│ │ │ │ ├── AbstractListenerTest.java
│ │ │ │ ├── AbstractSharedListenerTest.java
│ │ │ │ └── ConfigFuzzyWatchChangeEventTest.java
│ │ │ ├── model/
│ │ │ │ ├── ConfigCloneInfoTest.java
│ │ │ │ ├── ConfigHistoryInfoTest.java
│ │ │ │ ├── ConfigInfoTest.java
│ │ │ │ ├── ConfigListenerInfoTest.java
│ │ │ │ └── SameConfigPolicyTest.java
│ │ │ └── remote/
│ │ │ ├── request/
│ │ │ │ ├── BasedConfigRequestTest.java
│ │ │ │ ├── ClientConfigMetricRequestTest.java
│ │ │ │ ├── ConfigBatchListenRequestTest.java
│ │ │ │ ├── ConfigChangeNotifyRequestTest.java
│ │ │ │ ├── ConfigFuzzyWatchChangeNotifyRequestTest.java
│ │ │ │ ├── ConfigFuzzyWatchRequestTest.java
│ │ │ │ ├── ConfigFuzzyWatchSyncRequestTest.java
│ │ │ │ ├── ConfigPublishRequestTest.java
│ │ │ │ ├── ConfigQueryRequestTest.java
│ │ │ │ ├── ConfigRemoveRequestTest.java
│ │ │ │ └── cluster/
│ │ │ │ └── ConfigChangeClusterSyncRequestTest.java
│ │ │ └── response/
│ │ │ ├── BasedConfigResponseTest.java
│ │ │ ├── ClientConfigMetricResponseTest.java
│ │ │ ├── ConfigChangeBatchListenResponseTest.java
│ │ │ ├── ConfigChangeNotifyResponseTest.java
│ │ │ ├── ConfigPublishResponseTest.java
│ │ │ ├── ConfigQueryResponseTest.java
│ │ │ ├── ConfigRemoveResponseTest.java
│ │ │ └── cluster/
│ │ │ └── ConfigChangeClusterSyncResponseTest.java
│ │ ├── exception/
│ │ │ ├── NacosExceptionTest.java
│ │ │ ├── api/
│ │ │ │ └── NacosApiExceptionTest.java
│ │ │ └── runtime/
│ │ │ ├── NacosDeserializationExceptionTest.java
│ │ │ ├── NacosLoadExceptionTest.java
│ │ │ ├── NacosRuntimeExceptionTest.java
│ │ │ └── NacosSerializationExceptionTest.java
│ │ ├── lock/
│ │ │ ├── NacosLockFactoryTest.java
│ │ │ ├── model/
│ │ │ │ └── LockInstanceTest.java
│ │ │ └── remote/
│ │ │ ├── request/
│ │ │ │ └── LockOperationRequestTest.java
│ │ │ └── response/
│ │ │ └── LockOperationResponseTest.java
│ │ ├── model/
│ │ │ ├── PageTest.java
│ │ │ ├── response/
│ │ │ │ ├── ConnectionInfoTest.java
│ │ │ │ ├── InstanceIdGeneratorInfoTest.java
│ │ │ │ ├── NacosMemberTest.java
│ │ │ │ ├── NamespaceTest.java
│ │ │ │ └── ServerLoaderMetricsTest.java
│ │ │ └── v2/
│ │ │ ├── ErrorCodeTest.java
│ │ │ ├── ResultTest.java
│ │ │ └── SupportedLanguageTest.java
│ │ ├── naming/
│ │ │ ├── NamingFactoryTest.java
│ │ │ ├── ability/
│ │ │ │ ├── ClientNamingAbilityTest.java
│ │ │ │ └── ServerNamingAbilityTest.java
│ │ │ ├── listener/
│ │ │ │ ├── AbstractFuzzyWatchEventWatcherTest.java
│ │ │ │ ├── FuzzyWatchChangeEventTest.java
│ │ │ │ └── NamingEventTest.java
│ │ │ ├── pojo/
│ │ │ │ ├── ClusterTest.java
│ │ │ │ ├── InstanceTest.java
│ │ │ │ ├── ListViewTest.java
│ │ │ │ ├── ServiceInfoTest.java
│ │ │ │ ├── ServiceTest.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── InstanceBuilderTest.java
│ │ │ │ ├── healthcheck/
│ │ │ │ │ ├── AbstractHealthCheckerTest.java
│ │ │ │ │ ├── HealthCheckTypeTest.java
│ │ │ │ │ ├── HealthCheckerFactoryTest.java
│ │ │ │ │ ├── TestChecker.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── HttpTest.java
│ │ │ │ │ ├── MysqlTest.java
│ │ │ │ │ └── TcpTest.java
│ │ │ │ └── maintainer/
│ │ │ │ ├── ClientPublisherInfoTest.java
│ │ │ │ ├── ClientServiceInfoTest.java
│ │ │ │ ├── ClientSubscriberInfoTest.java
│ │ │ │ ├── ClientSummaryInfoTest.java
│ │ │ │ ├── ClusterInfoTest.java
│ │ │ │ ├── InstanceMetadataBatchResultTest.java
│ │ │ │ ├── MetricsInfoTest.java
│ │ │ │ ├── ServiceDetailInfoTest.java
│ │ │ │ ├── ServiceViewTest.java
│ │ │ │ └── SubscriberInfoTest.java
│ │ │ ├── remote/
│ │ │ │ ├── request/
│ │ │ │ │ ├── BasedNamingRequestTest.java
│ │ │ │ │ ├── BatchInstanceRequestTest.java
│ │ │ │ │ ├── InstanceRequestTest.java
│ │ │ │ │ ├── NamingFuzzyWatchChangeNotifyRequestTest.java
│ │ │ │ │ ├── NamingFuzzyWatchRequestTest.java
│ │ │ │ │ ├── NamingFuzzyWatchSyncRequestTest.java
│ │ │ │ │ ├── NotifySubscriberRequestTest.java
│ │ │ │ │ ├── PersistentInstanceRequestTest.java
│ │ │ │ │ ├── ServiceListRequestTest.java
│ │ │ │ │ ├── ServiceQueryRequestTest.java
│ │ │ │ │ └── SubscribeServiceRequestTest.java
│ │ │ │ └── response/
│ │ │ │ ├── BatchInstanceResponseTest.java
│ │ │ │ ├── InstanceResponseTest.java
│ │ │ │ ├── NamingFuzzyWatchChangeNotifyResponseTest.java
│ │ │ │ ├── NamingFuzzyWatchResponseTest.java
│ │ │ │ ├── NamingFuzzyWatchSyncResponseTest.java
│ │ │ │ ├── NotifySubscriberResponseTest.java
│ │ │ │ ├── QueryServiceResponseTest.java
│ │ │ │ ├── ServiceListResponseTest.java
│ │ │ │ └── SubscribeServiceResponseTest.java
│ │ │ └── utils/
│ │ │ └── NamingUtilsTest.java
│ │ ├── remote/
│ │ │ ├── AbstractPushCallBackTest.java
│ │ │ ├── AbstractRequestCallBackTest.java
│ │ │ ├── DefaultRequestFutureTest.java
│ │ │ ├── RpcScheduledExecutorTest.java
│ │ │ ├── ability/
│ │ │ │ ├── ClientRemoteAbilityTest.java
│ │ │ │ └── ServerRemoteAbilityTest.java
│ │ │ ├── request/
│ │ │ │ ├── BasicRequestTest.java
│ │ │ │ ├── ConnectResetRequestTest.java
│ │ │ │ ├── ConnectionSetupRequestTest.java
│ │ │ │ ├── EmptyContentRequestTest.java
│ │ │ │ ├── PushAckRequestTest.java
│ │ │ │ ├── RequestMetaTest.java
│ │ │ │ ├── RequestTest.java
│ │ │ │ ├── ServerReloadRequestTest.java
│ │ │ │ └── SetupAckRequestTest.java
│ │ │ └── response/
│ │ │ ├── EmptyContentResponseTest.java
│ │ │ ├── ErrorResponseTest.java
│ │ │ ├── ServerCheckResponseTest.java
│ │ │ └── ServerLoaderInfoResponseTest.java
│ │ ├── selector/
│ │ │ ├── AbstractCmdbSelectorTest.java
│ │ │ ├── ExpressionSelectorTest.java
│ │ │ ├── NoneSelectorTest.java
│ │ │ └── context/
│ │ │ └── CmdbContextTest.java
│ │ └── utils/
│ │ ├── AbilityKeyTest.java
│ │ ├── NetUtilsTest.java
│ │ └── StringUtilsTest.java
│ └── client/
│ ├── ai/
│ │ └── NacosAiService.java
│ ├── config/
│ │ └── NacosConfigService.java
│ ├── lock/
│ │ └── NacosLockService.java
│ └── naming/
│ └── NacosNamingService.java
├── auth/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── auth/
│ │ ├── AbstractProtocolAuthService.java
│ │ ├── GrpcProtocolAuthService.java
│ │ ├── HttpProtocolAuthService.java
│ │ ├── ProtocolAuthService.java
│ │ ├── annotation/
│ │ │ └── Secured.java
│ │ ├── config/
│ │ │ ├── AuthErrorCode.java
│ │ │ ├── NacosAuthConfig.java
│ │ │ └── NacosAuthConfigHolder.java
│ │ ├── context/
│ │ │ ├── GrpcIdentityContextBuilder.java
│ │ │ ├── HttpIdentityContextBuilder.java
│ │ │ └── IdentityContextBuilder.java
│ │ ├── parser/
│ │ │ ├── AbstractResourceParser.java
│ │ │ ├── DefaultResourceParser.java
│ │ │ ├── ResourceParser.java
│ │ │ ├── grpc/
│ │ │ │ ├── AbstractGrpcResourceParser.java
│ │ │ │ ├── AiGrpcResourceParser.java
│ │ │ │ ├── ConfigGrpcResourceParser.java
│ │ │ │ └── NamingGrpcResourceParser.java
│ │ │ └── http/
│ │ │ ├── AbstractHttpResourceParser.java
│ │ │ ├── AiHttpResourceParser.java
│ │ │ ├── ConfigHttpResourceParser.java
│ │ │ └── NamingHttpResourceParser.java
│ │ ├── serveridentity/
│ │ │ ├── DefaultChecker.java
│ │ │ ├── ServerIdentity.java
│ │ │ ├── ServerIdentityChecker.java
│ │ │ ├── ServerIdentityCheckerHolder.java
│ │ │ └── ServerIdentityResult.java
│ │ └── util/
│ │ ├── AuthHeaderUtil.java
│ │ └── Loggers.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── auth/
│ │ ├── GrpcProtocolAuthServiceTest.java
│ │ ├── HttpProtocolAuthServiceTest.java
│ │ ├── config/
│ │ │ ├── AuthErrorCodeTest.java
│ │ │ └── NacosAuthConfigHolderTest.java
│ │ ├── context/
│ │ │ ├── GrpcIdentityContextBuilderTest.java
│ │ │ └── HtppIdentityContextBuilderTest.java
│ │ ├── mock/
│ │ │ ├── MockAuthPluginService.java
│ │ │ └── MockResourceParser.java
│ │ ├── parser/
│ │ │ ├── grpc/
│ │ │ │ ├── AiGrpcResourceParserTest.java
│ │ │ │ ├── ConfigGrpcResourceParserTest.java
│ │ │ │ └── NamingGrpcResourceParserTest.java
│ │ │ └── http/
│ │ │ ├── AiHttpResourceParserTest.java
│ │ │ ├── ConfigHttpResourceParserTest.java
│ │ │ └── NamingHttpResourceParserTest.java
│ │ ├── serveridentity/
│ │ │ ├── ServerIdentityCheckerHolderTest.java
│ │ │ └── ServerIdentityTest.java
│ │ └── util/
│ │ ├── AuthHeaderUtilTest.java
│ │ └── LoggersTest.java
│ └── resources/
│ └── META-INF/
│ └── services/
│ └── com.alibaba.nacos.plugin.auth.spi.server.AuthPluginService
├── bootstrap/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── bootstrap/
│ │ └── NacosBootstrap.java
│ └── resources/
│ └── application.properties
├── client/
│ ├── filter-config.json
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── client/
│ │ │ ├── ability/
│ │ │ │ └── ClientAbilityControlManager.java
│ │ │ ├── ai/
│ │ │ │ ├── NacosAiService.java
│ │ │ │ ├── cache/
│ │ │ │ │ ├── NacosAgentCardCacheHolder.java
│ │ │ │ │ ├── NacosMcpServerCacheHolder.java
│ │ │ │ │ ├── NacosPromptCacheHolder.java
│ │ │ │ │ └── NacosSkillCacheHolder.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── AbstractAiListenerInvoker.java
│ │ │ │ │ ├── AgentCardChangedEvent.java
│ │ │ │ │ ├── AgentCardListenerInvoker.java
│ │ │ │ │ ├── AiChangeNotifier.java
│ │ │ │ │ ├── McpServerChangedEvent.java
│ │ │ │ │ ├── McpServerListenerInvoker.java
│ │ │ │ │ ├── PromptChangedEvent.java
│ │ │ │ │ ├── PromptListenerInvoker.java
│ │ │ │ │ ├── SkillChangedEvent.java
│ │ │ │ │ └── SkillListenerInvoker.java
│ │ │ │ ├── remote/
│ │ │ │ │ ├── AiClientProxy.java
│ │ │ │ │ ├── AiGrpcClient.java
│ │ │ │ │ ├── AiHttpClientProxy.java
│ │ │ │ │ └── redo/
│ │ │ │ │ ├── AgentEndpointRedoData.java
│ │ │ │ │ ├── AgentEndpointWrapper.java
│ │ │ │ │ ├── AiGrpcRedoService.java
│ │ │ │ │ ├── AiRedoScheduledTask.java
│ │ │ │ │ ├── McpServerEndpoint.java
│ │ │ │ │ └── McpServerEndpointRedoData.java
│ │ │ │ └── utils/
│ │ │ │ └── CacheKeyUtils.java
│ │ │ ├── config/
│ │ │ │ ├── NacosConfigService.java
│ │ │ │ ├── common/
│ │ │ │ │ ├── ConfigConstants.java
│ │ │ │ │ └── GroupKey.java
│ │ │ │ ├── filter/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── ConfigContext.java
│ │ │ │ │ ├── ConfigEncryptionFilter.java
│ │ │ │ │ ├── ConfigFilterChainManager.java
│ │ │ │ │ ├── ConfigRequest.java
│ │ │ │ │ └── ConfigResponse.java
│ │ │ │ ├── http/
│ │ │ │ │ ├── HttpAgent.java
│ │ │ │ │ ├── MetricsHttpAgent.java
│ │ │ │ │ └── ServerHttpAgent.java
│ │ │ │ ├── impl/
│ │ │ │ │ ├── AbstractConfigChangeParser.java
│ │ │ │ │ ├── CacheData.java
│ │ │ │ │ ├── ChangeNotifyBlockEvent.java
│ │ │ │ │ ├── ClientFuzzyWatchNotifyRequestHandler.java
│ │ │ │ │ ├── ClientWorker.java
│ │ │ │ │ ├── ConfigChangeHandler.java
│ │ │ │ │ ├── ConfigFuzzyWatchContext.java
│ │ │ │ │ ├── ConfigFuzzyWatchGroupKeyHolder.java
│ │ │ │ │ ├── ConfigFuzzyWatchLoadEvent.java
│ │ │ │ │ ├── ConfigFuzzyWatchNotifyEvent.java
│ │ │ │ │ ├── ConfigFuzzyWatcherWrapper.java
│ │ │ │ │ ├── ConfigHttpClientManager.java
│ │ │ │ │ ├── ConfigServerListManager.java
│ │ │ │ │ ├── ConfigTransportClient.java
│ │ │ │ │ ├── Limiter.java
│ │ │ │ │ ├── LocalConfigInfoProcessor.java
│ │ │ │ │ ├── LocalEncryptedDataKeyProcessor.java
│ │ │ │ │ ├── PropertiesChangeParser.java
│ │ │ │ │ └── YmlChangeParser.java
│ │ │ │ ├── listener/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── AbstractConfigChangeListener.java
│ │ │ │ │ └── PropertiesListener.java
│ │ │ │ └── utils/
│ │ │ │ ├── ContentUtils.java
│ │ │ │ ├── JvmUtil.java
│ │ │ │ ├── ParamUtils.java
│ │ │ │ └── SnapShotSwitch.java
│ │ │ ├── lock/
│ │ │ │ ├── NacosLockService.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── NLock.java
│ │ │ │ │ └── NLockFactory.java
│ │ │ │ └── remote/
│ │ │ │ ├── AbstractLockClient.java
│ │ │ │ ├── LockClient.java
│ │ │ │ └── grpc/
│ │ │ │ └── LockGrpcClient.java
│ │ │ ├── logging/
│ │ │ │ └── NacosLogging.java
│ │ │ ├── monitor/
│ │ │ │ └── MetricsMonitor.java
│ │ │ ├── naming/
│ │ │ │ ├── NacosNamingMaintainService.java
│ │ │ │ ├── NacosNamingService.java
│ │ │ │ ├── backups/
│ │ │ │ │ ├── FailoverData.java
│ │ │ │ │ ├── FailoverDataSource.java
│ │ │ │ │ ├── FailoverReactor.java
│ │ │ │ │ ├── FailoverSwitch.java
│ │ │ │ │ ├── NamingFailoverData.java
│ │ │ │ │ └── datasource/
│ │ │ │ │ └── DiskFailoverDataSource.java
│ │ │ │ ├── cache/
│ │ │ │ │ ├── DiskCache.java
│ │ │ │ │ ├── FuzzyWatchEventWatcherWrapper.java
│ │ │ │ │ ├── InstancesDiffer.java
│ │ │ │ │ ├── NamingFuzzyWatchContext.java
│ │ │ │ │ ├── NamingFuzzyWatchServiceListHolder.java
│ │ │ │ │ └── ServiceInfoHolder.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── Balancer.java
│ │ │ │ │ ├── NamingServerListManager.java
│ │ │ │ │ ├── ProtectMode.java
│ │ │ │ │ └── ServiceInfoUpdateService.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── InstancesChangeEvent.java
│ │ │ │ │ ├── InstancesChangeNotifier.java
│ │ │ │ │ ├── InstancesDiff.java
│ │ │ │ │ ├── NamingFuzzyWatchLoadEvent.java
│ │ │ │ │ └── NamingFuzzyWatchNotifyEvent.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── AbstractNamingChangeListener.java
│ │ │ │ │ └── NamingChangeEvent.java
│ │ │ │ ├── remote/
│ │ │ │ │ ├── AbstractNamingClientProxy.java
│ │ │ │ │ ├── NamingClientProxy.java
│ │ │ │ │ ├── NamingClientProxyDelegate.java
│ │ │ │ │ ├── gprc/
│ │ │ │ │ │ ├── NamingFuzzyWatchNotifyRequestHandler.java
│ │ │ │ │ │ ├── NamingGrpcClientProxy.java
│ │ │ │ │ │ ├── NamingPushRequestHandler.java
│ │ │ │ │ │ └── redo/
│ │ │ │ │ │ ├── NamingGrpcRedoService.java
│ │ │ │ │ │ ├── RedoScheduledTask.java
│ │ │ │ │ │ └── data/
│ │ │ │ │ │ ├── BatchInstanceRedoData.java
│ │ │ │ │ │ ├── InstanceRedoData.java
│ │ │ │ │ │ ├── NamingRedoData.java
│ │ │ │ │ │ └── SubscriberRedoData.java
│ │ │ │ │ └── http/
│ │ │ │ │ ├── NamingHttpClientManager.java
│ │ │ │ │ └── NamingHttpClientProxy.java
│ │ │ │ ├── selector/
│ │ │ │ │ ├── DefaultNamingSelector.java
│ │ │ │ │ ├── NamingListenerInvoker.java
│ │ │ │ │ ├── NamingSelectorFactory.java
│ │ │ │ │ ├── NamingSelectorWrapper.java
│ │ │ │ │ └── ServiceInfoContext.java
│ │ │ │ └── utils/
│ │ │ │ ├── CacheDirUtil.java
│ │ │ │ ├── Chooser.java
│ │ │ │ ├── GenericPoller.java
│ │ │ │ ├── InitUtils.java
│ │ │ │ ├── Pair.java
│ │ │ │ ├── Poller.java
│ │ │ │ └── UtilAndComs.java
│ │ │ ├── redo/
│ │ │ │ ├── data/
│ │ │ │ │ └── RedoData.java
│ │ │ │ └── service/
│ │ │ │ ├── AbstractRedoService.java
│ │ │ │ └── AbstractRedoTask.java
│ │ │ ├── security/
│ │ │ │ └── SecurityProxy.java
│ │ │ ├── selector/
│ │ │ │ ├── AbstractSelectorWrapper.java
│ │ │ │ ├── ListenerInvoker.java
│ │ │ │ └── SelectorManager.java
│ │ │ └── utils/
│ │ │ ├── ConcurrentDiskUtil.java
│ │ │ ├── EnvUtil.java
│ │ │ ├── LogUtils.java
│ │ │ ├── ParamUtil.java
│ │ │ ├── PreInitUtils.java
│ │ │ └── ValidatorUtils.java
│ │ └── resources/
│ │ └── META-INF/
│ │ ├── native-image/
│ │ │ └── com.alibaba.nacos/
│ │ │ └── nacos-client/
│ │ │ ├── jni-config.json
│ │ │ ├── predefined-classes-config.json
│ │ │ ├── proxy-config.json
│ │ │ ├── reflect-config.json
│ │ │ ├── resource-config.json
│ │ │ └── serialization-config.json
│ │ └── services/
│ │ ├── com.alibaba.nacos.api.config.filter.IConfigFilter
│ │ ├── com.alibaba.nacos.client.naming.backups.FailoverDataSource
│ │ └── com.alibaba.nacos.common.ability.AbstractAbilityControlManager
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── client/
│ │ ├── ability/
│ │ │ ├── AbilityTest.java
│ │ │ └── ClientAbilityControlManagerTest.java
│ │ ├── ai/
│ │ │ ├── NacosAiServiceTest.java
│ │ │ ├── cache/
│ │ │ │ ├── NacosMcpServerCacheHolderTest.java
│ │ │ │ └── NacosPromptCacheHolderTest.java
│ │ │ ├── event/
│ │ │ │ ├── AiChangeNotifierPromptTest.java
│ │ │ │ ├── AiChangeNotifierTest.java
│ │ │ │ └── McpServerListenerInvokerTest.java
│ │ │ ├── remote/
│ │ │ │ ├── AiGrpcClientTest.java
│ │ │ │ ├── AiHttpClientProxyTest.java
│ │ │ │ └── redo/
│ │ │ │ ├── AiGrpcRedoServiceTest.java
│ │ │ │ ├── AiRedoScheduledTaskTest.java
│ │ │ │ ├── McpServerEndpointRedoDataTest.java
│ │ │ │ └── McpServerEndpointTest.java
│ │ │ └── utils/
│ │ │ └── CacheKeyUtilsTest.java
│ │ ├── config/
│ │ │ ├── NacosConfigServiceTest.java
│ │ │ ├── common/
│ │ │ │ └── GroupKeyTest.java
│ │ │ ├── filter/
│ │ │ │ └── impl/
│ │ │ │ ├── ConfigContextTest.java
│ │ │ │ ├── ConfigEncryptionFilterTest.java
│ │ │ │ ├── ConfigEncryptionFilterTest1.java
│ │ │ │ ├── ConfigFilterChainManagerTest.java
│ │ │ │ ├── ConfigFilterChainTest.java
│ │ │ │ ├── ConfigRequestTest.java
│ │ │ │ ├── ConfigResponseTest.java
│ │ │ │ ├── DemoFilter1.java
│ │ │ │ └── DemoFilter2.java
│ │ │ ├── http/
│ │ │ │ ├── MetricsHttpAgentTest.java
│ │ │ │ └── ServerHttpAgentTest.java
│ │ │ ├── impl/
│ │ │ │ ├── CacheDataTest.java
│ │ │ │ ├── ClientWorkerTest.java
│ │ │ │ ├── ConfigChangeHandlerTest.java
│ │ │ │ ├── ConfigFuzzyWatchGroupKeyHolderTest.java
│ │ │ │ ├── ConfigHttpClientManagerTest.java
│ │ │ │ ├── ConfigServerListManagerTest.java
│ │ │ │ ├── LimiterTest.java
│ │ │ │ ├── PropertiesChangeParserTest.java
│ │ │ │ └── YmlChangeParserTest.java
│ │ │ ├── listener/
│ │ │ │ └── impl/
│ │ │ │ ├── AbstractConfigChangeListenerTest.java
│ │ │ │ └── PropertiesListenerTest.java
│ │ │ └── utils/
│ │ │ ├── ContentUtilsTest.java
│ │ │ ├── JvmUtilTest.java
│ │ │ ├── ParamUtilsTest.java
│ │ │ └── SnapShotSwitchTest.java
│ │ ├── lock/
│ │ │ ├── NacosLockServiceTest.java
│ │ │ └── remote/
│ │ │ └── grpc/
│ │ │ └── LockGrpcClientTest.java
│ │ ├── logging/
│ │ │ └── NacosLoggingTest.java
│ │ ├── naming/
│ │ │ ├── NacosNamingMaintainServiceTest.java
│ │ │ ├── NacosNamingServiceTest.java
│ │ │ ├── backups/
│ │ │ │ ├── FailoverReactorTest.java
│ │ │ │ └── datasource/
│ │ │ │ └── DiskFailoverDataSourceTest.java
│ │ │ ├── cache/
│ │ │ │ ├── DiskCacheTest.java
│ │ │ │ ├── NamingFuzzyWatchServiceListHolderTest.java
│ │ │ │ └── ServiceInfoHolderTest.java
│ │ │ ├── core/
│ │ │ │ ├── BalancerTest.java
│ │ │ │ ├── NamingServerListManagerTest.java
│ │ │ │ ├── ProtectModeTest.java
│ │ │ │ └── ServiceInfoUpdateServiceTest.java
│ │ │ ├── event/
│ │ │ │ ├── InstancesChangeEventTest.java
│ │ │ │ ├── InstancesChangeNotifierTest.java
│ │ │ │ └── InstancesDiffTest.java
│ │ │ ├── listener/
│ │ │ │ └── NamingChangeEventTest.java
│ │ │ ├── remote/
│ │ │ │ ├── AbstractNamingClientProxyTest.java
│ │ │ │ ├── NamingClientProxyDelegateTest.java
│ │ │ │ ├── TestConnection.java
│ │ │ │ ├── gprc/
│ │ │ │ │ ├── NamingGrpcClientProxyTest.java
│ │ │ │ │ ├── NamingPushRequestHandlerTest.java
│ │ │ │ │ └── redo/
│ │ │ │ │ ├── NamingGrpcRedoServiceTest.java
│ │ │ │ │ ├── RedoScheduledTaskTest.java
│ │ │ │ │ └── data/
│ │ │ │ │ ├── BatchInstanceRedoDataTest.java
│ │ │ │ │ └── InstanceRedoDataTest.java
│ │ │ │ └── http/
│ │ │ │ ├── NamingHttpClientManagerTest.java
│ │ │ │ └── NamingHttpClientProxyTest.java
│ │ │ ├── selector/
│ │ │ │ ├── DefaultNamingSelectorTest.java
│ │ │ │ ├── NamingListenerInvokerTest.java
│ │ │ │ ├── NamingSelectorFactoryTest.java
│ │ │ │ ├── NamingSelectorWrapperTest.java
│ │ │ │ └── ServiceInfoContextTest.java
│ │ │ └── utils/
│ │ │ ├── CacheDirUtilTest.java
│ │ │ ├── ChooserTest.java
│ │ │ ├── ConcurrentDiskUtilTest.java
│ │ │ ├── GenericPollerTest.java
│ │ │ ├── InitUtilsTest.java
│ │ │ └── PairTest.java
│ │ ├── redo/
│ │ │ ├── data/
│ │ │ │ └── RedoDataTest.java
│ │ │ └── service/
│ │ │ ├── AbstractRedoServiceTest.java
│ │ │ └── AbstractRedoTaskTest.java
│ │ ├── security/
│ │ │ └── SecurityProxyTest.java
│ │ ├── selector/
│ │ │ ├── AbstractSelectorWrapperTest.java
│ │ │ └── SelectorManagerTest.java
│ │ └── utils/
│ │ ├── EnvUtilTest.java
│ │ ├── LogUtilsTest.java
│ │ ├── ParamUtilTest.java
│ │ ├── PreInitUtilsTest.java
│ │ ├── StringUtilsTest.java
│ │ └── ValidatorUtilsTest.java
│ └── resources/
│ ├── disk_cache_test/
│ │ ├── error%40%40json%40%40file
│ │ ├── ignored%40%40not_json%40%40file
│ │ ├── invalid_dir/
│ │ │ └── invalid_file
│ │ ├── legal%40%40no_name%40%40file
│ │ └── legal%40%40with_name%40%40file
│ └── failover_test/
│ ├── disabled/
│ │ └── 00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
│ └── enabled/
│ ├── 00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
│ ├── invalid_dir/
│ │ └── invalid_file
│ └── legal%40%40with_name%40%40file
├── client-basic/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── client/
│ │ │ ├── address/
│ │ │ │ ├── AbstractServerListManager.java
│ │ │ │ ├── AbstractServerListProvider.java
│ │ │ │ ├── EndpointServerListProvider.java
│ │ │ │ ├── PropertiesListProvider.java
│ │ │ │ ├── ServerListChangeEvent.java
│ │ │ │ └── ServerListProvider.java
│ │ │ ├── auth/
│ │ │ │ ├── impl/
│ │ │ │ │ ├── NacosAuthLoginConstant.java
│ │ │ │ │ ├── NacosClientAuthServiceImpl.java
│ │ │ │ │ └── process/
│ │ │ │ │ ├── HttpLoginProcessor.java
│ │ │ │ │ └── LoginProcessor.java
│ │ │ │ └── ram/
│ │ │ │ ├── RamClientAuthServiceImpl.java
│ │ │ │ ├── RamConstants.java
│ │ │ │ ├── RamContext.java
│ │ │ │ ├── identify/
│ │ │ │ │ ├── CredentialListener.java
│ │ │ │ │ ├── CredentialService.java
│ │ │ │ │ ├── CredentialWatcher.java
│ │ │ │ │ ├── Credentials.java
│ │ │ │ │ ├── IdentifyConstants.java
│ │ │ │ │ ├── SpasCredential.java
│ │ │ │ │ ├── SpasCredentialLoader.java
│ │ │ │ │ ├── StsConfig.java
│ │ │ │ │ ├── StsCredential.java
│ │ │ │ │ └── StsCredentialHolder.java
│ │ │ │ ├── injector/
│ │ │ │ │ ├── AbstractResourceInjector.java
│ │ │ │ │ ├── AiResourceInjector.java
│ │ │ │ │ ├── ConfigResourceInjector.java
│ │ │ │ │ ├── LockResourceInjector.java
│ │ │ │ │ └── NamingResourceInjector.java
│ │ │ │ └── utils/
│ │ │ │ ├── CalculateV4SigningKeyUtil.java
│ │ │ │ ├── RamUtil.java
│ │ │ │ ├── SignUtil.java
│ │ │ │ └── SpasAdapter.java
│ │ │ ├── constant/
│ │ │ │ └── Constants.java
│ │ │ ├── env/
│ │ │ │ ├── AbstractPropertySource.java
│ │ │ │ ├── JvmArgsPropertySource.java
│ │ │ │ ├── NacosClientProperties.java
│ │ │ │ ├── PropertiesPropertySource.java
│ │ │ │ ├── SearchableProperties.java
│ │ │ │ ├── SourceType.java
│ │ │ │ ├── SystemEnvPropertySource.java
│ │ │ │ └── convert/
│ │ │ │ ├── AbstractPropertyConverter.java
│ │ │ │ ├── BooleanConverter.java
│ │ │ │ ├── CompositeConverter.java
│ │ │ │ ├── IntegerConverter.java
│ │ │ │ └── LongConverter.java
│ │ │ ├── remote/
│ │ │ │ └── HttpClientManager.java
│ │ │ └── utils/
│ │ │ ├── AppNameUtils.java
│ │ │ ├── ClientBasicParamUtil.java
│ │ │ ├── ContextPathUtil.java
│ │ │ ├── TemplateUtils.java
│ │ │ └── TenantUtil.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.client.address.ServerListProvider
│ │ └── com.alibaba.nacos.plugin.auth.spi.client.AbstractClientAuthService
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── client/
│ │ ├── address/
│ │ │ ├── AbstractServerListManagerTest.java
│ │ │ ├── EndpointServerListProviderTest.java
│ │ │ ├── PropertiesListProviderTest.java
│ │ │ └── mock/
│ │ │ └── MockServerListProvider.java
│ │ ├── auth/
│ │ │ ├── impl/
│ │ │ │ ├── NacosClientAuthServiceImplTest.java
│ │ │ │ └── process/
│ │ │ │ └── HttpLoginProcessorTest.java
│ │ │ └── ram/
│ │ │ ├── RamClientAuthServiceImplTest.java
│ │ │ ├── identify/
│ │ │ │ ├── CredentialServiceTest.java
│ │ │ │ ├── CredentialWatcherTest.java
│ │ │ │ ├── CredentialsTest.java
│ │ │ │ ├── StsConfigTest.java
│ │ │ │ └── StsCredentialHolderTest.java
│ │ │ ├── injector/
│ │ │ │ ├── AbstractResourceInjectorTest.java
│ │ │ │ ├── ConfigResourceInjectorTest.java
│ │ │ │ └── NamingResourceInjectorTest.java
│ │ │ └── utils/
│ │ │ ├── CalculateV4SigningKeyUtilTest.java
│ │ │ ├── RamUtilTest.java
│ │ │ ├── SignUtilTest.java
│ │ │ └── SpasAdapterTest.java
│ │ ├── env/
│ │ │ ├── NacosClientPropertiesTest.java
│ │ │ ├── SearchablePropertiesTest.java
│ │ │ ├── SystemEnvPropertySourceTest.java
│ │ │ └── convert/
│ │ │ └── CompositeConverterTest.java
│ │ └── utils/
│ │ ├── AppNameUtilsTest.java
│ │ ├── ClientBasicParamUtilTest.java
│ │ ├── ContextPathUtilTest.java
│ │ ├── TemplateUtilsTest.java
│ │ └── TenantUtilTest.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.client.address.ServerListProvider
│ ├── spas.identity
│ ├── spas_docker.identity
│ ├── spas_invalid.identity
│ └── spas_modified.identity
├── cmdb/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── cmdb/
│ ├── CmdbApp.java
│ ├── controllers/
│ │ └── OperationController.java
│ ├── core/
│ │ └── SwitchAndOptions.java
│ ├── memory/
│ │ └── CmdbProvider.java
│ ├── service/
│ │ ├── CmdbReader.java
│ │ └── CmdbWriter.java
│ └── utils/
│ ├── CmdbExecutor.java
│ ├── Loggers.java
│ └── UtilsAndCommons.java
├── codecov.yml
├── common/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── common/
│ │ │ ├── Beta.java
│ │ │ ├── JustForTest.java
│ │ │ ├── NotThreadSafe.java
│ │ │ ├── ability/
│ │ │ │ ├── AbstractAbilityControlManager.java
│ │ │ │ └── discover/
│ │ │ │ └── NacosAbilityManagerHolder.java
│ │ │ ├── codec/
│ │ │ │ └── Base64.java
│ │ │ ├── constant/
│ │ │ │ ├── HttpHeaderConsts.java
│ │ │ │ ├── RequestUrlConstants.java
│ │ │ │ ├── ResponseHandlerType.java
│ │ │ │ └── Symbols.java
│ │ │ ├── event/
│ │ │ │ └── ServerConfigChangeEvent.java
│ │ │ ├── executor/
│ │ │ │ ├── ExecutorFactory.java
│ │ │ │ ├── NameThreadFactory.java
│ │ │ │ └── ThreadPoolManager.java
│ │ │ ├── http/
│ │ │ │ ├── AbstractApacheHttpClientFactory.java
│ │ │ │ ├── AbstractHttpClientFactory.java
│ │ │ │ ├── BaseHttpMethod.java
│ │ │ │ ├── Callback.java
│ │ │ │ ├── DefaultHttpClientFactory.java
│ │ │ │ ├── HttpClientBeanHolder.java
│ │ │ │ ├── HttpClientConfig.java
│ │ │ │ ├── HttpClientFactory.java
│ │ │ │ ├── HttpRestResult.java
│ │ │ │ ├── HttpUtils.java
│ │ │ │ ├── client/
│ │ │ │ │ ├── AbstractNacosRestTemplate.java
│ │ │ │ │ ├── HttpClientRequestInterceptor.java
│ │ │ │ │ ├── InterceptingHttpClientRequest.java
│ │ │ │ │ ├── NacosAsyncRestTemplate.java
│ │ │ │ │ ├── NacosRestTemplate.java
│ │ │ │ │ ├── handler/
│ │ │ │ │ │ ├── AbstractResponseHandler.java
│ │ │ │ │ │ ├── BeanResponseHandler.java
│ │ │ │ │ │ ├── ResponseHandler.java
│ │ │ │ │ │ ├── RestResultResponseHandler.java
│ │ │ │ │ │ └── StringResponseHandler.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── AsyncHttpClientRequest.java
│ │ │ │ │ │ ├── DefaultAsyncHttpClientRequest.java
│ │ │ │ │ │ ├── DefaultHttpClientRequest.java
│ │ │ │ │ │ ├── HttpClientRequest.java
│ │ │ │ │ │ └── JdkHttpClientRequest.java
│ │ │ │ │ └── response/
│ │ │ │ │ ├── DefaultClientHttpResponse.java
│ │ │ │ │ ├── HttpClientResponse.java
│ │ │ │ │ └── JdkHttpClientResponse.java
│ │ │ │ └── param/
│ │ │ │ ├── Header.java
│ │ │ │ ├── MediaType.java
│ │ │ │ └── Query.java
│ │ │ ├── labels/
│ │ │ │ ├── LabelsCollector.java
│ │ │ │ ├── LabelsCollectorManager.java
│ │ │ │ └── impl/
│ │ │ │ ├── DefaultLabelsCollector.java
│ │ │ │ └── DefaultLabelsCollectorManager.java
│ │ │ ├── lifecycle/
│ │ │ │ └── Closeable.java
│ │ │ ├── logging/
│ │ │ │ ├── NacosLoggingAdapter.java
│ │ │ │ ├── NacosLoggingAdapterBuilder.java
│ │ │ │ └── NacosLoggingProperties.java
│ │ │ ├── model/
│ │ │ │ ├── RequestHttpEntity.java
│ │ │ │ ├── RestResult.java
│ │ │ │ ├── RestResultUtils.java
│ │ │ │ └── core/
│ │ │ │ └── IResultCode.java
│ │ │ ├── notify/
│ │ │ │ ├── DefaultPublisher.java
│ │ │ │ ├── DefaultSharePublisher.java
│ │ │ │ ├── Event.java
│ │ │ │ ├── EventPublisher.java
│ │ │ │ ├── EventPublisherFactory.java
│ │ │ │ ├── NotifyCenter.java
│ │ │ │ ├── ShardedEventPublisher.java
│ │ │ │ ├── SlowEvent.java
│ │ │ │ └── listener/
│ │ │ │ ├── SmartSubscriber.java
│ │ │ │ └── Subscriber.java
│ │ │ ├── package-info.java
│ │ │ ├── packagescan/
│ │ │ │ ├── DefaultPackageScan.java
│ │ │ │ ├── PackageScan.java
│ │ │ │ ├── classreading/
│ │ │ │ │ ├── ClassReader.java
│ │ │ │ │ └── Symbol.java
│ │ │ │ ├── resource/
│ │ │ │ │ ├── AbstractFileResolvingResource.java
│ │ │ │ │ ├── AbstractResource.java
│ │ │ │ │ ├── AntPathMatcher.java
│ │ │ │ │ ├── ByteArrayResource.java
│ │ │ │ │ ├── ClassPathResource.java
│ │ │ │ │ ├── ContextResource.java
│ │ │ │ │ ├── DefaultResourceLoader.java
│ │ │ │ │ ├── FileSystemResource.java
│ │ │ │ │ ├── FileUrlResource.java
│ │ │ │ │ ├── InputStreamResource.java
│ │ │ │ │ ├── InputStreamSource.java
│ │ │ │ │ ├── PathMatchingResourcePatternResolver.java
│ │ │ │ │ ├── PathResource.java
│ │ │ │ │ ├── ProtocolResolver.java
│ │ │ │ │ ├── Resource.java
│ │ │ │ │ ├── ResourceLoader.java
│ │ │ │ │ ├── ResourcePatternResolver.java
│ │ │ │ │ ├── UrlResource.java
│ │ │ │ │ ├── VfsPatternUtils.java
│ │ │ │ │ ├── VfsResource.java
│ │ │ │ │ ├── VfsUtils.java
│ │ │ │ │ └── WritableResource.java
│ │ │ │ └── util/
│ │ │ │ ├── AbstractAssert.java
│ │ │ │ ├── AbstractObjectUtils.java
│ │ │ │ ├── NestedExceptionUtils.java
│ │ │ │ ├── NestedIoException.java
│ │ │ │ ├── PathMatcher.java
│ │ │ │ └── ResourceUtils.java
│ │ │ ├── paramcheck/
│ │ │ │ ├── AbstractParamChecker.java
│ │ │ │ ├── DefaultParamChecker.java
│ │ │ │ ├── ParamCheckResponse.java
│ │ │ │ ├── ParamCheckRule.java
│ │ │ │ ├── ParamCheckerManager.java
│ │ │ │ └── ParamInfo.java
│ │ │ ├── pathencoder/
│ │ │ │ ├── PathEncoder.java
│ │ │ │ ├── PathEncoderManager.java
│ │ │ │ └── impl/
│ │ │ │ └── WindowsEncoder.java
│ │ │ ├── remote/
│ │ │ │ ├── ConnectionType.java
│ │ │ │ ├── PayloadRegistry.java
│ │ │ │ ├── TlsConfig.java
│ │ │ │ ├── client/
│ │ │ │ │ ├── Connection.java
│ │ │ │ │ ├── ConnectionEventListener.java
│ │ │ │ │ ├── RpcClient.java
│ │ │ │ │ ├── RpcClientConfig.java
│ │ │ │ │ ├── RpcClientConfigFactory.java
│ │ │ │ │ ├── RpcClientFactory.java
│ │ │ │ │ ├── RpcClientStatus.java
│ │ │ │ │ ├── RpcClientTlsConfig.java
│ │ │ │ │ ├── RpcClientTlsConfigFactory.java
│ │ │ │ │ ├── RpcConfigFactory.java
│ │ │ │ │ ├── RpcConstants.java
│ │ │ │ │ ├── RpcTlsConfigFactory.java
│ │ │ │ │ ├── ServerListFactory.java
│ │ │ │ │ ├── ServerRequestHandler.java
│ │ │ │ │ └── grpc/
│ │ │ │ │ ├── DefaultGrpcClientConfig.java
│ │ │ │ │ ├── GrpcClient.java
│ │ │ │ │ ├── GrpcClientConfig.java
│ │ │ │ │ ├── GrpcClusterClient.java
│ │ │ │ │ ├── GrpcConnection.java
│ │ │ │ │ ├── GrpcConstants.java
│ │ │ │ │ ├── GrpcSdkClient.java
│ │ │ │ │ └── GrpcUtils.java
│ │ │ │ └── exception/
│ │ │ │ ├── ConnectionAlreadyClosedException.java
│ │ │ │ ├── ConnectionBusyException.java
│ │ │ │ └── RemoteException.java
│ │ │ ├── spi/
│ │ │ │ ├── NacosServiceLoader.java
│ │ │ │ └── ServiceLoaderException.java
│ │ │ ├── task/
│ │ │ │ ├── AbstractDelayTask.java
│ │ │ │ ├── AbstractExecuteTask.java
│ │ │ │ ├── BatchTaskCounter.java
│ │ │ │ ├── NacosTask.java
│ │ │ │ ├── NacosTaskProcessor.java
│ │ │ │ └── engine/
│ │ │ │ ├── AbstractNacosTaskExecuteEngine.java
│ │ │ │ ├── NacosDelayTaskExecuteEngine.java
│ │ │ │ ├── NacosExecuteTaskExecuteEngine.java
│ │ │ │ ├── NacosTaskExecuteEngine.java
│ │ │ │ └── TaskExecuteWorker.java
│ │ │ ├── tls/
│ │ │ │ ├── SelfHostnameVerifier.java
│ │ │ │ ├── SelfTrustManager.java
│ │ │ │ ├── TlsFileWatcher.java
│ │ │ │ ├── TlsHelper.java
│ │ │ │ └── TlsSystemConfig.java
│ │ │ ├── trace/
│ │ │ │ ├── DeregisterInstanceReason.java
│ │ │ │ ├── HealthCheckType.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── TraceEvent.java
│ │ │ │ │ └── naming/
│ │ │ │ │ ├── BatchRegisterInstanceTraceEvent.java
│ │ │ │ │ ├── DeregisterInstanceTraceEvent.java
│ │ │ │ │ ├── DeregisterServiceTraceEvent.java
│ │ │ │ │ ├── HealthStateChangeTraceEvent.java
│ │ │ │ │ ├── NamingTraceEvent.java
│ │ │ │ │ ├── PushServiceTraceEvent.java
│ │ │ │ │ ├── RegisterInstanceTraceEvent.java
│ │ │ │ │ ├── RegisterServiceTraceEvent.java
│ │ │ │ │ ├── SubscribeServiceTraceEvent.java
│ │ │ │ │ ├── UnsubscribeServiceTraceEvent.java
│ │ │ │ │ ├── UpdateInstanceTraceEvent.java
│ │ │ │ │ └── UpdateServiceTraceEvent.java
│ │ │ │ └── publisher/
│ │ │ │ ├── TraceEventPublisher.java
│ │ │ │ └── TraceEventPublisherFactory.java
│ │ │ └── utils/
│ │ │ ├── ArrayUtils.java
│ │ │ ├── ByteUtils.java
│ │ │ ├── ClassUtils.java
│ │ │ ├── CollectionUtils.java
│ │ │ ├── ConcurrentHashSet.java
│ │ │ ├── ConnLabelsUtils.java
│ │ │ ├── ConvertUtils.java
│ │ │ ├── DateFormatUtils.java
│ │ │ ├── ExceptionUtil.java
│ │ │ ├── FuzzyGroupKeyPattern.java
│ │ │ ├── HttpMethod.java
│ │ │ ├── InetAddressValidator.java
│ │ │ ├── InternetAddressUtil.java
│ │ │ ├── IoUtils.java
│ │ │ ├── JacksonUtils.java
│ │ │ ├── LoggerUtils.java
│ │ │ ├── MD5Utils.java
│ │ │ ├── MapUtil.java
│ │ │ ├── NamespaceUtil.java
│ │ │ ├── NumberUtils.java
│ │ │ ├── Observable.java
│ │ │ ├── Observer.java
│ │ │ ├── Pair.java
│ │ │ ├── Preconditions.java
│ │ │ ├── PropertyUtils.java
│ │ │ ├── RandomUtils.java
│ │ │ ├── ReflectUtils.java
│ │ │ ├── ResourceUtils.java
│ │ │ ├── StringUtils.java
│ │ │ ├── ThreadFactoryBuilder.java
│ │ │ ├── ThreadUtils.java
│ │ │ ├── TlsTypeResolve.java
│ │ │ ├── TypeUtils.java
│ │ │ ├── UuidUtils.java
│ │ │ └── VersionUtils.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── services/
│ │ │ ├── com.alibaba.nacos.common.labels.LabelsCollector
│ │ │ ├── com.alibaba.nacos.common.paramcheck.AbstractParamChecker
│ │ │ └── com.alibaba.nacos.common.pathencoder.PathEncoder
│ │ └── nacos-version.txt
│ └── test/
│ ├── java/
│ │ ├── ClassUtilsTestMockClass.java
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── common/
│ │ ├── AppTest.java
│ │ ├── ability/
│ │ │ ├── AbstractAbilityControlManagerTest.java
│ │ │ ├── MockAbilityPostProcessor.java
│ │ │ └── discover/
│ │ │ ├── HigherMockAbilityManager.java
│ │ │ ├── LowerMockAbilityManager.java
│ │ │ └── NacosAbilityManagerHolderTest.java
│ │ ├── codec/
│ │ │ └── Base64Test.java
│ │ ├── event/
│ │ │ └── ServerConfigChangeEventTest.java
│ │ ├── executor/
│ │ │ ├── ExecutorFactoryTest.java
│ │ │ ├── NameThreadFactoryTest.java
│ │ │ └── ThreadPoolManagerTest.java
│ │ ├── http/
│ │ │ ├── AbstractApacheHttpClientFactoryTest.java
│ │ │ ├── AbstractHttpClientFactoryTest.java
│ │ │ ├── BaseHttpMethodTest.java
│ │ │ ├── HttpClientBeanHolderTest.java
│ │ │ ├── HttpClientConfigTest.java
│ │ │ ├── HttpRestResultTest.java
│ │ │ ├── HttpUtilsTest.java
│ │ │ ├── client/
│ │ │ │ ├── AbstractNacosRestTemplateTest.java
│ │ │ │ ├── InterceptingHttpClientRequestTest.java
│ │ │ │ ├── NacosAsyncRestTemplateTest.java
│ │ │ │ ├── NacosRestTemplateTest.java
│ │ │ │ ├── handler/
│ │ │ │ │ ├── BeanResponseHandlerTest.java
│ │ │ │ │ └── RestResultResponseHandlerTest.java
│ │ │ │ ├── request/
│ │ │ │ │ ├── DefaultAsyncHttpClientRequestTest.java
│ │ │ │ │ ├── DefaultHttpClientRequestTest.java
│ │ │ │ │ └── JdkHttpClientRequestTest.java
│ │ │ │ └── response/
│ │ │ │ ├── DefaultClientHttpResponseTest.java
│ │ │ │ └── JdkClientHttpResponseTest.java
│ │ │ └── param/
│ │ │ ├── HeaderTest.java
│ │ │ ├── MediaTypeTest.java
│ │ │ └── QueryTest.java
│ │ ├── labels/
│ │ │ └── impl/
│ │ │ ├── DefaultLabelsCollectorManagerTest.java
│ │ │ ├── Test1LabelsCollector.java
│ │ │ └── Test2LabelsCollector.java
│ │ ├── logging/
│ │ │ └── NacosLoggingPropertiesTest.java
│ │ ├── model/
│ │ │ ├── RequestHttpEntityTest.java
│ │ │ ├── RestResultTest.java
│ │ │ └── RestResultUtilsTest.java
│ │ ├── notify/
│ │ │ ├── DefaultPublisherTest.java
│ │ │ ├── DefaultSharePublisherTest.java
│ │ │ └── NotifyCenterTest.java
│ │ ├── packagescan/
│ │ │ ├── DefaultPackageScanTest.java
│ │ │ └── mock/
│ │ │ ├── AnnotationClass.java
│ │ │ ├── MockClass.java
│ │ │ ├── NoAnnotationClass.java
│ │ │ └── TestScan.java
│ │ ├── paramcheck/
│ │ │ ├── DefaultParamCheckerTest.java
│ │ │ ├── MockParamChecker.java
│ │ │ └── ParamCheckerManagerTest.java
│ │ ├── pathencoder/
│ │ │ ├── PathEncoderManagerTest.java
│ │ │ └── WindowsEncoderTest.java
│ │ ├── remote/
│ │ │ ├── ConnectionTypeTest.java
│ │ │ ├── PayloadRegistryTest.java
│ │ │ ├── TlsConfigTest.java
│ │ │ ├── client/
│ │ │ │ ├── ConnectionTest.java
│ │ │ │ ├── RpcClientConfigFactoryTest.java
│ │ │ │ ├── RpcClientFactoryTest.java
│ │ │ │ ├── RpcClientTest.java
│ │ │ │ ├── RpcClientTlsConfigTest.java
│ │ │ │ ├── RpcClusterClientTlsConfigTest.java
│ │ │ │ ├── RpcConstantsTest.java
│ │ │ │ └── grpc/
│ │ │ │ ├── DefaultGrpcClientConfigTest.java
│ │ │ │ ├── GrpcClientTest.java
│ │ │ │ ├── GrpcClientTlsTest.java
│ │ │ │ ├── GrpcClusterClientTest.java
│ │ │ │ ├── GrpcConnectionTest.java
│ │ │ │ ├── GrpcConstantsTest.java
│ │ │ │ ├── GrpcSdkClientTest.java
│ │ │ │ └── GrpcUtilsTest.java
│ │ │ └── exception/
│ │ │ └── RemoteExceptionTest.java
│ │ ├── spi/
│ │ │ ├── NacosServiceLoaderTest.java
│ │ │ ├── SpiTestImpl.java
│ │ │ └── SpiTestInterface.java
│ │ ├── task/
│ │ │ └── engine/
│ │ │ ├── NacosDelayTaskExecuteEngineTest.java
│ │ │ └── NacosExecuteTaskExecuteEngineTest.java
│ │ ├── tls/
│ │ │ ├── SelfHostnameVerifierTest.java
│ │ │ ├── SelfTrustManagerTest.java
│ │ │ ├── TlsFileWatcherTest.java
│ │ │ └── TlsHelperTest.java
│ │ ├── trace/
│ │ │ ├── event/
│ │ │ │ └── naming/
│ │ │ │ ├── HealthStateChangeTraceEventTest.java
│ │ │ │ ├── InstanceTraceEventTest.java
│ │ │ │ ├── NamingTraceEventTest.java
│ │ │ │ ├── ServiceTraceEventTest.java
│ │ │ │ └── SubscribeTraceEventTest.java
│ │ │ └── publisher/
│ │ │ ├── TraceEventPublisherFactoryTest.java
│ │ │ ├── TraceEventPublisherTest.java
│ │ │ └── TraceTestEvent.java
│ │ └── utils/
│ │ ├── ArrayUtilsTest.java
│ │ ├── ByteUtilsTest.java
│ │ ├── ClassUtilsTest.java
│ │ ├── CollectionUtilsTest.java
│ │ ├── ConcurrentHashSetTest.java
│ │ ├── ConnLabelsUtilsTest.java
│ │ ├── ConvertUtilsTest.java
│ │ ├── DateFormatUtilsTest.java
│ │ ├── ExceptionUtilTest.java
│ │ ├── FuzzyGroupKeyPatternTest.java
│ │ ├── InetAddressValidatorTest.java
│ │ ├── InternetAddressUtilTest.java
│ │ ├── IoUtilsTest.java
│ │ ├── JacksonUtilsTest.java
│ │ ├── LoggerUtilsTest.java
│ │ ├── MD5UtilsTest.java
│ │ ├── MapUtilTest.java
│ │ ├── NamespaceUtilTest.java
│ │ ├── NumberUtilsTest.java
│ │ ├── ObservableTest.java
│ │ ├── PairTest.java
│ │ ├── PreconditionsTest.java
│ │ ├── PropertyUtilsTest.java
│ │ ├── RandomUtilsTest.java
│ │ ├── ReflectUtilsTest.java
│ │ ├── ResourceUtilsTest.java
│ │ ├── StringUtilsTest.java
│ │ ├── ThreadFactoryBuilderTest.java
│ │ ├── ThreadUtilsTest.java
│ │ ├── TlsTypeResolveTest.java
│ │ ├── TypeUtilsTest.java
│ │ ├── UuidUtilsTest.java
│ │ ├── VersionUtilsTest.java
│ │ └── to/
│ │ └── User.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.api.ability.initializer.AbilityPostProcessor
│ │ ├── com.alibaba.nacos.common.ability.AbstractAbilityControlManager
│ │ ├── com.alibaba.nacos.common.labels.LabelsCollector
│ │ ├── com.alibaba.nacos.common.paramcheck.AbstractParamChecker
│ │ └── com.alibaba.nacos.common.spi.SpiTestInterface
│ ├── resource_utils_test.properties
│ └── test-tls-cert.pem
├── config/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── config/
│ │ │ └── server/
│ │ │ ├── Config.java
│ │ │ ├── aspect/
│ │ │ │ ├── CapacityManagementAspect.java
│ │ │ │ ├── ConfigChangeAspect.java
│ │ │ │ ├── ConfigOpFailureAspect.java
│ │ │ │ └── RequestLogAspect.java
│ │ │ ├── configuration/
│ │ │ │ ├── ConfigChangeConfigs.java
│ │ │ │ ├── ConfigCommonConfig.java
│ │ │ │ ├── ConfigCompatibleConfig.java
│ │ │ │ └── NacosConfigConfiguration.java
│ │ │ ├── constant/
│ │ │ │ ├── ConfigModuleStateBuilder.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── CounterMode.java
│ │ │ │ ├── ParametersField.java
│ │ │ │ └── PropertiesConstant.java
│ │ │ ├── controller/
│ │ │ │ ├── ConfigServletInner.java
│ │ │ │ ├── parameters/
│ │ │ │ │ └── SameNamespaceCloneConfigBean.java
│ │ │ │ └── v3/
│ │ │ │ ├── CapacityControllerV3.java
│ │ │ │ ├── ConfigControllerV3.java
│ │ │ │ ├── ConfigOpenApiController.java
│ │ │ │ ├── ConfigOpsControllerV3.java
│ │ │ │ ├── HistoryControllerV3.java
│ │ │ │ ├── ListenerControllerV3.java
│ │ │ │ └── MetricsControllerV3.java
│ │ │ ├── enums/
│ │ │ │ ├── ApiVersionEnum.java
│ │ │ │ ├── FileTypeEnum.java
│ │ │ │ └── OperationType.java
│ │ │ ├── exception/
│ │ │ │ ├── ConfigAlreadyExistsException.java
│ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ └── NacosConfigException.java
│ │ │ ├── filter/
│ │ │ │ ├── CircuitFilter.java
│ │ │ │ ├── ConfigEnabledFilter.java
│ │ │ │ └── NacosWebFilter.java
│ │ │ ├── manager/
│ │ │ │ ├── TaskManager.java
│ │ │ │ └── TaskManagerMBean.java
│ │ │ ├── model/
│ │ │ │ ├── AclInfo.java
│ │ │ │ ├── CacheItem.java
│ │ │ │ ├── ConfigAdvanceInfo.java
│ │ │ │ ├── ConfigAllInfo.java
│ │ │ │ ├── ConfigCache.java
│ │ │ │ ├── ConfigCacheFactory.java
│ │ │ │ ├── ConfigCacheFactoryDelegate.java
│ │ │ │ ├── ConfigCacheGray.java
│ │ │ │ ├── ConfigCachePostProcessor.java
│ │ │ │ ├── ConfigCachePostProcessorDelegate.java
│ │ │ │ ├── ConfigHistoryInfo.java
│ │ │ │ ├── ConfigHistoryInfoDetail.java
│ │ │ │ ├── ConfigInfo.java
│ │ │ │ ├── ConfigInfo4Beta.java
│ │ │ │ ├── ConfigInfo4Tag.java
│ │ │ │ ├── ConfigInfoBase.java
│ │ │ │ ├── ConfigInfoBaseEx.java
│ │ │ │ ├── ConfigInfoBetaWrapper.java
│ │ │ │ ├── ConfigInfoChanged.java
│ │ │ │ ├── ConfigInfoEx.java
│ │ │ │ ├── ConfigInfoGrayWrapper.java
│ │ │ │ ├── ConfigInfoStateWrapper.java
│ │ │ │ ├── ConfigInfoTagWrapper.java
│ │ │ │ ├── ConfigInfoWrapper.java
│ │ │ │ ├── ConfigKey.java
│ │ │ │ ├── ConfigListenState.java
│ │ │ │ ├── ConfigMetadata.java
│ │ │ │ ├── ConfigOperateResult.java
│ │ │ │ ├── ConfigRequestInfo.java
│ │ │ │ ├── GroupkeyListenserStatus.java
│ │ │ │ ├── ListenerCheckResult.java
│ │ │ │ ├── NacosConfigCacheFactory.java
│ │ │ │ ├── NacosConfigCachePostProcessor.java
│ │ │ │ ├── SampleResult.java
│ │ │ │ ├── SubscriberStatus.java
│ │ │ │ ├── capacity/
│ │ │ │ │ ├── Capacity.java
│ │ │ │ │ ├── GroupCapacity.java
│ │ │ │ │ └── NamespaceCapacity.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── ConfigDataChangeEvent.java
│ │ │ │ │ ├── ConfigDumpEvent.java
│ │ │ │ │ ├── ConfigFuzzyWatchEvent.java
│ │ │ │ │ ├── IstioConfigChangeEvent.java
│ │ │ │ │ ├── LocalDataChangeEvent.java
│ │ │ │ │ └── RaftDbErrorRecoverEvent.java
│ │ │ │ ├── form/
│ │ │ │ │ ├── ConfigForm.java
│ │ │ │ │ ├── ConfigFormV3.java
│ │ │ │ │ └── UpdateCapacityForm.java
│ │ │ │ └── gray/
│ │ │ │ ├── AbstractGrayRule.java
│ │ │ │ ├── BetaGrayRule.java
│ │ │ │ ├── ConfigGrayPersistInfo.java
│ │ │ │ ├── GrayRule.java
│ │ │ │ ├── GrayRuleManager.java
│ │ │ │ └── TagGrayRule.java
│ │ │ ├── monitor/
│ │ │ │ ├── ConfigDynamicMeterRefreshService.java
│ │ │ │ ├── MemoryMonitor.java
│ │ │ │ ├── MetricsMonitor.java
│ │ │ │ ├── PrintGetConfigResponeTask.java
│ │ │ │ ├── PrintMemoryTask.java
│ │ │ │ ├── ResponseMonitor.java
│ │ │ │ ├── ThreadTaskQueueMonitorTask.java
│ │ │ │ └── collector/
│ │ │ │ └── ConfigSubscriberMetricsCollector.java
│ │ │ ├── paramcheck/
│ │ │ │ ├── ConfigBlurSearchHttpParamExtractor.java
│ │ │ │ ├── ConfigDefaultHttpParamExtractor.java
│ │ │ │ └── ConfigListenerHttpParamExtractor.java
│ │ │ ├── remote/
│ │ │ │ ├── ConfigChangeBatchListenRequestHandler.java
│ │ │ │ ├── ConfigChangeClusterSyncRequestHandler.java
│ │ │ │ ├── ConfigChangeListenContext.java
│ │ │ │ ├── ConfigClusterRpcClientProxy.java
│ │ │ │ ├── ConfigConnectionEventListener.java
│ │ │ │ ├── ConfigFuzzyWatchChangeNotifier.java
│ │ │ │ ├── ConfigFuzzyWatchRequestHandler.java
│ │ │ │ ├── ConfigFuzzyWatchSyncNotifier.java
│ │ │ │ ├── ConfigPublishRequestHandler.java
│ │ │ │ ├── ConfigQueryRequestHandler.java
│ │ │ │ ├── ConfigRemoveRequestHandler.java
│ │ │ │ ├── FuzzyWatchChangeNotifyTask.java
│ │ │ │ ├── FuzzyWatchSyncNotifyCallback.java
│ │ │ │ ├── FuzzyWatchSyncNotifyTask.java
│ │ │ │ └── RpcConfigChangeNotifier.java
│ │ │ ├── result/
│ │ │ │ └── code/
│ │ │ │ └── ResultCodeEnum.java
│ │ │ ├── service/
│ │ │ │ ├── ClientIpWhiteList.java
│ │ │ │ ├── ClientRecord.java
│ │ │ │ ├── ClientTrackService.java
│ │ │ │ ├── ConfigCacheService.java
│ │ │ │ ├── ConfigChangePublisher.java
│ │ │ │ ├── ConfigDetailService.java
│ │ │ │ ├── ConfigFuzzyWatchContextService.java
│ │ │ │ ├── ConfigMigrateService.java
│ │ │ │ ├── ConfigOperationService.java
│ │ │ │ ├── ConfigReadinessCheckService.java
│ │ │ │ ├── ConfigSubService.java
│ │ │ │ ├── HistoryService.java
│ │ │ │ ├── LongPollingConnectionMetricsCollector.java
│ │ │ │ ├── LongPollingService.java
│ │ │ │ ├── NamespaceConfigInfoService.java
│ │ │ │ ├── SwitchService.java
│ │ │ │ ├── capacity/
│ │ │ │ │ ├── CapacityService.java
│ │ │ │ │ ├── GroupCapacityPersistService.java
│ │ │ │ │ └── TenantCapacityPersistService.java
│ │ │ │ ├── dump/
│ │ │ │ │ ├── DefaultHistoryConfigCleaner.java
│ │ │ │ │ ├── DumpChangeConfigWorker.java
│ │ │ │ │ ├── DumpChangeGrayConfigWorker.java
│ │ │ │ │ ├── DumpConfigHandler.java
│ │ │ │ │ ├── DumpRequest.java
│ │ │ │ │ ├── DumpService.java
│ │ │ │ │ ├── EmbeddedDumpService.java
│ │ │ │ │ ├── ExternalDumpService.java
│ │ │ │ │ ├── HistoryConfigCleaner.java
│ │ │ │ │ ├── HistoryConfigCleanerConfig.java
│ │ │ │ │ ├── HistoryConfigCleanerManager.java
│ │ │ │ │ ├── disk/
│ │ │ │ │ │ ├── ConfigDiskService.java
│ │ │ │ │ │ ├── ConfigDiskServiceFactory.java
│ │ │ │ │ │ ├── ConfigRawDiskService.java
│ │ │ │ │ │ └── ConfigRocksDbDiskService.java
│ │ │ │ │ ├── processor/
│ │ │ │ │ │ ├── DumpAllGrayProcessor.java
│ │ │ │ │ │ ├── DumpAllProcessor.java
│ │ │ │ │ │ └── DumpProcessor.java
│ │ │ │ │ └── task/
│ │ │ │ │ ├── DumpAllBetaTask.java
│ │ │ │ │ ├── DumpAllGrayTask.java
│ │ │ │ │ ├── DumpAllTagTask.java
│ │ │ │ │ ├── DumpAllTask.java
│ │ │ │ │ └── DumpTask.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── ConfigListenerStateDelegate.java
│ │ │ │ │ ├── ConfigListenerStateService.java
│ │ │ │ │ ├── LocalConfigListenerStateServiceImpl.java
│ │ │ │ │ └── RemoteConfigListenerStateServiceImpl.java
│ │ │ │ ├── notify/
│ │ │ │ │ ├── AsyncNotifyService.java
│ │ │ │ │ └── HttpClientManager.java
│ │ │ │ ├── query/
│ │ │ │ │ ├── ConfigChainRequestExtractorService.java
│ │ │ │ │ ├── ConfigQueryChainRequestExtractor.java
│ │ │ │ │ ├── ConfigQueryChainService.java
│ │ │ │ │ ├── ConfigQueryHandlerChain.java
│ │ │ │ │ ├── ConfigQueryHandlerChainBuilder.java
│ │ │ │ │ ├── DefaultChainRequestExtractor.java
│ │ │ │ │ ├── DefaultConfigQueryHandlerChainBuilder.java
│ │ │ │ │ ├── enums/
│ │ │ │ │ │ └── ResponseCode.java
│ │ │ │ │ ├── handler/
│ │ │ │ │ │ ├── AbstractConfigQueryHandler.java
│ │ │ │ │ │ ├── ConfigChainEntryHandler.java
│ │ │ │ │ │ ├── ConfigContentTypeHandler.java
│ │ │ │ │ │ ├── ConfigQueryHandler.java
│ │ │ │ │ │ ├── FormalHandler.java
│ │ │ │ │ │ ├── GrayRuleMatchHandler.java
│ │ │ │ │ │ └── SpecialTagNotFoundHandler.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── ConfigQueryChainRequest.java
│ │ │ │ │ └── ConfigQueryChainResponse.java
│ │ │ │ ├── repository/
│ │ │ │ │ ├── ConfigInfoBetaPersistService.java
│ │ │ │ │ ├── ConfigInfoGrayPersistService.java
│ │ │ │ │ ├── ConfigInfoPersistService.java
│ │ │ │ │ ├── ConfigInfoTagPersistService.java
│ │ │ │ │ ├── ConfigMigratePersistService.java
│ │ │ │ │ ├── ConfigRowMapperInjector.java
│ │ │ │ │ ├── HistoryConfigInfoPersistService.java
│ │ │ │ │ ├── embedded/
│ │ │ │ │ │ ├── EmbeddedConfigDumpApplyHook.java
│ │ │ │ │ │ ├── EmbeddedConfigInfoBetaPersistServiceImpl.java
│ │ │ │ │ │ ├── EmbeddedConfigInfoGrayPersistServiceImpl.java
│ │ │ │ │ │ ├── EmbeddedConfigInfoPersistServiceImpl.java
│ │ │ │ │ │ ├── EmbeddedConfigInfoTagPersistServiceImpl.java
│ │ │ │ │ │ ├── EmbeddedConfigMigratePersistServiceImpl.java
│ │ │ │ │ │ └── EmbeddedHistoryConfigInfoPersistServiceImpl.java
│ │ │ │ │ └── extrnal/
│ │ │ │ │ ├── ExternalConfigInfoBetaPersistServiceImpl.java
│ │ │ │ │ ├── ExternalConfigInfoGrayPersistServiceImpl.java
│ │ │ │ │ ├── ExternalConfigInfoPersistServiceImpl.java
│ │ │ │ │ ├── ExternalConfigInfoTagPersistServiceImpl.java
│ │ │ │ │ ├── ExternalConfigMigratePersistServiceImpl.java
│ │ │ │ │ └── ExternalHistoryConfigInfoPersistServiceImpl.java
│ │ │ │ ├── sql/
│ │ │ │ │ ├── EmbeddedStorageContextUtils.java
│ │ │ │ │ └── ExternalStorageUtils.java
│ │ │ │ └── trace/
│ │ │ │ └── ConfigTraceService.java
│ │ │ └── utils/
│ │ │ ├── AccumulateStatCount.java
│ │ │ ├── AppNameUtils.java
│ │ │ ├── ConfigExecutor.java
│ │ │ ├── ConfigExtInfoUtil.java
│ │ │ ├── ConfigTagUtil.java
│ │ │ ├── ContentUtils.java
│ │ │ ├── GroupKey.java
│ │ │ ├── GroupKey2.java
│ │ │ ├── LogUtil.java
│ │ │ ├── MD5Util.java
│ │ │ ├── Md5Comparator.java
│ │ │ ├── Md5ComparatorDelegate.java
│ │ │ ├── NacosMd5Comparator.java
│ │ │ ├── ParamUtils.java
│ │ │ ├── PropertyUtil.java
│ │ │ ├── Protocol.java
│ │ │ ├── RegexParser.java
│ │ │ ├── RequestUtil.java
│ │ │ ├── ResponseUtil.java
│ │ │ ├── SimpleCache.java
│ │ │ ├── SimpleFlowData.java
│ │ │ ├── SimpleIpFlowData.java
│ │ │ ├── SimpleReadWriteLock.java
│ │ │ ├── StatConstants.java
│ │ │ ├── SystemConfig.java
│ │ │ ├── TimeUtils.java
│ │ │ ├── TimeoutUtils.java
│ │ │ ├── TraceLogUtil.java
│ │ │ ├── UrlAnalysisUtils.java
│ │ │ ├── YamlParserUtil.java
│ │ │ └── ZipUtils.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ ├── logback/
│ │ │ │ └── config-included.xml
│ │ │ ├── services/
│ │ │ │ ├── com.alibaba.nacos.config.server.model.gray.GrayRule
│ │ │ │ ├── com.alibaba.nacos.config.server.service.query.ConfigQueryChainRequestExtractor
│ │ │ │ ├── com.alibaba.nacos.config.server.service.query.ConfigQueryHandlerChainBuilder
│ │ │ │ ├── com.alibaba.nacos.core.paramcheck.AbstractHttpParamExtractor
│ │ │ │ ├── com.alibaba.nacos.plugin.control.connection.ConnectionMetricsCollector
│ │ │ │ ├── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ │ │ │ └── com.alibaba.nacos.sys.module.ModuleStateBuilder
│ │ │ └── spring.factories
│ │ └── version/
│ │ └── version.txt
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── config/
│ │ └── server/
│ │ ├── aspect/
│ │ │ ├── CapacityManagementAspectTest.java
│ │ │ ├── ConfigChangeAspectTest.java
│ │ │ └── RequestLogAspectTest.java
│ │ ├── configuration/
│ │ │ ├── ConfigChangeConfigsTest.java
│ │ │ └── ConfigCommonConfigTest.java
│ │ ├── constant/
│ │ │ ├── ConfigModuleStateBuilderTest.java
│ │ │ ├── ConstantsTest.java
│ │ │ └── CounterModeTest.java
│ │ ├── controller/
│ │ │ ├── ConfigServletInnerTest.java
│ │ │ └── v3/
│ │ │ ├── CapacityControllerV3Test.java
│ │ │ ├── ConfigControllerV3Test.java
│ │ │ ├── ConfigOpenApiControllerTest.java
│ │ │ ├── ConfigOpsControllerV3Test.java
│ │ │ ├── HistoryControllerV3Test.java
│ │ │ ├── ListenerControllerV3Test.java
│ │ │ └── MetricControllerV3Test.java
│ │ ├── exception/
│ │ │ └── GlobalExceptionHandlerTest.java
│ │ ├── manager/
│ │ │ └── TaskManagerTest.java
│ │ ├── model/
│ │ │ ├── ConfigCacheFactoryDelegateTest.java
│ │ │ ├── ConfigCachePostProcessorDelegateTest.java
│ │ │ ├── ConfigInfoTest.java
│ │ │ ├── NacosConfigCacheFactoryTest.java
│ │ │ ├── NacosConfigCachePostProcessorTest.java
│ │ │ └── form/
│ │ │ └── ConfigFormTest.java
│ │ ├── paramcheck/
│ │ │ └── ConfigListenerHttpParamExtractorTest.java
│ │ ├── remote/
│ │ │ ├── ConfigChangeBatchListenRequestHandlerTest.java
│ │ │ ├── ConfigChangeClusterSyncRequestHandlerTest.java
│ │ │ ├── ConfigChangeListenContextTest.java
│ │ │ ├── ConfigFuzzyWatchChangeNotifierTest.java
│ │ │ ├── ConfigFuzzyWatchSyncNotifierTest.java
│ │ │ ├── ConfigPublishRequestHandlerTest.java
│ │ │ ├── ConfigQueryRequestHandlerTest.java
│ │ │ ├── ConfigRemoveRequestHandlerTest.java
│ │ │ ├── FuzzyWatchSyncNotifyCallbackTest.java
│ │ │ └── RpcConfigChangeNotifierTest.java
│ │ ├── service/
│ │ │ ├── ClientTrackServiceTest.java
│ │ │ ├── ConfigCacheServiceTest.java
│ │ │ ├── ConfigChangePublisherTest.java
│ │ │ ├── ConfigFuzzyWatchContextServiceTest.java
│ │ │ ├── ConfigOperationServiceTest.java
│ │ │ ├── ConfigSubServiceTest.java
│ │ │ ├── HistoryServiceTest.java
│ │ │ ├── LongPollingServiceTest.java
│ │ │ ├── NamespaceConfigInfoServiceTest.java
│ │ │ ├── capacity/
│ │ │ │ ├── CapacityServiceTest.java
│ │ │ │ ├── GroupCapacityPersistServiceTest.java
│ │ │ │ └── TenantCapacityPersistServiceTest.java
│ │ │ ├── dump/
│ │ │ │ ├── DefaultHistoryConfigCleanerTest.java
│ │ │ │ ├── DumpChangeConfigWorkerTest.java
│ │ │ │ ├── DumpChangeGrayConfigWorkerTest.java
│ │ │ │ ├── DumpProcessorTest.java
│ │ │ │ ├── DumpProcessorUserRwaDiskTest.java
│ │ │ │ ├── DumpServiceTest.java
│ │ │ │ ├── HistoryConfigCleanerConfigTest.java
│ │ │ │ ├── HistoryConfigCleanerManagerTest.java
│ │ │ │ ├── disk/
│ │ │ │ │ ├── ConfigDiskServiceFactoryTest.java
│ │ │ │ │ └── ConfigRawDiskServiceTest.java
│ │ │ │ └── processor/
│ │ │ │ ├── DumpAllGrayProcessorTest.java
│ │ │ │ └── DumpAllProcessorTest.java
│ │ │ ├── notify/
│ │ │ │ └── AsyncNotifyServiceTest.java
│ │ │ ├── query/
│ │ │ │ ├── DefaultChainRequestExtractorTest.java
│ │ │ │ └── handler/
│ │ │ │ ├── ConfigChainEntryHandlerTest.java
│ │ │ │ ├── ConfigContentTypeHandlerTest.java
│ │ │ │ ├── FormalHandlerTest.java
│ │ │ │ ├── GrayRuleMatchHandlerTest.java
│ │ │ │ └── SpecialTagNotFoundHandlerTest.java
│ │ │ └── repository/
│ │ │ ├── ConfigRowMapperInjectorTest.java
│ │ │ ├── embedded/
│ │ │ │ ├── EmbeddedConfigInfoBetaPersistServiceImplTest.java
│ │ │ │ ├── EmbeddedConfigInfoGrayPersistServiceImplTest.java
│ │ │ │ ├── EmbeddedConfigInfoPersistServiceImplTest.java
│ │ │ │ ├── EmbeddedConfigInfoTagPersistServiceImplTest.java
│ │ │ │ └── EmbeddedHistoryConfigInfoPersistServiceImplTest.java
│ │ │ └── extrnal/
│ │ │ ├── ExternalConfigInfoBetaPersistServiceImplTest.java
│ │ │ ├── ExternalConfigInfoGrayPersistServiceImplTest.java
│ │ │ ├── ExternalConfigInfoPersistServiceImplTest.java
│ │ │ ├── ExternalConfigInfoTagPersistServiceImplTest.java
│ │ │ └── ExternalHistoryConfigInfoPersistServiceImplTest.java
│ │ └── utils/
│ │ ├── AccumulateStatCountTest.java
│ │ ├── AppNameUtilsTest.java
│ │ ├── ConfigExecutorTest.java
│ │ ├── ConfigExtInfoUtilTest.java
│ │ ├── ContentUtilsTest.java
│ │ ├── GroupKey2Test.java
│ │ ├── GroupKeyTest.java
│ │ ├── LogUtilTest.java
│ │ ├── MD5UtilTest.java
│ │ ├── Md5ComparatorDelegateTest.java
│ │ ├── NacosMd5ComparatorTest.java
│ │ ├── ParamUtilsTest.java
│ │ ├── PropertyUtilTest.java
│ │ ├── ProtocolTest.java
│ │ ├── RegexParserTest.java
│ │ ├── RequestUtilTest.java
│ │ ├── ResponseUtilTest.java
│ │ ├── SimpleCacheTest.java
│ │ ├── SimpleFlowDataTest.java
│ │ ├── SimpleIpFlowDataTest.java
│ │ ├── SimpleReadWriteLockTest.java
│ │ ├── SystemConfigTest.java
│ │ ├── TestCaseUtils.java
│ │ ├── TimeUtilsTest.java
│ │ ├── TimeoutUtilsTest.java
│ │ ├── TraceLogUtilTest.java
│ │ ├── UrlAnalysisUtilsTest.java
│ │ ├── YamlParserUtilTest.java
│ │ └── ZipUtilsTest.java
│ └── resources/
│ ├── application.properties
│ ├── log4j.properties
│ ├── logback-test.xml
│ └── user.properties
├── consistency/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── consistency/
│ │ │ ├── CommandOperations.java
│ │ │ ├── Config.java
│ │ │ ├── ConsistencyProtocol.java
│ │ │ ├── DataOperation.java
│ │ │ ├── IdGenerator.java
│ │ │ ├── ProtoMessageUtil.java
│ │ │ ├── ProtocolMetaData.java
│ │ │ ├── RequestProcessor.java
│ │ │ ├── SerializeFactory.java
│ │ │ ├── Serializer.java
│ │ │ ├── ap/
│ │ │ │ ├── APProtocol.java
│ │ │ │ └── RequestProcessor4AP.java
│ │ │ ├── cp/
│ │ │ │ ├── CPProtocol.java
│ │ │ │ ├── MetadataKey.java
│ │ │ │ └── RequestProcessor4CP.java
│ │ │ ├── exception/
│ │ │ │ └── ConsistencyException.java
│ │ │ ├── serialize/
│ │ │ │ ├── HessianSerializer.java
│ │ │ │ ├── JacksonSerializer.java
│ │ │ │ └── NacosHessianSerializerFactory.java
│ │ │ └── snapshot/
│ │ │ ├── LocalFileMeta.java
│ │ │ ├── Reader.java
│ │ │ ├── SnapshotOperation.java
│ │ │ └── Writer.java
│ │ ├── proto/
│ │ │ ├── Data.proto
│ │ │ └── consistency.proto
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.consistency.Serializer
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── consistency/
│ ├── CommandOperationsTest.java
│ ├── DataOperationTest.java
│ ├── ProtoMessageUtilTest.java
│ ├── ProtocolMetaDataTest.java
│ ├── RequestProcessorTest.java
│ ├── SerializeFactoryTest.java
│ ├── ap/
│ │ └── RequestProcessor4APTest.java
│ ├── cp/
│ │ ├── MetadataKeyTest.java
│ │ └── RequestProcessor4CPTest.java
│ ├── exception/
│ │ └── ConsistencyExceptionTest.java
│ ├── serialize/
│ │ ├── HessianSerializerTest.java
│ │ └── JacksonSerializerTest.java
│ └── snapshot/
│ ├── LocalFileMetaTest.java
│ ├── ReaderTest.java
│ └── WriterTest.java
├── console/
│ ├── README.md
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ ├── Nacos.java
│ │ │ └── console/
│ │ │ ├── NacosConsole.java
│ │ │ ├── NacosConsoleStartUp.java
│ │ │ ├── aot/
│ │ │ │ ├── AotConfiguration.java
│ │ │ │ └── NacosRuntimeHints.java
│ │ │ ├── cluster/
│ │ │ │ └── RemoteServerMemberManager.java
│ │ │ ├── config/
│ │ │ │ ├── ConsoleAuthModuleStateBuilder.java
│ │ │ │ ├── ConsoleCorsConfig.java
│ │ │ │ ├── ConsoleDeploymentConfig.java
│ │ │ │ ├── ConsoleFunctionEnabledConfig.java
│ │ │ │ ├── ConsoleModuleStateBuilder.java
│ │ │ │ ├── ConsolePackageExcludeFilter.java
│ │ │ │ ├── ConsoleWebConfig.java
│ │ │ │ ├── NacosConsoleAuthConfig.java
│ │ │ │ └── NacosConsoleBeanPostProcessorConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── v3/
│ │ │ │ ├── ConsoleHealthController.java
│ │ │ │ ├── ConsoleServerStateController.java
│ │ │ │ ├── ai/
│ │ │ │ │ ├── ConsoleA2aController.java
│ │ │ │ │ ├── ConsoleCopilotConfigController.java
│ │ │ │ │ ├── ConsoleCopilotController.java
│ │ │ │ │ ├── ConsoleMcpController.java
│ │ │ │ │ ├── ConsolePromptController.java
│ │ │ │ │ ├── ConsoleSkillController.java
│ │ │ │ │ ├── CopilotHttpParamExtractor.java
│ │ │ │ │ └── CopilotSseExceptionHandler.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConsoleConfigController.java
│ │ │ │ │ └── ConsoleHistoryController.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── ConsoleClusterController.java
│ │ │ │ │ ├── ConsoleNamespaceController.java
│ │ │ │ │ └── ConsolePluginController.java
│ │ │ │ └── naming/
│ │ │ │ ├── ConsoleInstanceController.java
│ │ │ │ └── ConsoleServiceController.java
│ │ │ ├── exception/
│ │ │ │ └── ConsoleExceptionHandler.java
│ │ │ ├── filter/
│ │ │ │ ├── NacosConsoleAuthFilter.java
│ │ │ │ └── XssFilter.java
│ │ │ ├── handler/
│ │ │ │ ├── HealthHandler.java
│ │ │ │ ├── ServerStateHandler.java
│ │ │ │ ├── ai/
│ │ │ │ │ ├── A2aHandler.java
│ │ │ │ │ ├── EnabledAiHandler.java
│ │ │ │ │ ├── McpHandler.java
│ │ │ │ │ ├── PromptHandler.java
│ │ │ │ │ └── SkillHandler.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigHandler.java
│ │ │ │ │ └── HistoryHandler.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── ClusterHandler.java
│ │ │ │ │ ├── NamespaceHandler.java
│ │ │ │ │ └── PluginHandler.java
│ │ │ │ ├── impl/
│ │ │ │ │ ├── AbstractServerStateHandler.java
│ │ │ │ │ ├── ConditionFunctionEnabled.java
│ │ │ │ │ ├── inner/
│ │ │ │ │ │ ├── EnabledInnerHandler.java
│ │ │ │ │ │ ├── HealthInnerHandler.java
│ │ │ │ │ │ ├── ServerStateInnerHandler.java
│ │ │ │ │ │ ├── ai/
│ │ │ │ │ │ │ ├── A2aInnerHandler.java
│ │ │ │ │ │ │ ├── McpInnerHandler.java
│ │ │ │ │ │ │ ├── PromptInnerHandler.java
│ │ │ │ │ │ │ └── SkillInnerHandler.java
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── ConfigInnerHandler.java
│ │ │ │ │ │ │ └── HistoryInnerHandler.java
│ │ │ │ │ │ ├── core/
│ │ │ │ │ │ │ ├── ClusterInnerHandler.java
│ │ │ │ │ │ │ ├── NamespaceInnerHandler.java
│ │ │ │ │ │ │ └── PluginInnerHandler.java
│ │ │ │ │ │ └── naming/
│ │ │ │ │ │ ├── InstanceInnerHandler.java
│ │ │ │ │ │ └── ServiceInnerHandler.java
│ │ │ │ │ ├── noop/
│ │ │ │ │ │ ├── ai/
│ │ │ │ │ │ │ ├── A2aNoopHandler.java
│ │ │ │ │ │ │ ├── McpNoopHandler.java
│ │ │ │ │ │ │ ├── PromptNoopHandler.java
│ │ │ │ │ │ │ └── SkillNoopHandler.java
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── ConfigNoopHandler.java
│ │ │ │ │ │ │ └── HistoryNoopHandler.java
│ │ │ │ │ │ └── naming/
│ │ │ │ │ │ ├── InstanceNoopHandler.java
│ │ │ │ │ │ └── ServiceNoopHandler.java
│ │ │ │ │ └── remote/
│ │ │ │ │ ├── ConsoleMaintainerClientAuthPlugin.java
│ │ │ │ │ ├── EnabledRemoteHandler.java
│ │ │ │ │ ├── HealthRemoteHandler.java
│ │ │ │ │ ├── NacosMaintainerClientHolder.java
│ │ │ │ │ ├── RemoteServerConnector.java
│ │ │ │ │ ├── ServerStateRemoteHandler.java
│ │ │ │ │ ├── ai/
│ │ │ │ │ │ ├── A2aRemoteHandler.java
│ │ │ │ │ │ ├── McpRemoteHandler.java
│ │ │ │ │ │ ├── PromptRemoteHandler.java
│ │ │ │ │ │ └── SkillRemoteHandler.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ConfigImportAndExportService.java
│ │ │ │ │ │ ├── ConfigRemoteHandler.java
│ │ │ │ │ │ └── HistoryRemoteHandler.java
│ │ │ │ │ ├── core/
│ │ │ │ │ │ ├── ClusterRemoteHandler.java
│ │ │ │ │ │ ├── NamespaceRemoteHandler.java
│ │ │ │ │ │ └── PluginRemoteHandler.java
│ │ │ │ │ └── naming/
│ │ │ │ │ ├── InstanceRemoteHandler.java
│ │ │ │ │ └── ServiceRemoteHandler.java
│ │ │ │ └── naming/
│ │ │ │ ├── InstanceHandler.java
│ │ │ │ └── ServiceHandler.java
│ │ │ ├── paramcheck/
│ │ │ │ └── ConsoleDefaultHttpParamExtractor.java
│ │ │ └── proxy/
│ │ │ ├── HealthProxy.java
│ │ │ ├── ServerStateProxy.java
│ │ │ ├── ai/
│ │ │ │ ├── A2aProxy.java
│ │ │ │ ├── McpProxy.java
│ │ │ │ ├── PromptProxy.java
│ │ │ │ └── SkillProxy.java
│ │ │ ├── config/
│ │ │ │ ├── ConfigProxy.java
│ │ │ │ └── HistoryProxy.java
│ │ │ ├── core/
│ │ │ │ ├── ClusterProxy.java
│ │ │ │ ├── NamespaceProxy.java
│ │ │ │ └── PluginProxy.java
│ │ │ └── naming/
│ │ │ ├── InstanceProxy.java
│ │ │ └── ServiceProxy.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ ├── nacos-default.properties
│ │ │ ├── native-image/
│ │ │ │ └── com.alibaba.nacos/
│ │ │ │ └── nacos-console/
│ │ │ │ ├── jni-config.json
│ │ │ │ ├── predefined-classes-config.json
│ │ │ │ ├── proxy-config.json
│ │ │ │ ├── reflect-config.json
│ │ │ │ ├── resource-config.json
│ │ │ │ └── serialization-config.json
│ │ │ └── services/
│ │ │ ├── com.alibaba.nacos.auth.config.NacosAuthConfig
│ │ │ ├── com.alibaba.nacos.core.listener.startup.NacosStartUp
│ │ │ ├── com.alibaba.nacos.core.paramcheck.AbstractHttpParamExtractor
│ │ │ ├── com.alibaba.nacos.plugin.auth.spi.client.AbstractClientAuthService
│ │ │ ├── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ │ │ └── com.alibaba.nacos.sys.module.ModuleStateBuilder
│ │ ├── nacos-console-banner.txt
│ │ ├── nacos-console.properties
│ │ └── static/
│ │ ├── console-ui/
│ │ │ └── public/
│ │ │ ├── css/
│ │ │ │ ├── bootstrap.css
│ │ │ │ ├── codemirror.css
│ │ │ │ ├── console1412.css
│ │ │ │ ├── font-awesome.css
│ │ │ │ ├── icon.css
│ │ │ │ └── merge.css
│ │ │ └── js/
│ │ │ ├── codemirror.addone.fullscreen.js
│ │ │ ├── codemirror.addone.json-lint.js
│ │ │ ├── codemirror.addone.lint.js
│ │ │ ├── codemirror.js
│ │ │ ├── codemirror.lib.clike-lint.js
│ │ │ ├── codemirror.lib.json-lint.js
│ │ │ ├── diff_match_patch.js
│ │ │ ├── javascript.js
│ │ │ ├── jquery.js
│ │ │ ├── loader.js
│ │ │ ├── merge.js
│ │ │ ├── vs/
│ │ │ │ ├── base/
│ │ │ │ │ └── worker/
│ │ │ │ │ └── workerMain.js
│ │ │ │ ├── basic-languages/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── bat.js
│ │ │ │ │ ├── coffee.js
│ │ │ │ │ ├── cpp.js
│ │ │ │ │ ├── csharp.js
│ │ │ │ │ ├── css.js
│ │ │ │ │ ├── dockerfile.js
│ │ │ │ │ ├── fsharp.js
│ │ │ │ │ ├── go.js
│ │ │ │ │ ├── handlebars.js
│ │ │ │ │ ├── html.js
│ │ │ │ │ ├── ini.js
│ │ │ │ │ ├── java.js
│ │ │ │ │ ├── less.js
│ │ │ │ │ ├── lua.js
│ │ │ │ │ ├── markdown.js
│ │ │ │ │ ├── msdax.js
│ │ │ │ │ ├── objective-c.js
│ │ │ │ │ ├── php.js
│ │ │ │ │ ├── postiats.js
│ │ │ │ │ ├── powershell.js
│ │ │ │ │ ├── pug.js
│ │ │ │ │ ├── python.js
│ │ │ │ │ ├── r.js
│ │ │ │ │ ├── razor.js
│ │ │ │ │ ├── ruby.js
│ │ │ │ │ ├── sb.js
│ │ │ │ │ ├── scss.js
│ │ │ │ │ ├── solidity.js
│ │ │ │ │ ├── sql.js
│ │ │ │ │ ├── swift.js
│ │ │ │ │ ├── vb.js
│ │ │ │ │ ├── xml.js
│ │ │ │ │ └── yaml.js
│ │ │ │ ├── editor/
│ │ │ │ │ ├── editor.main.css
│ │ │ │ │ ├── editor.main.js
│ │ │ │ │ ├── editor.main.nls.de.js
│ │ │ │ │ ├── editor.main.nls.es.js
│ │ │ │ │ ├── editor.main.nls.fr.js
│ │ │ │ │ ├── editor.main.nls.hu.js
│ │ │ │ │ ├── editor.main.nls.it.js
│ │ │ │ │ ├── editor.main.nls.ja.js
│ │ │ │ │ ├── editor.main.nls.js
│ │ │ │ │ ├── editor.main.nls.ko.js
│ │ │ │ │ ├── editor.main.nls.pt-br.js
│ │ │ │ │ ├── editor.main.nls.ru.js
│ │ │ │ │ ├── editor.main.nls.tr.js
│ │ │ │ │ ├── editor.main.nls.zh-cn.js
│ │ │ │ │ └── editor.main.nls.zh-tw.js
│ │ │ │ ├── language/
│ │ │ │ │ ├── css/
│ │ │ │ │ │ ├── cssMode.js
│ │ │ │ │ │ └── cssWorker.js
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── htmlMode.js
│ │ │ │ │ │ └── htmlWorker.js
│ │ │ │ │ ├── json/
│ │ │ │ │ │ ├── jsonMode.js
│ │ │ │ │ │ └── jsonWorker.js
│ │ │ │ │ └── typescript/
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ └── typescriptServices.js
│ │ │ │ │ └── src/
│ │ │ │ │ ├── mode.js
│ │ │ │ │ └── worker.js
│ │ │ │ └── loader.js
│ │ │ └── xml.js
│ │ ├── css/
│ │ │ └── main.css
│ │ ├── index.html
│ │ ├── js/
│ │ │ └── main.js
│ │ └── login.html
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── console/
│ │ ├── NacosConsoleStartUpTest.java
│ │ ├── aot/
│ │ │ └── NacosRuntimeHintsTest.java
│ │ ├── cluster/
│ │ │ └── RemoteServerMemberManagerTest.java
│ │ ├── config/
│ │ │ ├── ConsoleAuthModuleStateBuilderTest.java
│ │ │ ├── ConsoleCorsConfigTest.java
│ │ │ ├── ConsoleDeploymentConfigTest.java
│ │ │ ├── ConsoleFunctionEnabledConfigTest.java
│ │ │ ├── ConsoleModuleStateBuilderTest.java
│ │ │ ├── ConsoleWebConfigTest.java
│ │ │ ├── NacosConsoleAuthConfigTest.java
│ │ │ └── NacosConsoleBeanPostProcessorConfigurationTest.java
│ │ ├── controller/
│ │ │ └── v3/
│ │ │ ├── ConsoleHealthControllerTest.java
│ │ │ ├── ConsoleServerStateControllerTest.java
│ │ │ ├── ai/
│ │ │ │ ├── ConsoleA2aControllerTest.java
│ │ │ │ └── ConsoleMcpControllerTest.java
│ │ │ ├── config/
│ │ │ │ ├── ConsoleConfigControllerTest.java
│ │ │ │ └── ConsoleHistoryControllerTest.java
│ │ │ ├── core/
│ │ │ │ ├── ConsoleClusterControllerTest.java
│ │ │ │ └── ConsoleNamespaceControllerTest.java
│ │ │ └── naming/
│ │ │ ├── ConsoleInstanceControllerTest.java
│ │ │ └── ConsoleServiceControllerTest.java
│ │ ├── exception/
│ │ │ └── ConsoleExceptionHandlerTest.java
│ │ ├── filter/
│ │ │ ├── NacosConsoleAuthFilterTest.java
│ │ │ └── XssFilterTest.java
│ │ ├── handler/
│ │ │ └── impl/
│ │ │ ├── AbstractServerStateHandlerTest.java
│ │ │ ├── ConditionFunctionEnabledTest.java
│ │ │ ├── inner/
│ │ │ │ ├── HealthInnerHandlerTest.java
│ │ │ │ ├── ServerStateInnerHandlerTest.java
│ │ │ │ ├── ai/
│ │ │ │ │ ├── A2aInnerHandlerTest.java
│ │ │ │ │ └── McpInnerHandlerTest.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigInnerHandlerTest.java
│ │ │ │ │ └── HistoryInnerHandlerTest.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── ClusterInnerHandlerTest.java
│ │ │ │ │ ├── NamespaceInnerHandlerTest.java
│ │ │ │ │ └── PluginInnerHandlerTest.java
│ │ │ │ └── naming/
│ │ │ │ ├── InstanceInnerHandlerTest.java
│ │ │ │ └── ServiceInnerHandlerTest.java
│ │ │ ├── noop/
│ │ │ │ ├── ai/
│ │ │ │ │ ├── A2aNoopHandlerTest.java
│ │ │ │ │ └── McpNoopHandlerTest.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigNoopHandlerTest.java
│ │ │ │ │ └── HistoryNoopHandlerTest.java
│ │ │ │ └── naming/
│ │ │ │ ├── InstanceNoopHandlerTest.java
│ │ │ │ └── ServiceNoopHandlerTest.java
│ │ │ └── remote/
│ │ │ ├── AbstractRemoteHandlerTest.java
│ │ │ ├── ConsoleMaintainerClientAuthPluginTest.java
│ │ │ ├── HealthRemoteHandlerTest.java
│ │ │ ├── NacosMaintainerClientHolderTest.java
│ │ │ ├── RemoteServerConnectorTest.java
│ │ │ ├── ServerStateRemoteHandlerTest.java
│ │ │ ├── ai/
│ │ │ │ ├── A2aRemoteHandlerTest.java
│ │ │ │ └── McpRemoteHandlerTest.java
│ │ │ ├── config/
│ │ │ │ ├── ConfigImportAndExportServiceTest.java
│ │ │ │ ├── ConfigRemoteHandlerTest.java
│ │ │ │ └── HistoryRemoteHandlerTest.java
│ │ │ ├── core/
│ │ │ │ ├── ClusterRemoteHandlerTest.java
│ │ │ │ ├── NamespaceRemoteHandlerTest.java
│ │ │ │ └── PluginRemoteHandlerTest.java
│ │ │ └── naming/
│ │ │ ├── InstanceRemoteHandlerTest.java
│ │ │ └── ServiceRemoteHandlerTest.java
│ │ ├── paramcheck/
│ │ │ └── ConsoleDefaultHttpParamExtractorTest.java
│ │ └── proxy/
│ │ ├── HealthProxyTest.java
│ │ ├── ServerStateProxyTest.java
│ │ ├── ai/
│ │ │ ├── A2aProxyTest.java
│ │ │ └── McpProxyTest.java
│ │ ├── config/
│ │ │ ├── ConfigProxyTest.java
│ │ │ └── HistoryProxyTest.java
│ │ ├── core/
│ │ │ ├── ClusterProxyTest.java
│ │ │ └── NamespaceProxyTest.java
│ │ └── naming/
│ │ ├── InstanceProxyTest.java
│ │ └── ServiceProxyTest.java
│ └── resources/
│ ├── mock/
│ │ ├── application.properties
│ │ └── existconf/
│ │ ├── announcement_zh_CN.conf
│ │ └── console-guide.conf
│ └── nacos-console.properties
├── console-ui/
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── README.md
│ ├── build/
│ │ ├── copy-dist.js
│ │ ├── copyFile.js
│ │ ├── webpack.base.conf.js
│ │ ├── webpack.dev.conf.js
│ │ └── webpack.prod.conf.js
│ ├── package.json
│ ├── public/
│ │ └── index.ejs
│ ├── src/
│ │ ├── components/
│ │ │ ├── BatchHandle/
│ │ │ │ ├── BatchHandle.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── CloneDialog/
│ │ │ │ ├── CloneDialog.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── Copy/
│ │ │ │ └── index.jsx
│ │ │ ├── DeleteDialog/
│ │ │ │ ├── DeleteDialog.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── DiffEditorDialog/
│ │ │ │ ├── DiffEditorDialog.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── EditorNameSpace/
│ │ │ │ ├── EditorNameSpace.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── ExportDialog/
│ │ │ │ ├── ExportDialog.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── ImportDialog/
│ │ │ │ ├── ImportDialog.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── MagicWandIcon/
│ │ │ │ └── MagicWandIcon.js
│ │ │ ├── MarkdownRenderer/
│ │ │ │ └── MarkdownRenderer.js
│ │ │ ├── MonacoEditor/
│ │ │ │ ├── MonacoEditor.tsx
│ │ │ │ ├── constant.ts
│ │ │ │ ├── index.scss
│ │ │ │ └── index.tsx
│ │ │ ├── NameSpaceList/
│ │ │ │ ├── NameSpaceList.js
│ │ │ │ ├── index.js
│ │ │ │ ├── index.scss
│ │ │ │ └── show.js
│ │ │ ├── NewNameSpace/
│ │ │ │ ├── NewNameSpace.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── Page/
│ │ │ │ └── TotalRender.js
│ │ │ ├── PageTitle/
│ │ │ │ └── index.js
│ │ │ ├── QueryResult/
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── RegionGroup/
│ │ │ │ ├── RegionGroup.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── ShowCodeing/
│ │ │ │ ├── ShowCodeing.js
│ │ │ │ ├── ShowServiceCodeing.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ └── SuccessDialog/
│ │ │ ├── SuccessDialog.js
│ │ │ ├── index.js
│ │ │ └── index.scss
│ │ ├── config.js
│ │ ├── constants.js
│ │ ├── globalLib.js
│ │ ├── index.js
│ │ ├── index.scss
│ │ ├── layouts/
│ │ │ ├── Header.js
│ │ │ ├── MainLayout.js
│ │ │ ├── index.scss
│ │ │ └── menu.js
│ │ ├── lib.js
│ │ ├── locales/
│ │ │ ├── en-US.js
│ │ │ ├── index.js
│ │ │ └── zh-CN.js
│ │ ├── pages/
│ │ │ ├── AI/
│ │ │ │ ├── AgentDetail/
│ │ │ │ │ ├── AgentDetail.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── AgentManagement/
│ │ │ │ │ ├── AgentManagement.js
│ │ │ │ │ ├── AgentManagement.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── McpDetail/
│ │ │ │ │ ├── CreateTools/
│ │ │ │ │ │ ├── AdvancedConfig.js
│ │ │ │ │ │ ├── AnnotationsEditor.js
│ │ │ │ │ │ ├── BasicInfo.js
│ │ │ │ │ │ ├── CreateTools.css
│ │ │ │ │ │ ├── DeleteTool.js
│ │ │ │ │ │ ├── InputSchema.js
│ │ │ │ │ │ ├── MetaEditor.js
│ │ │ │ │ │ ├── OutputSchema.js
│ │ │ │ │ │ ├── SchemaEditor.js
│ │ │ │ │ │ ├── components.js
│ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ └── utils.js
│ │ │ │ │ ├── McpDetail.css
│ │ │ │ │ ├── McpDetail.js
│ │ │ │ │ ├── ShowTools.css
│ │ │ │ │ ├── ShowTools.css.bak
│ │ │ │ │ ├── ShowTools.js
│ │ │ │ │ ├── Swagger2Tools.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── McpManagement/
│ │ │ │ │ ├── DashboardCard.js
│ │ │ │ │ ├── ImportMcpDialog.jsx
│ │ │ │ │ ├── McpManagement.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── NewAgent/
│ │ │ │ │ ├── NewAgent.js
│ │ │ │ │ ├── NewAgent.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── NewMcpServer/
│ │ │ │ │ ├── NewMcpServer.css
│ │ │ │ │ ├── NewMcpServer.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── NewPrompt/
│ │ │ │ │ ├── NewPrompt.js
│ │ │ │ │ ├── NewPrompt.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── NewSkill/
│ │ │ │ │ ├── NewSkill.js
│ │ │ │ │ ├── NewSkill.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── PromptDetail/
│ │ │ │ │ ├── PromptDetail.js
│ │ │ │ │ ├── PromptDetail.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── PromptManagement/
│ │ │ │ │ ├── PromptManagement.js
│ │ │ │ │ ├── PromptManagement.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── PromptOptimizeDialog/
│ │ │ │ │ ├── PromptOptimizeDialog.js
│ │ │ │ │ ├── PromptOptimizeDialog.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── PublishPromptVersion/
│ │ │ │ │ ├── PublishPromptVersion.js
│ │ │ │ │ ├── PublishPromptVersion.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── README.md
│ │ │ │ ├── SkillDetail/
│ │ │ │ │ ├── SkillDetail.js
│ │ │ │ │ ├── SkillDetail.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── SkillManagement/
│ │ │ │ │ ├── SkillManagement.js
│ │ │ │ │ ├── SkillManagement.scss
│ │ │ │ │ ├── SkillOptimizeDialog.js
│ │ │ │ │ ├── SkillOptimizeDialog.scss
│ │ │ │ │ └── index.js
│ │ │ │ └── services/
│ │ │ │ └── OpenApiService.js
│ │ │ ├── AuthorityControl/
│ │ │ │ ├── PermissionsManagement/
│ │ │ │ │ ├── NewPermissions.js
│ │ │ │ │ ├── PermissionsManagement.js
│ │ │ │ │ ├── PermissionsManagement.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── README.md
│ │ │ │ ├── RolesManagement/
│ │ │ │ │ ├── NewRole.js
│ │ │ │ │ ├── RolesManagement.js
│ │ │ │ │ ├── RolesManagement.scss
│ │ │ │ │ └── index.js
│ │ │ │ ├── UserManagement/
│ │ │ │ │ ├── NewUser.js
│ │ │ │ │ ├── PasswordReset.js
│ │ │ │ │ ├── UserManagement.js
│ │ │ │ │ ├── UserManagement.scss
│ │ │ │ │ └── index.js
│ │ │ │ └── authority.scss
│ │ │ ├── ClusterManagement/
│ │ │ │ └── ClusterNodeList/
│ │ │ │ ├── ClusterNodeList.js
│ │ │ │ ├── ClusterNodeList.scss
│ │ │ │ └── index.js
│ │ │ ├── ConfigurationManagement/
│ │ │ │ ├── ConfigDetail/
│ │ │ │ │ ├── ConfigCompared.js
│ │ │ │ │ ├── ConfigDetail.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── ConfigEditor/
│ │ │ │ │ ├── ConfigEditor.js
│ │ │ │ │ ├── NewConfigEditor.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── ConfigRollback/
│ │ │ │ │ ├── ConfigRollback.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── ConfigSync/
│ │ │ │ │ ├── ConfigSync.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── ConfigurationManagement/
│ │ │ │ │ ├── ConfigurationManagement.js
│ │ │ │ │ ├── DashboardCard.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── HistoryDetail/
│ │ │ │ │ ├── HistoryDetail.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── HistoryRollback/
│ │ │ │ │ ├── HistoryRollback.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ ├── ListeningToQuery/
│ │ │ │ │ ├── ListeningToQuery.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── index.scss
│ │ │ │ └── NewConfig/
│ │ │ │ ├── NewConfig.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── Login/
│ │ │ │ ├── Login.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── index.scss
│ │ │ ├── NameSpace/
│ │ │ │ ├── NameSpace.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ ├── PluginManagement/
│ │ │ │ └── PluginList/
│ │ │ │ ├── PluginDetail.js
│ │ │ │ ├── PluginList.js
│ │ │ │ ├── PluginList.scss
│ │ │ │ └── index.js
│ │ │ ├── Register/
│ │ │ │ ├── Register.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── index.scss
│ │ │ ├── ServiceManagement/
│ │ │ │ ├── ServiceDetail/
│ │ │ │ │ ├── EditClusterDialog.js
│ │ │ │ │ ├── EditInstanceDialog.js
│ │ │ │ │ ├── EditServiceDialog.js
│ │ │ │ │ ├── InstanceFilter.js
│ │ │ │ │ ├── InstanceTable.js
│ │ │ │ │ ├── ServiceDetail.js
│ │ │ │ │ ├── ServiceDetail.scss
│ │ │ │ │ ├── constant.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── util.js
│ │ │ │ ├── ServiceList/
│ │ │ │ │ ├── ServiceList.js
│ │ │ │ │ ├── ServiceList.scss
│ │ │ │ │ └── index.js
│ │ │ │ └── SubscriberList/
│ │ │ │ ├── SubscriberList.js
│ │ │ │ ├── SubscriberList.scss
│ │ │ │ └── index.js
│ │ │ ├── SettingCenter/
│ │ │ │ ├── CopilotConfig.js
│ │ │ │ ├── SettingCenter.js
│ │ │ │ ├── index.js
│ │ │ │ └── index.scss
│ │ │ └── Welcome/
│ │ │ ├── Welcome.js
│ │ │ └── index.js
│ │ ├── reducers/
│ │ │ ├── authority.js
│ │ │ ├── base.js
│ │ │ ├── configuration.js
│ │ │ ├── index.js
│ │ │ ├── locale.js
│ │ │ ├── namespace.js
│ │ │ └── subscribers.js
│ │ ├── theme/
│ │ │ ├── index.js
│ │ │ └── index.scss
│ │ └── utils/
│ │ ├── languageDetector.js
│ │ ├── message.js
│ │ ├── nacosutil.js
│ │ ├── request.js
│ │ └── validateContent.js
│ ├── test/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── commons/
│ │ │ └── commons.md
│ │ ├── config.json
│ │ ├── hosts
│ │ ├── install.sh
│ │ ├── package.json
│ │ ├── run.bat
│ │ ├── run.sh
│ │ ├── sample/
│ │ │ ├── configDetail.spec.js
│ │ │ ├── configurationManagement.spec.js
│ │ │ └── instanceFilter.spec.js
│ │ └── uploadfiles/
│ │ └── uploadfiles.md
│ └── tsconfig.json
├── copilot/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── copilot/
│ │ │ ├── adapter/
│ │ │ │ └── StreamResponseCallback.java
│ │ │ ├── capability/
│ │ │ │ └── prompt/
│ │ │ │ ├── PromptOptimizationPrompt.java
│ │ │ │ ├── SkillGenerationPrompt.java
│ │ │ │ └── SkillOptimizationPrompt.java
│ │ │ ├── config/
│ │ │ │ ├── CopilotAgentManager.java
│ │ │ │ ├── CopilotConfigStorage.java
│ │ │ │ ├── CopilotConfiguration.java
│ │ │ │ └── CopilotProperties.java
│ │ │ ├── constant/
│ │ │ │ └── CopilotConstants.java
│ │ │ ├── form/
│ │ │ │ ├── PromptDebugForm.java
│ │ │ │ ├── PromptOptimizationForm.java
│ │ │ │ ├── SkillGenerationForm.java
│ │ │ │ └── SkillOptimizationForm.java
│ │ │ ├── model/
│ │ │ │ ├── ChatMessage.java
│ │ │ │ ├── ChatRequest.java
│ │ │ │ ├── ChatResponse.java
│ │ │ │ ├── ConversationHistory.java
│ │ │ │ ├── ConversationMessage.java
│ │ │ │ ├── OptimizationChange.java
│ │ │ │ ├── PromptDebugRequest.java
│ │ │ │ ├── PromptDebugResponse.java
│ │ │ │ ├── PromptOptimizationRequest.java
│ │ │ │ ├── PromptOptimizationResponse.java
│ │ │ │ ├── SkillGenerationRequest.java
│ │ │ │ ├── SkillGenerationResponse.java
│ │ │ │ ├── SkillOptimizationRequest.java
│ │ │ │ ├── SkillOptimizationResponse.java
│ │ │ │ └── StreamResponseType.java
│ │ │ └── service/
│ │ │ ├── PromptDebugService.java
│ │ │ ├── PromptDebugServiceImpl.java
│ │ │ ├── PromptOptimizationService.java
│ │ │ ├── PromptOptimizationServiceImpl.java
│ │ │ ├── SkillGenerationService.java
│ │ │ ├── SkillGenerationServiceImpl.java
│ │ │ ├── SkillOptimizationService.java
│ │ │ ├── SkillOptimizationServiceImpl.java
│ │ │ └── StreamEventProcessor.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── copilot/
│ ├── config/
│ │ ├── CopilotAgentManagerTest.java
│ │ └── CopilotPropertiesTest.java
│ ├── form/
│ │ ├── SkillGenerationFormTest.java
│ │ └── SkillOptimizationFormTest.java
│ ├── model/
│ │ ├── ChatMessageTest.java
│ │ ├── ChatRequestTest.java
│ │ ├── ChatResponseTest.java
│ │ ├── OptimizationChangeTest.java
│ │ ├── SkillOptimizationResponseTest.java
│ │ └── StreamResponseTypeTest.java
│ └── service/
│ ├── SkillGenerationServiceImplTest.java
│ ├── SkillOptimizationServiceImplTest.java
│ └── StreamEventProcessorTest.java
├── core/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── core/
│ │ │ │ ├── ability/
│ │ │ │ │ ├── RemoteAbilityInitializer.java
│ │ │ │ │ ├── ServerAbilityInitializer.java
│ │ │ │ │ ├── ServerAbilityInitializerHolder.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ └── AbilityConfigs.java
│ │ │ │ │ └── control/
│ │ │ │ │ └── ServerAbilityControlManager.java
│ │ │ │ ├── auth/
│ │ │ │ │ ├── AbstractWebAuthFilter.java
│ │ │ │ │ ├── AuthAdminFilter.java
│ │ │ │ │ ├── AuthConfig.java
│ │ │ │ │ ├── AuthFilter.java
│ │ │ │ │ ├── AuthModuleStateBuilder.java
│ │ │ │ │ ├── InnerApiAuthEnabled.java
│ │ │ │ │ ├── NacosServerAdminAuthConfig.java
│ │ │ │ │ ├── NacosServerAuthConfig.java
│ │ │ │ │ └── RemoteRequestAuthFilter.java
│ │ │ │ ├── cluster/
│ │ │ │ │ ├── Member.java
│ │ │ │ │ ├── MemberChangeListener.java
│ │ │ │ │ ├── MemberLookup.java
│ │ │ │ │ ├── MemberMetaDataConstants.java
│ │ │ │ │ ├── MemberUtil.java
│ │ │ │ │ ├── MembersChangeEvent.java
│ │ │ │ │ ├── NacosMemberManager.java
│ │ │ │ │ ├── ServerMemberManager.java
│ │ │ │ │ ├── Task.java
│ │ │ │ │ ├── health/
│ │ │ │ │ │ ├── AbstractModuleHealthChecker.java
│ │ │ │ │ │ ├── ModuleHealthCheckerHolder.java
│ │ │ │ │ │ └── ReadinessResult.java
│ │ │ │ │ ├── lookup/
│ │ │ │ │ │ ├── AbstractMemberLookup.java
│ │ │ │ │ │ ├── AddressServerMemberLookup.java
│ │ │ │ │ │ ├── FileConfigMemberLookup.java
│ │ │ │ │ │ ├── LookupFactory.java
│ │ │ │ │ │ └── StandaloneMemberLookup.java
│ │ │ │ │ └── remote/
│ │ │ │ │ ├── ClusterRpcClientProxy.java
│ │ │ │ │ ├── MemberReportHandler.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── AbstractClusterRequest.java
│ │ │ │ │ │ ├── MemberReportRequest.java
│ │ │ │ │ │ ├── PluginAvailabilityRequest.java
│ │ │ │ │ │ └── PluginAvailabilityRequestHandler.java
│ │ │ │ │ └── response/
│ │ │ │ │ ├── MemberReportResponse.java
│ │ │ │ │ └── PluginAvailabilityResponse.java
│ │ │ │ ├── code/
│ │ │ │ │ ├── ControllerMethodsCache.java
│ │ │ │ │ ├── RequestMappingInfo.java
│ │ │ │ │ ├── SpringApplicationRunListener.java
│ │ │ │ │ ├── StandaloneProfileApplicationListener.java
│ │ │ │ │ └── condition/
│ │ │ │ │ ├── ParamRequestCondition.java
│ │ │ │ │ └── PathRequestCondition.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── AbstractDynamicConfig.java
│ │ │ │ │ ├── DistroModuleStateBuilder.java
│ │ │ │ │ └── RaftModuleStateBuilder.java
│ │ │ │ ├── console/
│ │ │ │ │ ├── ConsolePathTipConfig.java
│ │ │ │ │ └── NacosConsolePathTipFilter.java
│ │ │ │ ├── context/
│ │ │ │ │ ├── RequestContext.java
│ │ │ │ │ ├── RequestContextHolder.java
│ │ │ │ │ ├── addition/
│ │ │ │ │ │ ├── AddressContext.java
│ │ │ │ │ │ ├── AuthContext.java
│ │ │ │ │ │ ├── BasicContext.java
│ │ │ │ │ │ └── EngineContext.java
│ │ │ │ │ └── remote/
│ │ │ │ │ ├── HttpRequestContextConfig.java
│ │ │ │ │ └── HttpRequestContextFilter.java
│ │ │ │ ├── control/
│ │ │ │ │ ├── SpringValueConfigsInitializer.java
│ │ │ │ │ ├── TpsControl.java
│ │ │ │ │ ├── TpsControlConfig.java
│ │ │ │ │ ├── http/
│ │ │ │ │ │ ├── HttpTpsCheckRequestParser.java
│ │ │ │ │ │ ├── HttpTpsCheckRequestParserRegistry.java
│ │ │ │ │ │ ├── HttpTpsPointRegistry.java
│ │ │ │ │ │ ├── NacosHttpTpsControlRegistration.java
│ │ │ │ │ │ └── NacosHttpTpsFilter.java
│ │ │ │ │ └── remote/
│ │ │ │ │ ├── RemoteTpsCheckRequestParser.java
│ │ │ │ │ ├── RemoteTpsCheckRequestParserRegistry.java
│ │ │ │ │ └── TpsControlRequestFilter.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── compatibility/
│ │ │ │ │ │ └── Compatibility.java
│ │ │ │ │ └── v3/
│ │ │ │ │ ├── CoreOpsControllerV3.java
│ │ │ │ │ ├── NacosClusterControllerV3.java
│ │ │ │ │ ├── NamespaceControllerV3.java
│ │ │ │ │ ├── PluginControllerV3.java
│ │ │ │ │ ├── ServerLoaderControllerV3.java
│ │ │ │ │ └── ServerStateController.java
│ │ │ │ ├── distributed/
│ │ │ │ │ ├── AbstractConsistencyProtocol.java
│ │ │ │ │ ├── ConsistencyConfiguration.java
│ │ │ │ │ ├── ProtocolExecutor.java
│ │ │ │ │ ├── ProtocolManager.java
│ │ │ │ │ ├── distro/
│ │ │ │ │ │ ├── DistroConfig.java
│ │ │ │ │ │ ├── DistroConstants.java
│ │ │ │ │ │ ├── DistroProtocol.java
│ │ │ │ │ │ ├── component/
│ │ │ │ │ │ │ ├── DistroCallback.java
│ │ │ │ │ │ │ ├── DistroComponentHolder.java
│ │ │ │ │ │ │ ├── DistroDataProcessor.java
│ │ │ │ │ │ │ ├── DistroDataStorage.java
│ │ │ │ │ │ │ ├── DistroFailedTaskHandler.java
│ │ │ │ │ │ │ └── DistroTransportAgent.java
│ │ │ │ │ │ ├── entity/
│ │ │ │ │ │ │ ├── DistroData.java
│ │ │ │ │ │ │ └── DistroKey.java
│ │ │ │ │ │ ├── exception/
│ │ │ │ │ │ │ └── DistroException.java
│ │ │ │ │ │ ├── monitor/
│ │ │ │ │ │ │ ├── DistroRecord.java
│ │ │ │ │ │ │ └── DistroRecordsHolder.java
│ │ │ │ │ │ └── task/
│ │ │ │ │ │ ├── DistroTaskEngineHolder.java
│ │ │ │ │ │ ├── delay/
│ │ │ │ │ │ │ ├── DistroDelayTask.java
│ │ │ │ │ │ │ ├── DistroDelayTaskExecuteEngine.java
│ │ │ │ │ │ │ └── DistroDelayTaskProcessor.java
│ │ │ │ │ │ ├── execute/
│ │ │ │ │ │ │ ├── AbstractDistroExecuteTask.java
│ │ │ │ │ │ │ ├── DistroExecuteTaskExecuteEngine.java
│ │ │ │ │ │ │ ├── DistroSyncChangeTask.java
│ │ │ │ │ │ │ └── DistroSyncDeleteTask.java
│ │ │ │ │ │ ├── load/
│ │ │ │ │ │ │ └── DistroLoadDataTask.java
│ │ │ │ │ │ └── verify/
│ │ │ │ │ │ ├── DistroVerifyExecuteTask.java
│ │ │ │ │ │ └── DistroVerifyTimedTask.java
│ │ │ │ │ ├── id/
│ │ │ │ │ │ ├── IdGeneratorManager.java
│ │ │ │ │ │ └── SnowFlowerIdGenerator.java
│ │ │ │ │ └── raft/
│ │ │ │ │ ├── JRaftMaintainService.java
│ │ │ │ │ ├── JRaftProtocol.java
│ │ │ │ │ ├── JRaftServer.java
│ │ │ │ │ ├── JSnapshotOperation.java
│ │ │ │ │ ├── NacosClosure.java
│ │ │ │ │ ├── NacosStateMachine.java
│ │ │ │ │ ├── RaftConfig.java
│ │ │ │ │ ├── RaftErrorEvent.java
│ │ │ │ │ ├── RaftEvent.java
│ │ │ │ │ ├── RaftSysConstants.java
│ │ │ │ │ ├── exception/
│ │ │ │ │ │ ├── DuplicateRaftGroupException.java
│ │ │ │ │ │ ├── JRaftException.java
│ │ │ │ │ │ ├── NoLeaderException.java
│ │ │ │ │ │ └── NoSuchRaftGroupException.java
│ │ │ │ │ ├── processor/
│ │ │ │ │ │ ├── AbstractProcessor.java
│ │ │ │ │ │ ├── NacosReadRequestProcessor.java
│ │ │ │ │ │ └── NacosWriteRequestProcessor.java
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── FailoverClosure.java
│ │ │ │ │ ├── FailoverClosureImpl.java
│ │ │ │ │ ├── JRaftConstants.java
│ │ │ │ │ ├── JRaftLogOperation.java
│ │ │ │ │ ├── JRaftOps.java
│ │ │ │ │ ├── JRaftUtils.java
│ │ │ │ │ ├── RaftExecutor.java
│ │ │ │ │ ├── RaftOptionsBuilder.java
│ │ │ │ │ └── RetryRunner.java
│ │ │ │ ├── exception/
│ │ │ │ │ ├── ErrorCode.java
│ │ │ │ │ ├── KvStorageException.java
│ │ │ │ │ └── NacosApiExceptionHandler.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── LoggingApplicationListener.java
│ │ │ │ │ ├── NacosApplicationListener.java
│ │ │ │ │ ├── StartingApplicationListener.java
│ │ │ │ │ └── startup/
│ │ │ │ │ ├── AbstractNacosStartUp.java
│ │ │ │ │ ├── NacosCoreStartUp.java
│ │ │ │ │ ├── NacosStartUp.java
│ │ │ │ │ ├── NacosStartUpManager.java
│ │ │ │ │ └── NacosWebStartUp.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── form/
│ │ │ │ │ │ ├── AggregationForm.java
│ │ │ │ │ │ ├── PageForm.java
│ │ │ │ │ │ └── v3/
│ │ │ │ │ │ └── RaftCommandForm.java
│ │ │ │ │ └── request/
│ │ │ │ │ ├── LogUpdateRequest.java
│ │ │ │ │ └── LookupUpdateRequest.java
│ │ │ │ ├── monitor/
│ │ │ │ │ ├── GrpcServerThreadPoolMonitor.java
│ │ │ │ │ ├── MetricsMonitor.java
│ │ │ │ │ ├── NacosMeterRegistryCenter.java
│ │ │ │ │ └── topn/
│ │ │ │ │ ├── BaseTopNCounter.java
│ │ │ │ │ ├── FixedSizePriorityQueue.java
│ │ │ │ │ ├── StringTopNCounter.java
│ │ │ │ │ └── TopNConfig.java
│ │ │ │ ├── namespace/
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── NamespaceValidation.java
│ │ │ │ │ │ ├── NamespaceValidationConfig.java
│ │ │ │ │ │ └── NamespaceValidationRequestFilter.java
│ │ │ │ │ ├── injector/
│ │ │ │ │ │ ├── AbstractNamespaceDetailInjector.java
│ │ │ │ │ │ └── NamespaceDetailInjectorHolder.java
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── NamespaceTypeEnum.java
│ │ │ │ │ │ ├── TenantInfo.java
│ │ │ │ │ │ └── form/
│ │ │ │ │ │ ├── CreateNamespaceForm.java
│ │ │ │ │ │ └── NamespaceForm.java
│ │ │ │ │ └── repository/
│ │ │ │ │ ├── EmbeddedNamespacePersistServiceImpl.java
│ │ │ │ │ ├── ExternalNamespacePersistServiceImpl.java
│ │ │ │ │ ├── NamespacePersistService.java
│ │ │ │ │ └── NamespaceRowMapperInjector.java
│ │ │ │ ├── paramcheck/
│ │ │ │ │ ├── AbstractHttpParamExtractor.java
│ │ │ │ │ ├── AbstractRpcParamExtractor.java
│ │ │ │ │ ├── CheckConfiguration.java
│ │ │ │ │ ├── ExtractorManager.java
│ │ │ │ │ ├── ParamCheckerFilter.java
│ │ │ │ │ ├── ParamExtractor.java
│ │ │ │ │ ├── ServerParamCheckConfig.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── AgentRequestParamExtractor.java
│ │ │ │ │ ├── BatchInstanceRequestParamExtractor.java
│ │ │ │ │ ├── ConfigBatchListenRequestParamExtractor.java
│ │ │ │ │ ├── ConfigFuzzyWatchRequestParamsExtractor.java
│ │ │ │ │ ├── ConfigRequestParamExtractor.java
│ │ │ │ │ ├── InstanceRequestParamExtractor.java
│ │ │ │ │ ├── McpServerRequestParamExtractor.java
│ │ │ │ │ ├── PersistentInstanceRequestParamExtractor.java
│ │ │ │ │ ├── PromptRequestParamExtractor.java
│ │ │ │ │ ├── ServiceListRequestParamExtractor.java
│ │ │ │ │ ├── ServiceQueryRequestParamExtractor.java
│ │ │ │ │ └── SubscribeServiceRequestParamExtractor.java
│ │ │ │ ├── persistence/
│ │ │ │ │ ├── DerbySnapshotOperation.java
│ │ │ │ │ └── DistributedDatabaseOperateImpl.java
│ │ │ │ ├── plugin/
│ │ │ │ │ ├── CriticalPluginConfig.java
│ │ │ │ │ ├── PluginManager.java
│ │ │ │ │ ├── PluginStateProcessor.java
│ │ │ │ │ ├── PluginStateSnapshotOperation.java
│ │ │ │ │ ├── condition/
│ │ │ │ │ │ ├── ConditionOnClusterMode.java
│ │ │ │ │ │ └── ConditionOnStandaloneMode.java
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── PluginInfo.java
│ │ │ │ │ │ ├── PluginStateOperation.java
│ │ │ │ │ │ ├── PluginStateSnapshot.java
│ │ │ │ │ │ ├── form/
│ │ │ │ │ │ │ ├── PluginConfigForm.java
│ │ │ │ │ │ │ └── PluginStatusForm.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ ├── PluginDetailVO.java
│ │ │ │ │ │ └── PluginInfoVO.java
│ │ │ │ │ ├── storage/
│ │ │ │ │ │ ├── FilePluginStatePersistenceImpl.java
│ │ │ │ │ │ ├── PluginPersistenceException.java
│ │ │ │ │ │ └── PluginStatePersistenceService.java
│ │ │ │ │ └── sync/
│ │ │ │ │ ├── PluginStateApplier.java
│ │ │ │ │ ├── PluginStateSynchronizer.java
│ │ │ │ │ ├── RaftPluginStateSynchronizer.java
│ │ │ │ │ └── StandalonePluginStateSynchronizer.java
│ │ │ │ ├── remote/
│ │ │ │ │ ├── AbstractRequestFilter.java
│ │ │ │ │ ├── BaseRpcServer.java
│ │ │ │ │ ├── ClientConnectionEventListener.java
│ │ │ │ │ ├── ClientConnectionEventListenerRegistry.java
│ │ │ │ │ ├── Connection.java
│ │ │ │ │ ├── ConnectionManager.java
│ │ │ │ │ ├── ConnectionMeta.java
│ │ │ │ │ ├── HealthCheckRequestHandler.java
│ │ │ │ │ ├── LongConnectionMetricsCollector.java
│ │ │ │ │ ├── NacosRuntimeConnectionEjector.java
│ │ │ │ │ ├── RequestFilters.java
│ │ │ │ │ ├── RequestHandler.java
│ │ │ │ │ ├── RequestHandlerRegistry.java
│ │ │ │ │ ├── RpcAckCallbackSynchronizer.java
│ │ │ │ │ ├── RpcPushService.java
│ │ │ │ │ ├── RuntimeConnectionEjector.java
│ │ │ │ │ ├── core/
│ │ │ │ │ │ ├── RpcAckCallbackInitorOrCleaner.java
│ │ │ │ │ │ ├── ServerLoaderInfoRequestHandler.java
│ │ │ │ │ │ └── ServerReloaderRequestHandler.java
│ │ │ │ │ ├── event/
│ │ │ │ │ │ └── RemotingHeartBeatEvent.java
│ │ │ │ │ ├── grpc/
│ │ │ │ │ │ ├── AddressTransportFilter.java
│ │ │ │ │ │ ├── BaseGrpcServer.java
│ │ │ │ │ │ ├── ConnectionGeneratorService.java
│ │ │ │ │ │ ├── ConnectionGeneratorServiceDelegate.java
│ │ │ │ │ │ ├── ConnectionGeneratorServiceImpl.java
│ │ │ │ │ │ ├── GrpcBiStreamRequestAcceptor.java
│ │ │ │ │ │ ├── GrpcClusterServer.java
│ │ │ │ │ │ ├── GrpcConnection.java
│ │ │ │ │ │ ├── GrpcConnectionInterceptor.java
│ │ │ │ │ │ ├── GrpcRequestAcceptor.java
│ │ │ │ │ │ ├── GrpcSdkServer.java
│ │ │ │ │ │ ├── GrpcServerConstants.java
│ │ │ │ │ │ ├── InvokeSource.java
│ │ │ │ │ │ ├── PushAckIdGenerator.java
│ │ │ │ │ │ ├── RemoteParamCheckFilter.java
│ │ │ │ │ │ ├── filter/
│ │ │ │ │ │ │ ├── NacosGrpcServerTransportFilter.java
│ │ │ │ │ │ │ └── NacosGrpcServerTransportFilterServiceLoader.java
│ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ ├── NacosGrpcServerInterceptor.java
│ │ │ │ │ │ │ └── NacosGrpcServerInterceptorServiceLoader.java
│ │ │ │ │ │ └── negotiator/
│ │ │ │ │ │ ├── AbstractProtocolNegotiatorBuilderSingleton.java
│ │ │ │ │ │ ├── ClusterProtocolNegotiatorBuilderSingleton.java
│ │ │ │ │ │ ├── NacosGrpcProtocolNegotiator.java
│ │ │ │ │ │ ├── ProtocolNegotiatorBuilder.java
│ │ │ │ │ │ ├── SdkProtocolNegotiatorBuilderSingleton.java
│ │ │ │ │ │ └── tls/
│ │ │ │ │ │ ├── ClusterDefaultTlsProtocolNegotiatorBuilder.java
│ │ │ │ │ │ ├── DefaultTlsContextBuilder.java
│ │ │ │ │ │ ├── OptionalTlsProtocolNegotiator.java
│ │ │ │ │ │ └── SdkDefaultTlsProtocolNegotiatorBuilder.java
│ │ │ │ │ └── tls/
│ │ │ │ │ ├── RpcServerSslContextRefresher.java
│ │ │ │ │ ├── RpcServerSslContextRefresherHolder.java
│ │ │ │ │ ├── RpcServerTlsConfig.java
│ │ │ │ │ ├── RpcServerTlsConfigFactory.java
│ │ │ │ │ └── SslContextChangeAware.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── NacosClusterOperationService.java
│ │ │ │ │ ├── NacosServerLoaderService.java
│ │ │ │ │ ├── NacosServerStateService.java
│ │ │ │ │ └── NamespaceOperationService.java
│ │ │ │ ├── trace/
│ │ │ │ │ └── NacosCombinedTraceSubscriber.java
│ │ │ │ ├── utils/
│ │ │ │ │ ├── ClassUtils.java
│ │ │ │ │ ├── Commons.java
│ │ │ │ │ ├── GenericType.java
│ │ │ │ │ ├── GlobalExecutor.java
│ │ │ │ │ ├── Loggers.java
│ │ │ │ │ ├── OverrideParameterRequestWrapper.java
│ │ │ │ │ ├── PageUtil.java
│ │ │ │ │ ├── RemoteUtils.java
│ │ │ │ │ ├── ReuseHttpRequest.java
│ │ │ │ │ ├── ReuseHttpServletRequest.java
│ │ │ │ │ ├── ReuseUploadFileHttpServletRequest.java
│ │ │ │ │ ├── StringPool.java
│ │ │ │ │ └── WebUtils.java
│ │ │ │ └── web/
│ │ │ │ ├── FormSizeFilter.java
│ │ │ │ ├── NacosCoreWebConfiguration.java
│ │ │ │ ├── NacosWebBean.java
│ │ │ │ └── NacosWebServerListener.java
│ │ │ └── io/
│ │ │ └── grpc/
│ │ │ └── netty/
│ │ │ └── shaded/
│ │ │ └── io/
│ │ │ └── grpc/
│ │ │ └── netty/
│ │ │ └── NettyChannelHelper.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ ├── logback/
│ │ │ │ └── nacos.xml
│ │ │ ├── services/
│ │ │ │ ├── com.alibaba.nacos.api.remote.Payload
│ │ │ │ ├── com.alibaba.nacos.auth.config.NacosAuthConfig
│ │ │ │ ├── com.alibaba.nacos.common.ability.AbstractAbilityControlManager
│ │ │ │ ├── com.alibaba.nacos.core.ability.ServerAbilityInitializer
│ │ │ │ ├── com.alibaba.nacos.core.listener.NacosApplicationListener
│ │ │ │ ├── com.alibaba.nacos.core.listener.startup.NacosStartUp
│ │ │ │ ├── com.alibaba.nacos.core.paramcheck.AbstractRpcParamExtractor
│ │ │ │ ├── com.alibaba.nacos.core.remote.grpc.ConnectionGeneratorService
│ │ │ │ ├── com.alibaba.nacos.core.remote.grpc.negotiator.ProtocolNegotiatorBuilder
│ │ │ │ ├── com.alibaba.nacos.plugin.control.configs.ControlConfigsInitializer
│ │ │ │ ├── com.alibaba.nacos.plugin.control.connection.ConnectionMetricsCollector
│ │ │ │ └── com.alibaba.nacos.sys.module.ModuleStateBuilder
│ │ │ └── spring.factories
│ │ └── core-banner.txt
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── core/
│ │ ├── CoreUtApplication.java
│ │ ├── ability/
│ │ │ ├── AbilityControlManagerTest.java
│ │ │ ├── RemoteAbilityInitializerTest.java
│ │ │ ├── ServerAbilityInitializerHolderTest.java
│ │ │ ├── TestServerAbilityControlManager.java
│ │ │ └── config/
│ │ │ ├── AbilityConfigsTest.java
│ │ │ └── TestAbilityConfig.java
│ │ ├── auth/
│ │ │ ├── AuthAdminFilterTest.java
│ │ │ ├── AuthConfigTest.java
│ │ │ ├── AuthFilterTest.java
│ │ │ ├── AuthModuleStateBuilderTest.java
│ │ │ ├── InnerApiAuthEnabledTest.java
│ │ │ ├── NacosServerAdminAuthConfigTest.java
│ │ │ ├── NacosServerAuthConfigTest.java
│ │ │ └── RemoteRequestAuthFilterTest.java
│ │ ├── cluster/
│ │ │ ├── MemberChangeListenerTest.java
│ │ │ ├── MemberLookupTest.java
│ │ │ ├── MemberMetaDataConstantsTest.java
│ │ │ ├── MemberTest.java
│ │ │ ├── MemberUtilTest.java
│ │ │ ├── MembersChangeEventTest.java
│ │ │ ├── ServerMemberManagerTest.java
│ │ │ ├── TaskTest.java
│ │ │ ├── health/
│ │ │ │ ├── ModuleHealthCheckerHolderTest.java
│ │ │ │ └── ReadinessResultTest.java
│ │ │ ├── lookup/
│ │ │ │ ├── AddressServerMemberLookupTest.java
│ │ │ │ ├── FileConfigMemberLookupTest.java
│ │ │ │ └── LookupFactoryTest.java
│ │ │ └── remote/
│ │ │ ├── ClusterRpcClientProxyTest.java
│ │ │ ├── MemberReportHandlerTest.java
│ │ │ ├── request/
│ │ │ │ ├── AbstractClusterRequestTest.java
│ │ │ │ ├── MemberReportRequestTest.java
│ │ │ │ ├── PluginAvailabilityRequestHandlerTest.java
│ │ │ │ └── PluginAvailabilityRequestTest.java
│ │ │ └── response/
│ │ │ ├── MemberReportResponseTest.java
│ │ │ └── PluginAvailabilityResponseTest.java
│ │ ├── code/
│ │ │ ├── ControllerMethodsCacheTest.java
│ │ │ ├── RequestMappingInfoTest.java
│ │ │ ├── SpringApplicationRunListenerTest.java
│ │ │ └── condition/
│ │ │ ├── ParamRequestConditionTest.java
│ │ │ └── PathRequestConditionTest.java
│ │ ├── config/
│ │ │ ├── DistroModuleStateBuilderTest.java
│ │ │ ├── ModuleStateClusterTest.java
│ │ │ ├── ModuleStateStandaloneTest.java
│ │ │ └── RaftModuleStateBuilderTest.java
│ │ ├── console/
│ │ │ ├── ConsolePathTipConfigTest.java
│ │ │ └── NacosConsolePathTipFilterTest.java
│ │ ├── context/
│ │ │ ├── RequestContextHolderTest.java
│ │ │ ├── RequestContextTest.java
│ │ │ ├── addition/
│ │ │ │ ├── AddressContextTest.java
│ │ │ │ ├── AuthContextTest.java
│ │ │ │ ├── BasicContextTest.java
│ │ │ │ └── EngineContextTest.java
│ │ │ └── remote/
│ │ │ ├── HttpRequestContextConfigTest.java
│ │ │ └── HttpRequestContextFilterTest.java
│ │ ├── control/
│ │ │ ├── SpringValueConfigsInitializerTest.java
│ │ │ ├── TpsControlConfigTest.java
│ │ │ ├── http/
│ │ │ │ ├── HttpTpsCheckRequestParserRegistryTest.java
│ │ │ │ ├── HttpTpsPointRegistryTest.java
│ │ │ │ ├── NacosHttpTpsControlRegistrationTest.java
│ │ │ │ └── NacosHttpTpsFilterTest.java
│ │ │ └── remote/
│ │ │ ├── RemoteTpsCheckRequestParserRegistryTest.java
│ │ │ └── TpsControlRequestFilterTest.java
│ │ ├── controller/
│ │ │ └── v3/
│ │ │ ├── CoreOpsControllerV3Test.java
│ │ │ ├── NacosClusterControllerV3Test.java
│ │ │ ├── NamespaceControllerV3Test.java
│ │ │ ├── PluginControllerV3Test.java
│ │ │ ├── ServerLoaderControllerV3Test.java
│ │ │ └── ServerStateControllerTest.java
│ │ ├── distributed/
│ │ │ ├── AbstractConsistencyProtocolTest.java
│ │ │ ├── ConsistencyConfigurationTest.java
│ │ │ ├── ProtocolExecutorTest.java
│ │ │ ├── ProtocolManagerTest.java
│ │ │ ├── distro/
│ │ │ │ ├── DistroConfigTest.java
│ │ │ │ ├── DistroConstantsTest.java
│ │ │ │ ├── DistroProtocolTest.java
│ │ │ │ ├── component/
│ │ │ │ │ └── DistroComponentHolderTest.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── DistroDataTest.java
│ │ │ │ │ └── DistroKeyTest.java
│ │ │ │ ├── exception/
│ │ │ │ │ └── DistroExceptionTest.java
│ │ │ │ ├── monitor/
│ │ │ │ │ ├── DistroRecordTest.java
│ │ │ │ │ └── DistroRecordsHolderTest.java
│ │ │ │ └── task/
│ │ │ │ ├── DistroTaskEngineHolderTest.java
│ │ │ │ ├── delay/
│ │ │ │ │ ├── DistroDelayTaskExecuteEngineTest.java
│ │ │ │ │ ├── DistroDelayTaskProcessorTest.java
│ │ │ │ │ └── DistroDelayTaskTest.java
│ │ │ │ ├── execute/
│ │ │ │ │ ├── DistroSyncChangeTaskTest.java
│ │ │ │ │ └── DistroSyncDeleteTaskTest.java
│ │ │ │ ├── load/
│ │ │ │ │ └── DistroLoadDataTaskTest.java
│ │ │ │ └── verify/
│ │ │ │ ├── DistroVerifyExecuteTaskTest.java
│ │ │ │ └── DistroVerifyTimedTaskTest.java
│ │ │ ├── id/
│ │ │ │ ├── IdGeneratorManagerTest.java
│ │ │ │ ├── SnowFlowerInstanceIdGeneratorTest.java
│ │ │ │ └── TestIdGenerator.java
│ │ │ └── raft/
│ │ │ ├── JRaftMaintainServiceTest.java
│ │ │ ├── JRaftProtocolTest.java
│ │ │ ├── JRaftServerTest.java
│ │ │ ├── JSnapshotOperationTest.java
│ │ │ ├── NacosClosureTest.java
│ │ │ ├── NacosStateMachineTest.java
│ │ │ ├── RaftConfigTest.java
│ │ │ ├── RaftErrorEventTest.java
│ │ │ ├── RaftEventTest.java
│ │ │ ├── RaftSysConstantsTest.java
│ │ │ ├── exception/
│ │ │ │ ├── DuplicateRaftGroupExceptionTest.java
│ │ │ │ ├── JRaftExceptionTest.java
│ │ │ │ ├── NoLeaderExceptionTest.java
│ │ │ │ └── NoSuchRaftGroupExceptionTest.java
│ │ │ ├── processor/
│ │ │ │ ├── AbstractProcessorTest.java
│ │ │ │ └── NacosReadRequestProcessorTest.java
│ │ │ └── utils/
│ │ │ ├── FailoverClosureImplTest.java
│ │ │ ├── JRaftConstantsTest.java
│ │ │ ├── JRaftLogOperationTest.java
│ │ │ ├── JRaftOpsExecuteTest.java
│ │ │ ├── JRaftOpsTest.java
│ │ │ ├── JRaftUtilsTest.java
│ │ │ ├── RaftExecutorTest.java
│ │ │ ├── RaftOptionsBuilderTest.java
│ │ │ └── RetryRunnerTest.java
│ │ ├── exception/
│ │ │ ├── ErrorCodeTest.java
│ │ │ ├── KvStorageExceptionTest.java
│ │ │ └── NacosApiExceptionHandlerTest.java
│ │ ├── listener/
│ │ │ ├── LoggingApplicationListenerTest.java
│ │ │ ├── NacosApplicationListenerTest.java
│ │ │ ├── StandaloneProfileApplicationListenerTest.java
│ │ │ ├── StartingApplicationListenerTest.java
│ │ │ └── startup/
│ │ │ ├── AbstractNacosStartUpTest.java
│ │ │ ├── NacosCoreStartUpTest.java
│ │ │ ├── NacosStartUpManagerTest.java
│ │ │ └── NacosWebStartUpTest.java
│ │ ├── mock/
│ │ │ └── MockAuthPluginServiceB.java
│ │ ├── model/
│ │ │ ├── form/
│ │ │ │ ├── AggregationFormTest.java
│ │ │ │ ├── PageFormTest.java
│ │ │ │ └── v3/
│ │ │ │ └── RaftCommandFormTest.java
│ │ │ └── request/
│ │ │ ├── LogUpdateRequestTest.java
│ │ │ └── LookupUpdateRequestTest.java
│ │ ├── monitor/
│ │ │ ├── GrpcServerThreadPoolMonitorTest.java
│ │ │ ├── MetricsMonitorTest.java
│ │ │ ├── NacosMeterRegistryCenterTest.java
│ │ │ └── topn/
│ │ │ ├── FixedSizePriorityQueueTest.java
│ │ │ ├── StringTopNCounterTest.java
│ │ │ └── TopNConfigTest.java
│ │ ├── namespace/
│ │ │ ├── filter/
│ │ │ │ ├── NamespaceValidationConfigTest.java
│ │ │ │ └── NamespaceValidationRequestFilterTest.java
│ │ │ ├── model/
│ │ │ │ ├── NamespaceTypeEnumTest.java
│ │ │ │ └── form/
│ │ │ │ ├── CreateNamespaceFormTest.java
│ │ │ │ └── NamespaceFormTest.java
│ │ │ └── repository/
│ │ │ ├── EmbeddedNamespacePersistServiceTest.java
│ │ │ ├── ExternalNamespacePersistServiceTest.java
│ │ │ └── NamespaceRowMapperInjectorTest.java
│ │ ├── paramcheck/
│ │ │ ├── CheckConfigurationTest.java
│ │ │ ├── ExtractorManagerTest.java
│ │ │ ├── ParamCheckerFilterTest.java
│ │ │ ├── ParamExtractorTest.java
│ │ │ ├── ServerParamCheckConfigTest.java
│ │ │ └── impl/
│ │ │ ├── AgentRequestParamExtractorTest.java
│ │ │ ├── BatchInstanceRequestParamExtractorTest.java
│ │ │ ├── ConfigBatchListenRequestParamExtractorTest.java
│ │ │ ├── ConfigFuzzyWatchRequestParamsExtractorTest.java
│ │ │ ├── ConfigRequestParamExtractorTest.java
│ │ │ ├── InstanceRequestParamExtractorTest.java
│ │ │ ├── McpServerRequestParamExtractorTest.java
│ │ │ ├── PersistentInstanceRequestParamExtractorTest.java
│ │ │ ├── PromptRequestParamExtractorTest.java
│ │ │ ├── ServiceListRequestParamExtractorTest.java
│ │ │ ├── ServiceQueryRequestParamExtractorTest.java
│ │ │ └── SubscribeServiceRequestParamExtractorTest.java
│ │ ├── persistence/
│ │ │ ├── DerbySnapshotOperationTest.java
│ │ │ └── DistributedDatabaseOperateImplTest.java
│ │ ├── plugin/
│ │ │ ├── CriticalPluginConfigTest.java
│ │ │ ├── PluginClusterSyncIntegrationTest.java
│ │ │ ├── PluginManagerTest.java
│ │ │ ├── PluginStateProcessorTest.java
│ │ │ ├── PluginStateSnapshotOperationTest.java
│ │ │ ├── condition/
│ │ │ │ ├── ConditionOnClusterModeTest.java
│ │ │ │ └── ConditionOnStandaloneModeTest.java
│ │ │ ├── model/
│ │ │ │ ├── PluginInfoTest.java
│ │ │ │ ├── PluginStateOperationTest.java
│ │ │ │ ├── PluginStateSnapshotTest.java
│ │ │ │ ├── form/
│ │ │ │ │ ├── PluginConfigFormTest.java
│ │ │ │ │ └── PluginStatusFormTest.java
│ │ │ │ └── vo/
│ │ │ │ ├── PluginDetailVOTest.java
│ │ │ │ └── PluginInfoVOTest.java
│ │ │ ├── storage/
│ │ │ │ ├── FilePluginStatePersistenceImplTest.java
│ │ │ │ ├── PluginPersistenceExceptionTest.java
│ │ │ │ └── PluginStatePersistenceTest.java
│ │ │ └── sync/
│ │ │ ├── RaftPluginStateSynchronizerTest.java
│ │ │ └── StandalonePluginStateSynchronizerTest.java
│ │ ├── remote/
│ │ │ ├── BaseRpcServerTest.java
│ │ │ ├── ClientConnectionEventListenerRegistryTest.java
│ │ │ ├── ClientConnectionEventListenerTest.java
│ │ │ ├── ConnectionManagerTest.java
│ │ │ ├── ConnectionMetaTest.java
│ │ │ ├── ConnectionTest.java
│ │ │ ├── HealthCheckRequestHandlerTest.java
│ │ │ ├── LongConnectionMetricsCollectorTest.java
│ │ │ ├── NacosRuntimeConnectionEjectorTest.java
│ │ │ ├── RequestFiltersTest.java
│ │ │ ├── RequestHandlerRegistryTest.java
│ │ │ ├── RpcAckCallbackSynchronizerTest.java
│ │ │ ├── RpcPushServiceTest.java
│ │ │ ├── RuntimeConnectionEjectorTest.java
│ │ │ ├── core/
│ │ │ │ ├── RpcAckCallbackInitorOrCleanerTest.java
│ │ │ │ ├── ServerLoaderInfoRequestHandlerTest.java
│ │ │ │ └── ServerReloaderRequestHandlerTest.java
│ │ │ ├── event/
│ │ │ │ └── RemotingHeartBeatEventTest.java
│ │ │ ├── grpc/
│ │ │ │ ├── AddressTransportFilterTest.java
│ │ │ │ ├── ConnectionGeneratorServiceDelegateTest.java
│ │ │ │ ├── ConnectionGeneratorServiceImplTest.java
│ │ │ │ ├── GrpcBiStreamRequestAcceptorTest.java
│ │ │ │ ├── GrpcConnectionInterceptorTest.java
│ │ │ │ ├── GrpcConnectionTest.java
│ │ │ │ ├── GrpcRequestAcceptorTest.java
│ │ │ │ ├── GrpcServerConstantsTest.java
│ │ │ │ ├── GrpcServerTest.java
│ │ │ │ ├── PushAckIdGeneratorTest.java
│ │ │ │ ├── RemoteParamCheckFilterTest.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── NacosGrpcServerTransportFilterServiceLoaderTest.java
│ │ │ │ │ └── NacosGrpcServerTransportFilterTest.java
│ │ │ │ ├── interceptor/
│ │ │ │ │ ├── NacosGrpcServerInterceptorServiceLoaderTest.java
│ │ │ │ │ └── NacosGrpcServerInterceptorTest.java
│ │ │ │ └── negotiator/
│ │ │ │ ├── ClusterProtocolNegotiatorBuilderSingletonTest.java
│ │ │ │ ├── SdkProtocolNegotiatorBuilderSingletonTest.java
│ │ │ │ └── tls/
│ │ │ │ ├── ClusterDefaultTlsProtocolNegotiatorBuilderTest.java
│ │ │ │ ├── OptionalTlsProtocolNegotiatorTest.java
│ │ │ │ ├── RpcServerSslContextRefresherHolderTest.java
│ │ │ │ ├── SdkDefaultTlsContextBuilderTest.java
│ │ │ │ └── SdkDefaultTlsProtocolNegotiatorBuilderTest.java
│ │ │ └── tls/
│ │ │ ├── RpcClusterServerSslContextRefresherTest.java
│ │ │ ├── RpcSdkServerSslContextRefresherTest.java
│ │ │ └── RpcServerSslContextRefresherHolderTest.java
│ │ ├── service/
│ │ │ ├── NacosClusterOperationServiceTest.java
│ │ │ ├── NacosServerLoaderServiceTest.java
│ │ │ ├── NacosServerStateServiceTest.java
│ │ │ └── NamespaceOperationServiceTest.java
│ │ ├── trace/
│ │ │ └── NacosCombinedTraceSubscriberTest.java
│ │ ├── utils/
│ │ │ ├── ClassUtilsTest.java
│ │ │ ├── CommonsTest.java
│ │ │ ├── GenericTypeTest.java
│ │ │ ├── GlobalExecutorTest.java
│ │ │ ├── LoggersTest.java
│ │ │ ├── OverrideParameterRequestWrapperTest.java
│ │ │ ├── PageUtilTest.java
│ │ │ ├── RemoteUtilsTest.java
│ │ │ ├── ReuseHttpServletRequestTest.java
│ │ │ ├── ReuseUploadFileHttpServletRequestTest.java
│ │ │ ├── StringPoolTest.java
│ │ │ ├── SystemUtilsTest.java
│ │ │ └── WebUtilsTest.java
│ │ └── web/
│ │ ├── FormSizeFilterTest.java
│ │ ├── NacosCoreWebConfigurationTest.java
│ │ └── NacosWebServerListenerTest.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.consistency.IdGenerator
│ │ ├── com.alibaba.nacos.core.paramcheck.AbstractHttpParamExtractor
│ │ ├── com.alibaba.nacos.core.remote.tls.RpcServerSslContextRefresher
│ │ └── com.alibaba.nacos.plugin.auth.spi.server.AuthPluginService
│ ├── application.properties
│ ├── logback-test.xml
│ ├── test-ca-cert.pem
│ ├── test-server-cert.pem
│ └── test-server-key.pem
├── distribution/
│ ├── LICENSE-BIN
│ ├── NOTICE-BIN
│ ├── bin/
│ │ ├── shutdown.cmd
│ │ ├── shutdown.sh
│ │ ├── startup-native.sh
│ │ ├── startup.cmd
│ │ └── startup.sh
│ ├── conf/
│ │ ├── announcement_en-US.conf
│ │ ├── announcement_zh-CN.conf
│ │ ├── application.properties
│ │ ├── cluster.conf.example
│ │ ├── console-guide.conf
│ │ └── nacos-logback.xml
│ ├── pom.xml
│ ├── release-address.xml
│ ├── release-client.xml
│ ├── release-nacos.xml
│ └── release-native.xml
├── example/
│ ├── README.md
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── example/
│ │ ├── App.java
│ │ ├── ConfigExample.java
│ │ ├── ConfigFuzzyWatchExample.java
│ │ ├── NamingExample.java
│ │ └── NamingFuzzyWatchExample.java
│ └── resources/
│ └── logback.xml
├── istio/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── istio/
│ │ │ ├── IstioApp.java
│ │ │ ├── api/
│ │ │ │ ├── ApiConstants.java
│ │ │ │ ├── ApiGenerator.java
│ │ │ │ └── ApiGeneratorFactory.java
│ │ │ ├── common/
│ │ │ │ ├── AbstractConnection.java
│ │ │ │ ├── Debounce.java
│ │ │ │ ├── EventProcessor.java
│ │ │ │ ├── IstioConfigProcessor.java
│ │ │ │ ├── NacosResourceManager.java
│ │ │ │ ├── NacosServiceInfoResourceWatcher.java
│ │ │ │ ├── ResourceSnapshot.java
│ │ │ │ └── WatchedStatus.java
│ │ │ ├── config/
│ │ │ │ └── IstioEnabledFilter.java
│ │ │ ├── mcp/
│ │ │ │ ├── EmptyMcpGenerator.java
│ │ │ │ ├── McpConnection.java
│ │ │ │ ├── NacosMcpService.java
│ │ │ │ └── ServiceEntryMcpGenerator.java
│ │ │ ├── misc/
│ │ │ │ ├── IstioConfig.java
│ │ │ │ └── Loggers.java
│ │ │ ├── model/
│ │ │ │ ├── DestinationRule.java
│ │ │ │ ├── IstioEndpoint.java
│ │ │ │ ├── IstioResources.java
│ │ │ │ ├── IstioService.java
│ │ │ │ ├── PushRequest.java
│ │ │ │ ├── ServiceEntryWrapper.java
│ │ │ │ └── VirtualService.java
│ │ │ ├── server/
│ │ │ │ ├── IstioServer.java
│ │ │ │ └── ServerInterceptor.java
│ │ │ ├── util/
│ │ │ │ ├── IstioCrdUtil.java
│ │ │ │ ├── IstioExecutor.java
│ │ │ │ └── NonceGenerator.java
│ │ │ └── xds/
│ │ │ ├── CdsGenerator.java
│ │ │ ├── DeltaConnection.java
│ │ │ ├── EdsGenerator.java
│ │ │ ├── EmptyXdsGenerator.java
│ │ │ ├── LdsGenerator.java
│ │ │ ├── NacosXdsService.java
│ │ │ ├── RdsGenerator.java
│ │ │ ├── ServiceEntryXdsGenerator.java
│ │ │ └── XdsConnection.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ │ └── proto/
│ │ ├── gogoproto/
│ │ │ └── gogo.proto
│ │ ├── google/
│ │ │ └── protobuf/
│ │ │ └── any.proto
│ │ ├── mcp/
│ │ │ ├── Readme.md
│ │ │ └── v1alpha1/
│ │ │ ├── mcp.proto
│ │ │ ├── metadata.proto
│ │ │ └── resource.proto
│ │ └── networking/
│ │ └── v1alpha3/
│ │ ├── destination_rule.proto
│ │ ├── envoy_filter.proto
│ │ ├── gateway.proto
│ │ ├── service_entry.proto
│ │ ├── sidecar.proto
│ │ ├── virtual_service.proto
│ │ ├── workload_entry.proto
│ │ └── workload_group.proto
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── istio/
│ └── config/
│ └── IstioEnabledFilterTest.java
├── k8s-sync/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── k8s/
│ │ │ └── sync/
│ │ │ ├── K8sSyncConfig.java
│ │ │ ├── K8sSyncEnabledFilter.java
│ │ │ ├── K8sSyncServer.java
│ │ │ └── Loggers.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── k8s/
│ └── sync/
│ └── K8sSyncEnabledFilterTest.java
├── lock/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── lock/
│ │ │ ├── LockManager.java
│ │ │ ├── NacosLockManager.java
│ │ │ ├── aspect/
│ │ │ │ └── RequestLockAspect.java
│ │ │ ├── constant/
│ │ │ │ ├── Constants.java
│ │ │ │ └── PropertiesConstant.java
│ │ │ ├── core/
│ │ │ │ └── reentrant/
│ │ │ │ ├── AbstractAtomicLock.java
│ │ │ │ ├── AtomicLockService.java
│ │ │ │ └── mutex/
│ │ │ │ └── MutexAtomicLock.java
│ │ │ ├── exception/
│ │ │ │ └── NacosLockException.java
│ │ │ ├── factory/
│ │ │ │ ├── LockFactory.java
│ │ │ │ └── SimpleLockFactory.java
│ │ │ ├── model/
│ │ │ │ ├── LockInfo.java
│ │ │ │ └── LockKey.java
│ │ │ ├── monitor/
│ │ │ │ ├── LockMemoryMonitor.java
│ │ │ │ └── LockMetricsMonitor.java
│ │ │ ├── persistence/
│ │ │ │ └── NacosLockSnapshotOperation.java
│ │ │ ├── raft/
│ │ │ │ └── request/
│ │ │ │ └── MutexLockRequest.java
│ │ │ ├── remote/
│ │ │ │ └── rpc/
│ │ │ │ └── handler/
│ │ │ │ └── LockRequestHandler.java
│ │ │ └── service/
│ │ │ ├── LockOperationService.java
│ │ │ └── impl/
│ │ │ └── LockOperationServiceImpl.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.lock.factory.LockFactory
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── lock/
│ │ ├── LockManagerTest.java
│ │ ├── core/
│ │ │ └── reentrant/
│ │ │ └── mutex/
│ │ │ ├── ClientAtomicLock.java
│ │ │ └── MutexAtomicLockTest.java
│ │ ├── factory/
│ │ │ └── ClientLockFactory.java
│ │ ├── remote/
│ │ │ └── rpc/
│ │ │ └── handler/
│ │ │ └── LockRequestHandlerTest.java
│ │ └── service/
│ │ └── impl/
│ │ └── LockOperationServiceImplTest.java
│ └── resources/
│ └── META-INF/
│ └── services/
│ └── com.alibaba.nacos.lock.factory.LockFactory
├── logger-adapter-impl/
│ ├── log4j2-adapter/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── logger/
│ │ │ │ └── adapter/
│ │ │ │ └── log4j2/
│ │ │ │ ├── Log4J2NacosLoggingAdapter.java
│ │ │ │ ├── Log4j2NacosLoggingAdapterBuilder.java
│ │ │ │ ├── Log4j2NacosLoggingPropertiesHolder.java
│ │ │ │ ├── NacosClientPropertiesLookup.java
│ │ │ │ └── NacosLog4j2Configurator.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── services/
│ │ │ │ └── com.alibaba.nacos.common.logging.NacosLoggingAdapterBuilder
│ │ │ └── nacos-log4j2.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── logger/
│ │ └── adapter/
│ │ └── log4j2/
│ │ ├── Log4J2NacosLoggingAdapterTest.java
│ │ ├── Log4j2NacosLoggingAdapterBuilderTest.java
│ │ └── NacosClientPropertiesLookupTest.java
│ ├── logback-adapter-12/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── logger/
│ │ │ │ └── adapter/
│ │ │ │ └── logback12/
│ │ │ │ ├── LogbackNacosLoggingAdapter.java
│ │ │ │ ├── LogbackNacosLoggingAdapterBuilder.java
│ │ │ │ ├── NacosClientPropertyAction.java
│ │ │ │ └── NacosLogbackConfiguratorAdapterV1.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── services/
│ │ │ │ ├── com.alibaba.nacos.common.logging.NacosLoggingAdapter
│ │ │ │ └── com.alibaba.nacos.common.logging.NacosLoggingAdapterBuilder
│ │ │ └── nacos-logback12.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── logger/
│ │ └── adapter/
│ │ └── logback12/
│ │ ├── LogbackNacosLoggingAdapterBuilderTest.java
│ │ ├── LogbackNacosLoggingAdapterTest.java
│ │ ├── NacosClientPropertyActionTest.java
│ │ └── NacosLogbackConfiguratorAdapterV1Test.java
│ └── pom.xml
├── maintainer-client/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── maintainer/
│ │ └── client/
│ │ ├── NacosMaintainerFactory.java
│ │ ├── address/
│ │ │ └── DefaultServerListManager.java
│ │ ├── ai/
│ │ │ ├── A2aMaintainerService.java
│ │ │ ├── AiMaintainerFactory.java
│ │ │ ├── AiMaintainerService.java
│ │ │ ├── McpMaintainerService.java
│ │ │ ├── NacosAiMaintainerServiceImpl.java
│ │ │ ├── PromptMaintainerService.java
│ │ │ └── SkillMaintainerService.java
│ │ ├── config/
│ │ │ ├── BetaConfigMaintainerService.java
│ │ │ ├── ConfigHistoryMaintainerService.java
│ │ │ ├── ConfigMaintainerFactory.java
│ │ │ ├── ConfigMaintainerService.java
│ │ │ ├── ConfigOpsMaintainerService.java
│ │ │ └── NacosConfigMaintainerServiceImpl.java
│ │ ├── constants/
│ │ │ └── Constants.java
│ │ ├── core/
│ │ │ ├── AbstractCoreMaintainerService.java
│ │ │ └── CoreMaintainerService.java
│ │ ├── model/
│ │ │ └── HttpRequest.java
│ │ ├── naming/
│ │ │ ├── InstanceMaintainerService.java
│ │ │ ├── NacosNamingMaintainerServiceImpl.java
│ │ │ ├── NamingClientMaintainerService.java
│ │ │ ├── NamingMaintainerFactory.java
│ │ │ ├── NamingMaintainerService.java
│ │ │ └── ServiceMaintainerService.java
│ │ ├── remote/
│ │ │ ├── ClientHttpProxy.java
│ │ │ └── HttpClientManager.java
│ │ └── utils/
│ │ ├── ParamUtil.java
│ │ └── RequestUtil.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── maintainer/
│ │ └── client/
│ │ ├── NacosMaintainerFactoryTest.java
│ │ ├── address/
│ │ │ └── DefaultServerListManagerTest.java
│ │ ├── ai/
│ │ │ ├── AiMaintainerFactoryTest.java
│ │ │ └── NacosAiMaintainerServiceImplTest.java
│ │ ├── config/
│ │ │ ├── ConfigMaintainerFactoryTest.java
│ │ │ └── NacosConfigMaintainerServiceImplTest.java
│ │ ├── core/
│ │ │ └── AbstractCoreMaintainerServiceTest.java
│ │ ├── model/
│ │ │ └── HttpRequestTest.java
│ │ ├── naming/
│ │ │ ├── NacosNamingMaintainerServiceImplTest.java
│ │ │ └── NamingMaintainerFactoryTest.java
│ │ ├── remote/
│ │ │ ├── ClientHttpProxyTest.java
│ │ │ ├── HttpClientManagerTest.java
│ │ │ └── mock/
│ │ │ └── MockServerListProvider.java
│ │ └── utils/
│ │ └── ParamUtilTest.java
│ └── resources/
│ └── META-INF/
│ └── services/
│ └── com.alibaba.nacos.client.address.ServerListProvider
├── mcp-registry-adaptor/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── mcpregistry/
│ │ │ ├── NacosMcpRegistry.java
│ │ │ ├── NacosMcpRegistryStartUp.java
│ │ │ ├── config/
│ │ │ │ ├── HttpPathConfiguration.java
│ │ │ │ └── McpRegistryPackageExcludeFilter.java
│ │ │ ├── controller/
│ │ │ │ └── McpRegistryController.java
│ │ │ ├── form/
│ │ │ │ ├── GetServerForm.java
│ │ │ │ ├── ListServerForm.java
│ │ │ │ ├── ListServersNacosForm.java
│ │ │ │ └── ListServersOfficialForm.java
│ │ │ └── service/
│ │ │ └── NacosMcpRegistryService.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── services/
│ │ │ ├── com.alibaba.nacos.core.listener.startup.NacosStartUp
│ │ │ └── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ │ ├── nacos-mcp-registry-banner.txt
│ │ └── nacos-mcp-registry.properties
│ └── test/
│ └── java/
│ └── com/
│ └── alibaba/
│ └── nacos/
│ └── mcpregistry/
│ ├── NacosMcpRegistryStartUpTest.java
│ ├── controller/
│ │ └── McpRegistryControllerTest.java
│ └── service/
│ └── NacosMcpRegistryServiceTest.java
├── mvnw
├── mvnw.cmd
├── naming/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── naming/
│ │ │ ├── NamingApp.java
│ │ │ ├── ability/
│ │ │ │ └── NamingAbilityInitializer.java
│ │ │ ├── cluster/
│ │ │ │ ├── NamingReadinessCheckService.java
│ │ │ │ ├── ServerStatus.java
│ │ │ │ ├── ServerStatusManager.java
│ │ │ │ ├── remote/
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── DistroDataRequest.java
│ │ │ │ │ │ └── RequestRegistry.java
│ │ │ │ │ └── response/
│ │ │ │ │ ├── DistroDataResponse.java
│ │ │ │ │ └── ResponseRegistry.java
│ │ │ │ └── transport/
│ │ │ │ ├── JacksonSerializer.java
│ │ │ │ └── Serializer.java
│ │ │ ├── config/
│ │ │ │ └── NamingEnabledFilter.java
│ │ │ ├── consistency/
│ │ │ │ ├── Datum.java
│ │ │ │ ├── KeyBuilder.java
│ │ │ │ ├── ephemeral/
│ │ │ │ │ └── distro/
│ │ │ │ │ └── v2/
│ │ │ │ │ ├── DistroClientComponentRegistry.java
│ │ │ │ │ ├── DistroClientDataProcessor.java
│ │ │ │ │ ├── DistroClientTaskFailedHandler.java
│ │ │ │ │ ├── DistroClientTransportAgent.java
│ │ │ │ │ └── DistroClientVerifyInfo.java
│ │ │ │ └── persistent/
│ │ │ │ └── impl/
│ │ │ │ ├── AbstractSnapshotOperation.java
│ │ │ │ ├── BatchReadResponse.java
│ │ │ │ ├── BatchWriteRequest.java
│ │ │ │ └── OldDataOperation.java
│ │ │ ├── constants/
│ │ │ │ ├── ClientConstants.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── FieldsConstants.java
│ │ │ │ ├── PushConstants.java
│ │ │ │ └── RequestConstant.java
│ │ │ ├── controllers/
│ │ │ │ ├── OperatorMetricsV1Controller.java
│ │ │ │ └── v3/
│ │ │ │ ├── ClientControllerV3.java
│ │ │ │ ├── ClusterControllerV3.java
│ │ │ │ ├── HealthControllerV3.java
│ │ │ │ ├── InstanceControllerV3.java
│ │ │ │ ├── InstanceOpenApiController.java
│ │ │ │ ├── OperatorControllerV3.java
│ │ │ │ └── ServiceControllerV3.java
│ │ │ ├── core/
│ │ │ │ ├── CatalogService.java
│ │ │ │ ├── CatalogServiceV2Impl.java
│ │ │ │ ├── ClientService.java
│ │ │ │ ├── ClientServiceImpl.java
│ │ │ │ ├── ClusterOperator.java
│ │ │ │ ├── ClusterOperatorV2Impl.java
│ │ │ │ ├── DistroMapper.java
│ │ │ │ ├── HealthOperator.java
│ │ │ │ ├── HealthOperatorV2Impl.java
│ │ │ │ ├── InstanceOperator.java
│ │ │ │ ├── InstanceOperatorClientImpl.java
│ │ │ │ ├── InstancePatchObject.java
│ │ │ │ ├── Operator.java
│ │ │ │ ├── OperatorV2Impl.java
│ │ │ │ ├── ServiceOperator.java
│ │ │ │ ├── ServiceOperatorV2Impl.java
│ │ │ │ ├── SubscribeManager.java
│ │ │ │ └── v2/
│ │ │ │ ├── ServiceManager.java
│ │ │ │ ├── cleaner/
│ │ │ │ │ ├── AbstractNamingCleaner.java
│ │ │ │ │ ├── EmptyServiceAutoCleanerV2.java
│ │ │ │ │ ├── ExpiredMetadataCleaner.java
│ │ │ │ │ └── NamingCleaner.java
│ │ │ │ ├── client/
│ │ │ │ │ ├── AbstractClient.java
│ │ │ │ │ ├── Client.java
│ │ │ │ │ ├── ClientAttributes.java
│ │ │ │ │ ├── ClientSyncData.java
│ │ │ │ │ ├── ClientSyncDatumSnapshot.java
│ │ │ │ │ ├── factory/
│ │ │ │ │ │ ├── ClientFactory.java
│ │ │ │ │ │ ├── ClientFactoryHolder.java
│ │ │ │ │ │ └── impl/
│ │ │ │ │ │ ├── ConnectionBasedClientFactory.java
│ │ │ │ │ │ ├── EphemeralIpPortClientFactory.java
│ │ │ │ │ │ └── PersistentIpPortClientFactory.java
│ │ │ │ │ ├── impl/
│ │ │ │ │ │ ├── ConnectionBasedClient.java
│ │ │ │ │ │ └── IpPortBasedClient.java
│ │ │ │ │ └── manager/
│ │ │ │ │ ├── ClientManager.java
│ │ │ │ │ ├── ClientManagerDelegate.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── ConnectionBasedClientManager.java
│ │ │ │ │ ├── EphemeralIpPortClientManager.java
│ │ │ │ │ └── PersistentIpPortClientManager.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── client/
│ │ │ │ │ │ ├── ClientEvent.java
│ │ │ │ │ │ └── ClientOperationEvent.java
│ │ │ │ │ ├── metadata/
│ │ │ │ │ │ ├── InfoChangeEvent.java
│ │ │ │ │ │ └── MetadataEvent.java
│ │ │ │ │ ├── publisher/
│ │ │ │ │ │ ├── NamingEventPublisher.java
│ │ │ │ │ │ └── NamingEventPublisherFactory.java
│ │ │ │ │ └── service/
│ │ │ │ │ └── ServiceEvent.java
│ │ │ │ ├── index/
│ │ │ │ │ ├── ClientServiceIndexesManager.java
│ │ │ │ │ ├── NamingFuzzyWatchContextService.java
│ │ │ │ │ └── ServiceStorage.java
│ │ │ │ ├── metadata/
│ │ │ │ │ ├── AbstractMetadataSnapshotOperation.java
│ │ │ │ │ ├── ClusterMetadata.java
│ │ │ │ │ ├── ExpiredMetadataInfo.java
│ │ │ │ │ ├── InstanceMetadata.java
│ │ │ │ │ ├── InstanceMetadataProcessor.java
│ │ │ │ │ ├── InstanceMetadataSnapshotOperation.java
│ │ │ │ │ ├── MetadataOperation.java
│ │ │ │ │ ├── NamingMetadataManager.java
│ │ │ │ │ ├── NamingMetadataOperateService.java
│ │ │ │ │ ├── ServiceMetadata.java
│ │ │ │ │ ├── ServiceMetadataProcessor.java
│ │ │ │ │ └── ServiceMetadataSnapshotOperation.java
│ │ │ │ ├── pojo/
│ │ │ │ │ ├── BatchInstanceData.java
│ │ │ │ │ ├── BatchInstancePublishInfo.java
│ │ │ │ │ ├── HealthCheckInstancePublishInfo.java
│ │ │ │ │ ├── InstancePublishInfo.java
│ │ │ │ │ └── Service.java
│ │ │ │ └── service/
│ │ │ │ ├── ClientOperationService.java
│ │ │ │ ├── ClientOperationServiceProxy.java
│ │ │ │ └── impl/
│ │ │ │ ├── EphemeralClientOperationServiceImpl.java
│ │ │ │ └── PersistentClientOperationServiceImpl.java
│ │ │ ├── exception/
│ │ │ │ └── ResponseExceptionHandler.java
│ │ │ ├── healthcheck/
│ │ │ │ ├── HealthCheckReactor.java
│ │ │ │ ├── HealthCheckStatus.java
│ │ │ │ ├── NacosHealthCheckTask.java
│ │ │ │ ├── RsInfo.java
│ │ │ │ ├── extend/
│ │ │ │ │ ├── AbstractHealthCheckProcessorExtend.java
│ │ │ │ │ ├── HealthCheckExtendProvider.java
│ │ │ │ │ └── HealthCheckProcessorExtendV2.java
│ │ │ │ ├── heartbeat/
│ │ │ │ │ ├── AbstractBeatCheckInterceptor.java
│ │ │ │ │ ├── BeatCheckTask.java
│ │ │ │ │ ├── BeatProcessor.java
│ │ │ │ │ ├── ClientBeatCheckTaskV2.java
│ │ │ │ │ ├── ClientBeatProcessorV2.java
│ │ │ │ │ ├── ClientBeatUpdateTask.java
│ │ │ │ │ ├── ExpiredInstanceChecker.java
│ │ │ │ │ ├── InstanceBeatCheckResponsibleInterceptor.java
│ │ │ │ │ ├── InstanceBeatCheckTask.java
│ │ │ │ │ ├── InstanceBeatCheckTaskInterceptorChain.java
│ │ │ │ │ ├── InstanceBeatChecker.java
│ │ │ │ │ ├── InstanceEnableBeatCheckInterceptor.java
│ │ │ │ │ ├── ServiceEnableBeatCheckInterceptor.java
│ │ │ │ │ └── UnhealthyInstanceChecker.java
│ │ │ │ ├── interceptor/
│ │ │ │ │ ├── AbstractHealthCheckInterceptor.java
│ │ │ │ │ ├── HealthCheckEnableInterceptor.java
│ │ │ │ │ ├── HealthCheckInterceptorChain.java
│ │ │ │ │ ├── HealthCheckResponsibleInterceptor.java
│ │ │ │ │ └── HealthCheckTaskInterceptWrapper.java
│ │ │ │ └── v2/
│ │ │ │ ├── HealthCheckTaskV2.java
│ │ │ │ ├── HealthStatusSynchronizer.java
│ │ │ │ ├── PersistentHealthStatusSynchronizer.java
│ │ │ │ └── processor/
│ │ │ │ ├── HealthCheckCommonV2.java
│ │ │ │ ├── HealthCheckProcessorV2.java
│ │ │ │ ├── HealthCheckProcessorV2Delegate.java
│ │ │ │ ├── HttpHealthCheckProcessor.java
│ │ │ │ ├── MysqlHealthCheckProcessor.java
│ │ │ │ ├── NoneHealthCheckProcessor.java
│ │ │ │ └── TcpHealthCheckProcessor.java
│ │ │ ├── interceptor/
│ │ │ │ ├── AbstractNamingInterceptorChain.java
│ │ │ │ ├── Interceptable.java
│ │ │ │ ├── NacosNamingInterceptor.java
│ │ │ │ └── NacosNamingInterceptorChain.java
│ │ │ ├── misc/
│ │ │ │ ├── ClientConfig.java
│ │ │ │ ├── GlobalConfig.java
│ │ │ │ ├── GlobalExecutor.java
│ │ │ │ ├── GracefulShutdownListener.java
│ │ │ │ ├── HttpClient.java
│ │ │ │ ├── HttpClientManager.java
│ │ │ │ ├── Loggers.java
│ │ │ │ ├── NamingExecuteTaskDispatcher.java
│ │ │ │ ├── NamingTraceEventInitializer.java
│ │ │ │ ├── SwitchDomain.java
│ │ │ │ ├── SwitchDomainSnapshotOperation.java
│ │ │ │ ├── SwitchEntry.java
│ │ │ │ ├── SwitchManager.java
│ │ │ │ └── UtilsAndCommons.java
│ │ │ ├── model/
│ │ │ │ ├── form/
│ │ │ │ │ ├── ClientServiceForm.java
│ │ │ │ │ ├── InstanceForm.java
│ │ │ │ │ ├── InstanceListForm.java
│ │ │ │ │ ├── InstanceMetadataBatchOperationForm.java
│ │ │ │ │ ├── ServiceForm.java
│ │ │ │ │ ├── ServiceListForm.java
│ │ │ │ │ ├── UpdateClusterForm.java
│ │ │ │ │ ├── UpdateHealthForm.java
│ │ │ │ │ └── UpdateSwitchForm.java
│ │ │ │ └── vo/
│ │ │ │ ├── InstanceDetailInfoVo.java
│ │ │ │ └── MetricsInfoVo.java
│ │ │ ├── monitor/
│ │ │ │ ├── MetricsMonitor.java
│ │ │ │ ├── NamingDynamicMeterRefreshService.java
│ │ │ │ ├── NamingTpsMonitor.java
│ │ │ │ ├── PerformanceLoggerThread.java
│ │ │ │ ├── ServiceTopNCounter.java
│ │ │ │ ├── TpsMonitorItem.java
│ │ │ │ └── collector/
│ │ │ │ ├── NamingSubAndPubMetricsCollector.java
│ │ │ │ ├── PushPendingTaskCountMetricsCollector.java
│ │ │ │ └── ServiceEventQueueSizeMetricsCollector.java
│ │ │ ├── paramcheck/
│ │ │ │ ├── NamingDefaultHttpParamExtractor.java
│ │ │ │ ├── NamingInstanceBeatHttpParamExtractor.java
│ │ │ │ ├── NamingInstanceListHttpParamExtractor.java
│ │ │ │ └── NamingInstanceMetadataBatchHttpParamExtractor.java
│ │ │ ├── pojo/
│ │ │ │ ├── ClusterInfo.java
│ │ │ │ ├── InstanceOperationInfo.java
│ │ │ │ ├── IpAddressInfo.java
│ │ │ │ ├── Record.java
│ │ │ │ ├── ServiceDetailInfo.java
│ │ │ │ ├── ServiceNameView.java
│ │ │ │ ├── Subscriber.java
│ │ │ │ ├── Subscribers.java
│ │ │ │ └── instance/
│ │ │ │ ├── BeatInfoInstanceBuilder.java
│ │ │ │ ├── DefaultInstanceIdGenerator.java
│ │ │ │ ├── HttpRequestInstanceBuilder.java
│ │ │ │ ├── InstanceExtensionHandler.java
│ │ │ │ ├── InstanceIdGeneratorManager.java
│ │ │ │ └── SnowFlakeInstanceIdGenerator.java
│ │ │ ├── push/
│ │ │ │ ├── ClientInfo.java
│ │ │ │ ├── NamingFuzzyWatchChangeNotifier.java
│ │ │ │ ├── NamingFuzzyWatchSyncNotifier.java
│ │ │ │ ├── NamingSubscriberService.java
│ │ │ │ ├── NamingSubscriberServiceAggregationImpl.java
│ │ │ │ ├── NamingSubscriberServiceLocalImpl.java
│ │ │ │ └── v2/
│ │ │ │ ├── NamingSubscriberServiceV2Impl.java
│ │ │ │ ├── NoRequiredRetryException.java
│ │ │ │ ├── PushConfig.java
│ │ │ │ ├── PushDataWrapper.java
│ │ │ │ ├── executor/
│ │ │ │ │ ├── PushExecutor.java
│ │ │ │ │ ├── PushExecutorDelegate.java
│ │ │ │ │ ├── PushExecutorRpcImpl.java
│ │ │ │ │ ├── SpiImplPushExecutorHolder.java
│ │ │ │ │ └── SpiPushExecutor.java
│ │ │ │ ├── hook/
│ │ │ │ │ ├── NacosMonitorPushResultHook.java
│ │ │ │ │ ├── PushResult.java
│ │ │ │ │ ├── PushResultHook.java
│ │ │ │ │ └── PushResultHookHolder.java
│ │ │ │ └── task/
│ │ │ │ ├── FuzzyWatchChangeNotifyExecuteTask.java
│ │ │ │ ├── FuzzyWatchChangeNotifyTask.java
│ │ │ │ ├── FuzzyWatchPushDelayTaskEngine.java
│ │ │ │ ├── FuzzyWatchSyncNotifyCallback.java
│ │ │ │ ├── FuzzyWatchSyncNotifyExecuteTask.java
│ │ │ │ ├── FuzzyWatchSyncNotifyTask.java
│ │ │ │ ├── NamingPushCallback.java
│ │ │ │ ├── PushDelayTask.java
│ │ │ │ ├── PushDelayTaskExecuteEngine.java
│ │ │ │ └── PushExecuteTask.java
│ │ │ ├── remote/
│ │ │ │ └── rpc/
│ │ │ │ └── handler/
│ │ │ │ ├── BatchInstanceRequestHandler.java
│ │ │ │ ├── DistroDataRequestHandler.java
│ │ │ │ ├── InstanceRequestHandler.java
│ │ │ │ ├── NamingFuzzyWatchRequestHandler.java
│ │ │ │ ├── PersistentInstanceRequestHandler.java
│ │ │ │ ├── ServiceListRequestHandler.java
│ │ │ │ ├── ServiceQueryRequestHandler.java
│ │ │ │ └── SubscribeServiceRequestHandler.java
│ │ │ ├── selector/
│ │ │ │ ├── LabelSelector.java
│ │ │ │ ├── NoneSelector.java
│ │ │ │ ├── SelectorManager.java
│ │ │ │ ├── context/
│ │ │ │ │ ├── CmdbSelectorContextBuilder.java
│ │ │ │ │ └── NoneSelectorContextBuilder.java
│ │ │ │ └── interpreter/
│ │ │ │ └── ExpressionInterpreter.java
│ │ │ ├── utils/
│ │ │ │ ├── DistroUtils.java
│ │ │ │ ├── InstanceUtil.java
│ │ │ │ ├── NamingRequestUtil.java
│ │ │ │ └── ServiceUtil.java
│ │ │ └── web/
│ │ │ ├── CanDistro.java
│ │ │ ├── ClientAttributesFilter.java
│ │ │ ├── DistroFilter.java
│ │ │ ├── DistroIpPortTagGenerator.java
│ │ │ ├── DistroTagGenerator.java
│ │ │ ├── DistroTagGeneratorImpl.java
│ │ │ ├── NamingConfig.java
│ │ │ ├── ServiceNameFilter.java
│ │ │ └── TrafficReviseFilter.java
│ │ └── resources/
│ │ └── META-INF/
│ │ ├── logback/
│ │ │ └── naming-included.xml
│ │ └── services/
│ │ ├── com.alibaba.nacos.api.naming.spi.generator.InstanceIdGenerator
│ │ ├── com.alibaba.nacos.api.remote.Payload
│ │ ├── com.alibaba.nacos.api.selector.Selector
│ │ ├── com.alibaba.nacos.api.selector.context.SelectorContextBuilder
│ │ ├── com.alibaba.nacos.core.ability.ServerAbilityInitializer
│ │ ├── com.alibaba.nacos.core.listener.NacosApplicationListener
│ │ ├── com.alibaba.nacos.core.paramcheck.AbstractHttpParamExtractor
│ │ ├── com.alibaba.nacos.naming.core.v2.client.factory.ClientFactory
│ │ ├── com.alibaba.nacos.naming.healthcheck.heartbeat.AbstractBeatCheckInterceptor
│ │ ├── com.alibaba.nacos.naming.healthcheck.interceptor.AbstractHealthCheckInterceptor
│ │ ├── com.alibaba.nacos.naming.push.v2.hook.PushResultHook
│ │ └── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── naming/
│ │ ├── BaseTest.java
│ │ ├── ability/
│ │ │ └── NamingAbilityInitializerTest.java
│ │ ├── cluster/
│ │ │ ├── ServerStatusManagerTest.java
│ │ │ ├── remote/
│ │ │ │ ├── request/
│ │ │ │ │ ├── AbstractClusterRequestTest.java
│ │ │ │ │ └── DistroDataRequestTest.java
│ │ │ │ └── response/
│ │ │ │ └── DistroDataResponseTest.java
│ │ │ └── transport/
│ │ │ └── JacksonSerializerTest.java
│ │ ├── consistency/
│ │ │ └── ephemeral/
│ │ │ └── distro/
│ │ │ └── v2/
│ │ │ ├── DistroClientComponentRegistryTest.java
│ │ │ ├── DistroClientDataProcessorTest.java
│ │ │ └── DistroClientTransportAgentTest.java
│ │ ├── controllers/
│ │ │ └── v3/
│ │ │ ├── ClientControllerV3Test.java
│ │ │ ├── ClusterControllerV3Test.java
│ │ │ ├── HealthControllerV3Test.java
│ │ │ ├── InstanceControllerV3Test.java
│ │ │ ├── InstanceOpenApiControllerTest.java
│ │ │ ├── OperatorControllerV3Test.java
│ │ │ └── ServiceControllerV3Test.java
│ │ ├── core/
│ │ │ ├── CatalogServiceV2ImplTest.java
│ │ │ ├── ClusterOperatorV2ImplTest.java
│ │ │ ├── DistroMapperTest.java
│ │ │ ├── HealthOperatorV2ImplTest.java
│ │ │ ├── InstanceOperatorClientImplTest.java
│ │ │ ├── ServiceOperatorV2ImplTest.java
│ │ │ ├── SubscribeManagerTest.java
│ │ │ └── v2/
│ │ │ ├── cleaner/
│ │ │ │ ├── EmptyServiceAutoCleanerV2Test.java
│ │ │ │ └── ExpiredMetadataCleanerTest.java
│ │ │ ├── client/
│ │ │ │ ├── AbstractClientTest.java
│ │ │ │ ├── MockAbstractClient.java
│ │ │ │ ├── impl/
│ │ │ │ │ ├── ConnectionBasedClientTest.java
│ │ │ │ │ └── IpPortBasedClientTest.java
│ │ │ │ └── manager/
│ │ │ │ ├── ClientManagerDelegateTest.java
│ │ │ │ └── impl/
│ │ │ │ ├── ConnectionBasedClientManagerTest.java
│ │ │ │ ├── EphemeralIpPortClientManagerTest.java
│ │ │ │ └── PersistentIpPortClientManagerTest.java
│ │ │ ├── event/
│ │ │ │ └── publisher/
│ │ │ │ ├── NamingEventPublisherFactoryTest.java
│ │ │ │ ├── NamingEventPublisherTest.java
│ │ │ │ └── TestEvent.java
│ │ │ ├── index/
│ │ │ │ ├── ClientServiceIndexesManagerTest.java
│ │ │ │ ├── NamingFuzzyWatchContextServiceTest.java
│ │ │ │ └── ServiceStorageTest.java
│ │ │ ├── metadata/
│ │ │ │ ├── MetadataOperationTest.java
│ │ │ │ ├── NamingMetadataManagerTest.java
│ │ │ │ ├── NamingMetadataOperateServiceTest.java
│ │ │ │ ├── ServiceMetadataProcessorTest.java
│ │ │ │ ├── ServiceMetadataSnapshotOperationTest.java
│ │ │ │ └── ServiceMetadataTest.java
│ │ │ └── service/
│ │ │ ├── ClientOperationServiceProxyTest.java
│ │ │ └── impl/
│ │ │ ├── EphemeralClientOperationServiceImplTest.java
│ │ │ └── PersistentClientOperationServiceImplTest.java
│ │ ├── healthcheck/
│ │ │ ├── extend/
│ │ │ │ ├── HealthCheckExtendProviderTest.java
│ │ │ │ ├── HealthCheckProcessorExtendV2Test.java
│ │ │ │ ├── TestChecker.java
│ │ │ │ └── TestHealthCheckProcessor.java
│ │ │ ├── heartbeat/
│ │ │ │ └── ClientBeatCheckTaskV2Test.java
│ │ │ ├── interceptor/
│ │ │ │ └── HealthCheckTaskInterceptWrapperTest.java
│ │ │ └── v2/
│ │ │ ├── HealthCheckTaskV2Test.java
│ │ │ ├── PersistentHealthStatusSynchronizerTest.java
│ │ │ └── processor/
│ │ │ ├── HealthCheckCommonV2Test.java
│ │ │ ├── HealthCheckProcessorV2DelegateTest.java
│ │ │ └── HttpHealthCheckProcessorTest.java
│ │ ├── misc/
│ │ │ ├── ClientConfigTest.java
│ │ │ └── UtilsAndCommonsTest.java
│ │ ├── monitor/
│ │ │ └── MetricsMonitorTest.java
│ │ ├── paramcheck/
│ │ │ └── RpcParamCheckTest.java
│ │ ├── pojo/
│ │ │ ├── SubscriberTest.java
│ │ │ └── instance/
│ │ │ ├── BeatInfoInstanceBuilderTest.java
│ │ │ ├── DefaultInstanceInstanceIdGeneratorTest.java
│ │ │ ├── HttpRequestInstanceBuilderTest.java
│ │ │ ├── InstanceIdGeneratorManagerTest.java
│ │ │ ├── MockInstanceExtensionHandler.java
│ │ │ └── SnowFlakeInstanceIdGeneratorTest.java
│ │ ├── push/
│ │ │ ├── ClientInfoTest.java
│ │ │ ├── NamingFuzzyWatchChangeNotifierTest.java
│ │ │ ├── NamingFuzzyWatchSyncNotifierTest.java
│ │ │ ├── NamingSubscriberServiceAggregationImplTest.java
│ │ │ └── v2/
│ │ │ ├── NamingSubscriberServiceV2ImplTest.java
│ │ │ ├── PushConfigTest.java
│ │ │ ├── executor/
│ │ │ │ ├── PushExecutorDelegateTest.java
│ │ │ │ ├── PushExecutorRpcImplTest.java
│ │ │ │ └── SpiImplPushExecutorHolderTest.java
│ │ │ ├── hook/
│ │ │ │ └── NacosMonitorPushResultHookTest.java
│ │ │ └── task/
│ │ │ ├── FixturePushExecutor.java
│ │ │ ├── FuzzyWatchSyncNotifyExecuteTaskTest.java
│ │ │ ├── PushDelayTaskExecuteEngineTest.java
│ │ │ ├── PushDelayTaskTest.java
│ │ │ └── PushExecuteTaskTest.java
│ │ ├── remote/
│ │ │ └── rpc/
│ │ │ └── handler/
│ │ │ ├── BatchInstanceRequestHandlerTest.java
│ │ │ ├── DistroDataRequestHandlerTest.java
│ │ │ ├── InstanceRequestHandlerTest.java
│ │ │ ├── PersistentInstanceRequestHandlerTest.java
│ │ │ ├── ServiceListRequestHandlerTest.java
│ │ │ ├── ServiceQueryRequestHandlerTest.java
│ │ │ └── SubscribeServiceRequestHandlerTest.java
│ │ ├── selector/
│ │ │ ├── LabelSelectorTest.java
│ │ │ ├── MockCmdbContextBuilder.java
│ │ │ ├── MockSelector.java
│ │ │ ├── NoneSelectorTest.java
│ │ │ ├── SelectorManagerTest.java
│ │ │ └── context/
│ │ │ └── NoneSelectorContextBuilderTest.java
│ │ ├── utils/
│ │ │ ├── DistroUtilsTest.java
│ │ │ ├── InstanceUtilTest.java
│ │ │ ├── NamingRequestUtilTest.java
│ │ │ └── ServiceUtilTest.java
│ │ └── web/
│ │ └── ClientAttributesFilterTest.java
│ └── resources/
│ └── META-INF/
│ └── services/
│ ├── com.alibaba.nacos.api.naming.spi.generator.InstanceIdGenerator
│ ├── com.alibaba.nacos.api.selector.Selector
│ ├── com.alibaba.nacos.api.selector.context.SelectorContextBuilder
│ └── com.alibaba.nacos.naming.pojo.instance.InstanceExtensionHandler
├── persistence/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── persistence/
│ │ │ ├── configuration/
│ │ │ │ ├── DatasourceConfiguration.java
│ │ │ │ └── condition/
│ │ │ │ ├── ConditionDistributedEmbedStorage.java
│ │ │ │ ├── ConditionOnEmbeddedStorage.java
│ │ │ │ ├── ConditionOnExternalStorage.java
│ │ │ │ └── ConditionStandaloneEmbedStorage.java
│ │ │ ├── constants/
│ │ │ │ └── PersistenceConstant.java
│ │ │ ├── datasource/
│ │ │ │ ├── DataSourcePoolProperties.java
│ │ │ │ ├── DataSourceService.java
│ │ │ │ ├── DynamicDataSource.java
│ │ │ │ ├── ExternalDataSourceProperties.java
│ │ │ │ ├── ExternalDataSourceServiceImpl.java
│ │ │ │ └── LocalDataSourceServiceImpl.java
│ │ │ ├── exception/
│ │ │ │ └── NJdbcException.java
│ │ │ ├── model/
│ │ │ │ └── event/
│ │ │ │ ├── DerbyImportEvent.java
│ │ │ │ ├── DerbyLoadEvent.java
│ │ │ │ └── RaftDbErrorEvent.java
│ │ │ ├── monitor/
│ │ │ │ └── DatasourceMetrics.java
│ │ │ ├── repository/
│ │ │ │ ├── PaginationHelper.java
│ │ │ │ ├── RowMapperManager.java
│ │ │ │ ├── embedded/
│ │ │ │ │ ├── EmbeddedPaginationHelperImpl.java
│ │ │ │ │ ├── EmbeddedStorageContextHolder.java
│ │ │ │ │ ├── hook/
│ │ │ │ │ │ ├── EmbeddedApplyHook.java
│ │ │ │ │ │ └── EmbeddedApplyHookHolder.java
│ │ │ │ │ ├── operate/
│ │ │ │ │ │ ├── BaseDatabaseOperate.java
│ │ │ │ │ │ ├── DatabaseOperate.java
│ │ │ │ │ │ └── StandaloneDatabaseOperateImpl.java
│ │ │ │ │ └── sql/
│ │ │ │ │ ├── ModifyRequest.java
│ │ │ │ │ ├── QueryType.java
│ │ │ │ │ ├── SelectRequest.java
│ │ │ │ │ └── limiter/
│ │ │ │ │ ├── SqlLimiter.java
│ │ │ │ │ └── SqlTypeLimiter.java
│ │ │ │ └── extrnal/
│ │ │ │ └── ExternalStoragePaginationHelperImpl.java
│ │ │ └── utils/
│ │ │ ├── ConnectionCheckUtil.java
│ │ │ ├── DatasourcePlatformUtil.java
│ │ │ ├── DerbyUtils.java
│ │ │ └── PersistenceExecutor.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring.factories
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── persistence/
│ │ ├── configuration/
│ │ │ ├── DatasourceConfigurationTest.java
│ │ │ └── condition/
│ │ │ ├── ConditionDistributedEmbedStorageTest.java
│ │ │ ├── ConditionOnEmbeddedStorageTest.java
│ │ │ ├── ConditionOnExternalStorageTest.java
│ │ │ └── ConditionStandaloneEmbedStorageTest.java
│ │ ├── constants/
│ │ │ └── PersistenceConstantTest.java
│ │ ├── datasource/
│ │ │ ├── ClusterExternalStorageTest.java
│ │ │ ├── DataSourcePoolPropertiesTest.java
│ │ │ ├── DynamicDataSourceTest.java
│ │ │ ├── ExternalDataSourcePropertiesTest.java
│ │ │ ├── ExternalDataSourceServiceImplTest.java
│ │ │ ├── LocalDataSourceServiceImplTest.java
│ │ │ ├── StandaloneExternalStorageTest.java
│ │ │ └── mock/
│ │ │ ├── MockConnection.java
│ │ │ ├── MockDriver.java
│ │ │ ├── MockPreparedStatement.java
│ │ │ ├── MockResultSet.java
│ │ │ └── MockStatement.java
│ │ ├── exception/
│ │ │ └── NJdbcExceptionTest.java
│ │ ├── model/
│ │ │ └── event/
│ │ │ └── EventTest.java
│ │ ├── monitor/
│ │ │ └── DatasourceMetricsTest.java
│ │ ├── repository/
│ │ │ ├── RowMapperManagerTest.java
│ │ │ ├── embedded/
│ │ │ │ ├── EmbeddedPaginationHelperImplTest.java
│ │ │ │ ├── EmbeddedStorageContextHolderTest.java
│ │ │ │ ├── hook/
│ │ │ │ │ └── EmbeddedApplyHookHolderTest.java
│ │ │ │ ├── operate/
│ │ │ │ │ ├── BaseDatabaseOperateTest.java
│ │ │ │ │ ├── DatabaseOperateTest.java
│ │ │ │ │ ├── MockConfigInfo.java
│ │ │ │ │ └── StandaloneDatabaseOperateImplTest.java
│ │ │ │ └── sql/
│ │ │ │ ├── ModifyRequestTest.java
│ │ │ │ ├── QueryTypeTest.java
│ │ │ │ ├── SelectRequestTest.java
│ │ │ │ └── limiter/
│ │ │ │ └── SqlTypeLimiterTest.java
│ │ │ └── extrnal/
│ │ │ └── ExternalStoragePaginationHelperImplTest.java
│ │ └── utils/
│ │ ├── ConnectionCheckUtilTest.java
│ │ ├── DerbyUtilsTest.java
│ │ └── PersistenceExecutorTest.java
│ └── resources/
│ ├── META-INF/
│ │ ├── derby-schema.sql
│ │ └── test-derby-import.sql
│ ├── application.properties
│ └── logback-test.xml
├── plugin/
│ ├── auth/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── auth/
│ │ │ │ ├── api/
│ │ │ │ │ ├── AuthResult.java
│ │ │ │ │ ├── IdentityContext.java
│ │ │ │ │ ├── LoginIdentityContext.java
│ │ │ │ │ ├── Permission.java
│ │ │ │ │ ├── RequestResource.java
│ │ │ │ │ └── Resource.java
│ │ │ │ ├── constant/
│ │ │ │ │ ├── ActionTypes.java
│ │ │ │ │ ├── ApiType.java
│ │ │ │ │ ├── Constants.java
│ │ │ │ │ └── SignType.java
│ │ │ │ ├── exception/
│ │ │ │ │ └── AccessException.java
│ │ │ │ └── spi/
│ │ │ │ ├── client/
│ │ │ │ │ ├── AbstractClientAuthService.java
│ │ │ │ │ ├── ClientAuthPluginManager.java
│ │ │ │ │ └── ClientAuthService.java
│ │ │ │ └── server/
│ │ │ │ ├── AuthPluginManager.java
│ │ │ │ ├── AuthPluginProvider.java
│ │ │ │ └── AuthPluginService.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ │ └── test/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── auth/
│ │ │ ├── api/
│ │ │ │ ├── IdentityContextTest.java
│ │ │ │ ├── LoginIdentityContextTest.java
│ │ │ │ ├── PermissionTest.java
│ │ │ │ └── RequestResourceTest.java
│ │ │ ├── constant/
│ │ │ │ ├── ActionTypesTest.java
│ │ │ │ └── ConstantsTest.java
│ │ │ ├── exception/
│ │ │ │ └── AccessExceptionTest.java
│ │ │ └── spi/
│ │ │ ├── client/
│ │ │ │ └── ClientAuthPluginManagerTest.java
│ │ │ ├── mock/
│ │ │ │ ├── MockAuthPluginService.java
│ │ │ │ ├── MockClientAuthService.java
│ │ │ │ └── MockEmptyNameAuthPluginService.java
│ │ │ └── server/
│ │ │ ├── AuthPluginManagerTest.java
│ │ │ └── AuthPluginProviderTest.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.plugin.auth.spi.client.AbstractClientAuthService
│ │ └── com.alibaba.nacos.plugin.auth.spi.server.AuthPluginService
│ ├── config/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── config/
│ │ │ │ ├── ConfigChangePluginManager.java
│ │ │ │ ├── ConfigChangePluginProvider.java
│ │ │ │ ├── constants/
│ │ │ │ │ ├── ConfigChangeConstants.java
│ │ │ │ │ ├── ConfigChangeExecuteTypes.java
│ │ │ │ │ └── ConfigChangePointCutTypes.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── ConfigChangeRequest.java
│ │ │ │ │ └── ConfigChangeResponse.java
│ │ │ │ └── spi/
│ │ │ │ └── ConfigChangePluginService.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── plugin/
│ │ └── config/
│ │ ├── ConfigChangePluginManagerTests.java
│ │ └── ConfigChangePluginProviderTest.java
│ ├── control/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── control/
│ │ │ │ ├── ControlManagerCenter.java
│ │ │ │ ├── Loggers.java
│ │ │ │ ├── configs/
│ │ │ │ │ ├── ControlConfigs.java
│ │ │ │ │ └── ControlConfigsInitializer.java
│ │ │ │ ├── connection/
│ │ │ │ │ ├── ConnectionControlManager.java
│ │ │ │ │ ├── ConnectionMetricsCollector.java
│ │ │ │ │ ├── DefaultConnectionControlManager.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ └── ConnectionCheckRequest.java
│ │ │ │ │ ├── response/
│ │ │ │ │ │ ├── ConnectionCheckCode.java
│ │ │ │ │ │ └── ConnectionCheckResponse.java
│ │ │ │ │ └── rule/
│ │ │ │ │ └── ConnectionControlRule.java
│ │ │ │ ├── event/
│ │ │ │ │ ├── ConnectionLimitRuleChangeEvent.java
│ │ │ │ │ └── TpsControlRuleChangeEvent.java
│ │ │ │ ├── rule/
│ │ │ │ │ ├── ControlRuleChangeActivator.java
│ │ │ │ │ ├── parser/
│ │ │ │ │ │ ├── ConnectionControlRuleParser.java
│ │ │ │ │ │ ├── NacosConnectionControlRuleParser.java
│ │ │ │ │ │ ├── NacosTpsControlRuleParser.java
│ │ │ │ │ │ ├── RuleParser.java
│ │ │ │ │ │ └── TpsControlRuleParser.java
│ │ │ │ │ └── storage/
│ │ │ │ │ ├── ExternalRuleStorage.java
│ │ │ │ │ ├── LocalDiskRuleStorage.java
│ │ │ │ │ ├── RuleStorage.java
│ │ │ │ │ └── RuleStorageProxy.java
│ │ │ │ ├── spi/
│ │ │ │ │ ├── ControlManagerBuilder.java
│ │ │ │ │ ├── ControlPluginProvider.java
│ │ │ │ │ └── ExternalRuleStorageBuilder.java
│ │ │ │ ├── tps/
│ │ │ │ │ ├── DefaultTpsControlManager.java
│ │ │ │ │ ├── MonitorType.java
│ │ │ │ │ ├── TpsControlManager.java
│ │ │ │ │ ├── TpsMetrics.java
│ │ │ │ │ ├── barrier/
│ │ │ │ │ │ ├── DefaultNacosTpsBarrier.java
│ │ │ │ │ │ ├── LocalSimpleCountRateCounter.java
│ │ │ │ │ │ ├── LocalSimpleCountRuleBarrier.java
│ │ │ │ │ │ ├── RateCounter.java
│ │ │ │ │ │ ├── RuleBarrier.java
│ │ │ │ │ │ ├── SimpleCountRuleBarrier.java
│ │ │ │ │ │ ├── TpsBarrier.java
│ │ │ │ │ │ └── creator/
│ │ │ │ │ │ ├── DefaultNacosTpsBarrierCreator.java
│ │ │ │ │ │ ├── LocalSimpleCountBarrierCreator.java
│ │ │ │ │ │ ├── RuleBarrierCreator.java
│ │ │ │ │ │ └── TpsBarrierCreator.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── BarrierCheckRequest.java
│ │ │ │ │ │ └── TpsCheckRequest.java
│ │ │ │ │ ├── response/
│ │ │ │ │ │ ├── TpsCheckResponse.java
│ │ │ │ │ │ └── TpsResultCode.java
│ │ │ │ │ └── rule/
│ │ │ │ │ ├── RuleDetail.java
│ │ │ │ │ ├── RuleModel.java
│ │ │ │ │ └── TpsControlRule.java
│ │ │ │ └── utils/
│ │ │ │ ├── DiskUtils.java
│ │ │ │ └── EnvUtils.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ │ └── test/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── control/
│ │ │ ├── ControlManagerBuilderTest.java
│ │ │ ├── ControlManagerCenterTest.java
│ │ │ ├── connection/
│ │ │ │ ├── DefaultConnectionControlManagerTest.java
│ │ │ │ ├── TestAConnectionMetricsCollector.java
│ │ │ │ └── TestBConnectionMetricsCollector.java
│ │ │ ├── spi/
│ │ │ │ ├── ExternalRuleStorageBuilderTest.java
│ │ │ │ └── ExternalRuleStorageTest.java
│ │ │ ├── tps/
│ │ │ │ └── DefaultNacosTpsBarrierTest.java
│ │ │ └── utils/
│ │ │ ├── DiskUtilsTest.java
│ │ │ └── EnvUtilsTest.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.plugin.control.connection.ConnectionMetricsCollector
│ │ ├── com.alibaba.nacos.plugin.control.spi.ControlManagerBuilder
│ │ ├── com.alibaba.nacos.plugin.control.spi.ExternalRuleStorageBuilder
│ │ └── com.alibaba.nacos.plugin.control.tps.barrier.creator.RuleBarrierCreator
│ ├── datasource/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── datasource/
│ │ │ │ ├── MapperManager.java
│ │ │ │ ├── constants/
│ │ │ │ │ ├── CommonConstant.java
│ │ │ │ │ ├── ContextConstant.java
│ │ │ │ │ ├── DataSourceConstant.java
│ │ │ │ │ ├── DatabaseTypeConstant.java
│ │ │ │ │ ├── FieldConstant.java
│ │ │ │ │ ├── PrimaryKeyConstant.java
│ │ │ │ │ └── TableConstant.java
│ │ │ │ ├── dialect/
│ │ │ │ │ └── DatabaseDialect.java
│ │ │ │ ├── manager/
│ │ │ │ │ ├── DatabaseDialectManager.java
│ │ │ │ │ └── DatasourceDialectPluginProvider.java
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── AbstractMapper.java
│ │ │ │ │ ├── ConfigInfoAggrMapper.java
│ │ │ │ │ ├── ConfigInfoBetaMapper.java
│ │ │ │ │ ├── ConfigInfoGrayMapper.java
│ │ │ │ │ ├── ConfigInfoMapper.java
│ │ │ │ │ ├── ConfigInfoTagMapper.java
│ │ │ │ │ ├── ConfigMigrateMapper.java
│ │ │ │ │ ├── ConfigTagsRelationMapper.java
│ │ │ │ │ ├── GroupCapacityMapper.java
│ │ │ │ │ ├── HistoryConfigInfoMapper.java
│ │ │ │ │ ├── Mapper.java
│ │ │ │ │ ├── TenantCapacityMapper.java
│ │ │ │ │ ├── TenantInfoMapper.java
│ │ │ │ │ └── ext/
│ │ │ │ │ └── WhereBuilder.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── MapperContext.java
│ │ │ │ │ └── MapperResult.java
│ │ │ │ └── proxy/
│ │ │ │ └── MapperProxy.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── plugin/
│ │ └── datasource/
│ │ ├── manager/
│ │ │ └── DatasourceDialectPluginProviderTest.java
│ │ ├── mapper/
│ │ │ └── AbstractMapperTest.java
│ │ └── proxy/
│ │ └── MapperProxyTest.java
│ ├── encryption/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── encryption/
│ │ │ │ ├── EncryptionPluginManager.java
│ │ │ │ ├── EncryptionPluginProvider.java
│ │ │ │ ├── handler/
│ │ │ │ │ └── EncryptionHandler.java
│ │ │ │ └── spi/
│ │ │ │ └── EncryptionPluginService.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── plugin/
│ │ └── encryption/
│ │ ├── EncryptionPluginManagerTest.java
│ │ ├── EncryptionPluginProviderTest.java
│ │ └── handler/
│ │ ├── EncryptionAesHandlerTest.java
│ │ └── EncryptionHandlerTest.java
│ ├── environment/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── environment/
│ │ │ │ ├── CustomEnvironmentPluginManager.java
│ │ │ │ └── spi/
│ │ │ │ ├── CustomEnvironmentPluginService.java
│ │ │ │ └── EnvironmentPluginProvider.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── plugin/
│ │ └── environment/
│ │ └── CustomEnvironmentPluginManagerTest.java
│ ├── pom.xml
│ └── trace/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── trace/
│ │ │ ├── NacosTracePluginManager.java
│ │ │ ├── TracePluginProvider.java
│ │ │ └── spi/
│ │ │ └── NacosTraceSubscriber.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.api.plugin.PluginProvider
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── plugin/
│ │ └── trace/
│ │ ├── NacosTracePluginManagerTest.java
│ │ ├── TracePluginProviderTest.java
│ │ └── mock/
│ │ └── MockNacosTraceSubscriber.java
│ └── resources/
│ └── META-INF/
│ └── services/
│ └── com.alibaba.nacos.plugin.trace.spi.NacosTraceSubscriber
├── plugin-default-impl/
│ ├── nacos-default-auth-plugin/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── auth/
│ │ │ │ └── impl/
│ │ │ │ ├── JwtAuthenticationEntryPoint.java
│ │ │ │ ├── LdapAuthPluginService.java
│ │ │ │ ├── NacosAuthPluginService.java
│ │ │ │ ├── SafeBcryptPasswordEncoder.java
│ │ │ │ ├── authenticate/
│ │ │ │ │ ├── AbstractAuthenticationManager.java
│ │ │ │ │ ├── DefaultAuthenticationManager.java
│ │ │ │ │ ├── IAuthenticationManager.java
│ │ │ │ │ └── LdapAuthenticationManager.java
│ │ │ │ ├── condition/
│ │ │ │ │ ├── ConditionOnInnerDatasource.java
│ │ │ │ │ ├── ConditionOnLdapAuth.java
│ │ │ │ │ ├── ConditionOnNacosAuth.java
│ │ │ │ │ └── ConditionOnRemoteDatasource.java
│ │ │ │ ├── config/
│ │ │ │ │ └── AuthImplPackageExcludeFilter.java
│ │ │ │ ├── configuration/
│ │ │ │ │ ├── AuthConfigs.java
│ │ │ │ │ ├── autoconfiguration/
│ │ │ │ │ │ ├── NacosAuthPluginInnerAutoConfig.java
│ │ │ │ │ │ └── NacosAuthPluginRemoteAutoConfig.java
│ │ │ │ │ ├── core/
│ │ │ │ │ │ ├── NacosAuthPluginCoreConfig.java
│ │ │ │ │ │ ├── NacosAuthPluginInnerServiceConfig.java
│ │ │ │ │ │ └── NacosAuthPluginRemoteServiceConfig.java
│ │ │ │ │ ├── persistence/
│ │ │ │ │ │ ├── NacosAuthPluginEmbeddedStorageConfig.java
│ │ │ │ │ │ ├── NacosAuthPluginExternalStorageConfig.java
│ │ │ │ │ │ └── NacosAuthPluginPersistenceConfig.java
│ │ │ │ │ └── web/
│ │ │ │ │ ├── NacosAuthPluginControllerConfig.java
│ │ │ │ │ ├── NacosAuthPluginOldControllerConfig.java
│ │ │ │ │ └── NacosAuthPluginWebConfig.java
│ │ │ │ ├── constant/
│ │ │ │ │ ├── AuthConstants.java
│ │ │ │ │ ├── AuthPageConstant.java
│ │ │ │ │ └── AuthSystemTypes.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── UserController.java
│ │ │ │ │ └── v3/
│ │ │ │ │ ├── PermissionControllerV3.java
│ │ │ │ │ ├── RoleControllerV3.java
│ │ │ │ │ └── UserControllerV3.java
│ │ │ │ ├── jwt/
│ │ │ │ │ ├── NacosJwtParser.java
│ │ │ │ │ ├── NacosJwtPayload.java
│ │ │ │ │ └── NacosSignatureAlgorithm.java
│ │ │ │ ├── ldap/
│ │ │ │ │ ├── LdapAuthPluginConfig.java
│ │ │ │ │ ├── LdapAuthenticationProvider.java
│ │ │ │ │ └── NacosLdapContextSource.java
│ │ │ │ ├── model/
│ │ │ │ │ └── OffsetFetchResult.java
│ │ │ │ ├── persistence/
│ │ │ │ │ ├── AuthPaginationHelper.java
│ │ │ │ │ ├── AuthRowMapperManager.java
│ │ │ │ │ ├── EmbeddedPermissionPersistServiceImpl.java
│ │ │ │ │ ├── EmbeddedRolePersistServiceImpl.java
│ │ │ │ │ ├── EmbeddedUserPersistServiceImpl.java
│ │ │ │ │ ├── ExternalPermissionPersistServiceImpl.java
│ │ │ │ │ ├── ExternalRolePersistServiceImpl.java
│ │ │ │ │ ├── ExternalUserPersistServiceImpl.java
│ │ │ │ │ ├── PermissionInfo.java
│ │ │ │ │ ├── PermissionPersistService.java
│ │ │ │ │ ├── RoleInfo.java
│ │ │ │ │ ├── RolePersistService.java
│ │ │ │ │ ├── User.java
│ │ │ │ │ ├── UserPersistService.java
│ │ │ │ │ ├── embedded/
│ │ │ │ │ │ └── AuthEmbeddedPaginationHelperImpl.java
│ │ │ │ │ ├── extrnal/
│ │ │ │ │ │ └── AuthExternalPaginationHelperImpl.java
│ │ │ │ │ └── handler/
│ │ │ │ │ ├── PageHandlerAdapter.java
│ │ │ │ │ ├── PageHandlerAdapterFactory.java
│ │ │ │ │ └── support/
│ │ │ │ │ ├── DefaultPageHandlerAdapter.java
│ │ │ │ │ ├── DerbyPageHandlerAdapter.java
│ │ │ │ │ └── MysqlPageHandlerAdapter.java
│ │ │ │ ├── roles/
│ │ │ │ │ ├── AbstractCachedRoleService.java
│ │ │ │ │ ├── AbstractCheckedRoleService.java
│ │ │ │ │ ├── NacosRoleService.java
│ │ │ │ │ ├── NacosRoleServiceDirectImpl.java
│ │ │ │ │ └── NacosRoleServiceRemoteImpl.java
│ │ │ │ ├── token/
│ │ │ │ │ ├── TokenManager.java
│ │ │ │ │ ├── TokenManagerDelegate.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── CachedJwtTokenManager.java
│ │ │ │ │ └── JwtTokenManager.java
│ │ │ │ ├── users/
│ │ │ │ │ ├── AbstractCachedUserService.java
│ │ │ │ │ ├── NacosUser.java
│ │ │ │ │ ├── NacosUserDetails.java
│ │ │ │ │ ├── NacosUserService.java
│ │ │ │ │ ├── NacosUserServiceDirectImpl.java
│ │ │ │ │ ├── NacosUserServiceRemoteImpl.java
│ │ │ │ │ └── User.java
│ │ │ │ └── utils/
│ │ │ │ ├── Base64Decode.java
│ │ │ │ ├── PasswordEncoderUtil.java
│ │ │ │ ├── PasswordGeneratorUtil.java
│ │ │ │ └── RemoteServerUtil.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ ├── services/
│ │ │ │ ├── com.alibaba.nacos.plugin.auth.spi.server.AuthPluginService
│ │ │ │ └── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── plugin/
│ │ └── auth/
│ │ └── impl/
│ │ ├── SafeBcryptPasswordEncoderTest.java
│ │ ├── authenticate/
│ │ │ ├── AbstractAuthenticationManagerTest.java
│ │ │ └── LdapAuthenticationManagerTest.java
│ │ ├── configuration/
│ │ │ ├── AuthConfigsTest.java
│ │ │ └── ConditionOnLdapAuthTest.java
│ │ ├── controller/
│ │ │ ├── UserControllerTest.java
│ │ │ └── v3/
│ │ │ ├── PermissionControllerV3Test.java
│ │ │ ├── RoleControllerV3Test.java
│ │ │ └── UserControllerV3Test.java
│ │ ├── jwt/
│ │ │ └── NacosJwtParserTest.java
│ │ ├── ldap/
│ │ │ └── LdapAuthenticationProviderTest.java
│ │ ├── persistence/
│ │ │ ├── EmbeddedPermissionPersistServiceImplTest.java
│ │ │ ├── EmbeddedRolePersistServiceImplTest.java
│ │ │ ├── EmbeddedUserPersistServiceImplTest.java
│ │ │ ├── ExternalPermissionPersistServiceImplTest.java
│ │ │ ├── ExternalRolePersistServiceImplTest.java
│ │ │ └── ExternalUserPersistServiceImplTest.java
│ │ ├── roles/
│ │ │ └── NacosRoleServiceDirectImplTest.java
│ │ ├── token/
│ │ │ ├── TokenManagerDelegateTest.java
│ │ │ └── impl/
│ │ │ ├── CachedJwtTokenManagerTest.java
│ │ │ └── JwtTokenManagerTest.java
│ │ ├── users/
│ │ │ └── NacosUserServiceDirectImplTest.java
│ │ └── utils/
│ │ ├── Base64DecodeTest.java
│ │ ├── PasswordEncoderUtilTest.java
│ │ └── PasswordGeneratorUtilTest.java
│ ├── nacos-default-control-plugin/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── control/
│ │ │ │ └── impl/
│ │ │ │ ├── NacosConnectionControlManager.java
│ │ │ │ ├── NacosControlManagerBuilder.java
│ │ │ │ └── NacosTpsControlManager.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── com.alibaba.nacos.plugin.control.spi.ControlManagerBuilder
│ │ └── test/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── control/
│ │ │ └── impl/
│ │ │ ├── NacosConnectionControlManagerTest.java
│ │ │ ├── NacosControlManagerBuilderTest.java
│ │ │ ├── NacosTpsControlManagerTest.java
│ │ │ └── TestConnectionMetricsCollector.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.plugin.control.connection.ConnectionMetricsCollector
│ ├── nacos-default-datasource-plugin/
│ │ ├── nacos-datasource-plugin-base/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── alibaba/
│ │ │ │ └── nacos/
│ │ │ │ └── plugin/
│ │ │ │ └── datasource/
│ │ │ │ └── impl/
│ │ │ │ ├── base/
│ │ │ │ │ ├── BaseConfigInfoAggrMapper.java
│ │ │ │ │ ├── BaseConfigInfoBetaMapper.java
│ │ │ │ │ ├── BaseConfigInfoMapper.java
│ │ │ │ │ ├── BaseConfigInfoTagMapper.java
│ │ │ │ │ ├── BaseConfigTagsRelationMapper.java
│ │ │ │ │ ├── BaseGroupCapacityMapper.java
│ │ │ │ │ ├── BaseTenantCapacityMapper.java
│ │ │ │ │ └── BaseTenantInfoMapper.java
│ │ │ │ ├── dialect/
│ │ │ │ │ └── AbstractDatabaseDialect.java
│ │ │ │ └── enums/
│ │ │ │ └── TrustedPostgresqFunctionEnum.java
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── datasource/
│ │ │ ├── MapperManagerTest.java
│ │ │ └── mapper/
│ │ │ └── TestMapper.java
│ │ ├── nacos-datasource-plugin-derby/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── alibaba/
│ │ │ │ │ └── nacos/
│ │ │ │ │ └── plugin/
│ │ │ │ │ └── datasource/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── derby/
│ │ │ │ │ │ ├── AbstractMapperByDerby.java
│ │ │ │ │ │ ├── ConfigInfoBetaMapperByDerby.java
│ │ │ │ │ │ ├── ConfigInfoGrayMapperByDerby.java
│ │ │ │ │ │ ├── ConfigInfoMapperByDerby.java
│ │ │ │ │ │ ├── ConfigInfoTagMapperByDerby.java
│ │ │ │ │ │ ├── ConfigInfoTagsRelationMapperByDerby.java
│ │ │ │ │ │ ├── ConfigMigrateMapperByDerby.java
│ │ │ │ │ │ ├── GroupCapacityMapperByDerby.java
│ │ │ │ │ │ ├── HistoryConfigInfoMapperByDerby.java
│ │ │ │ │ │ ├── TenantCapacityMapperByDerby.java
│ │ │ │ │ │ └── TenantInfoMapperByDerby.java
│ │ │ │ │ ├── dialect/
│ │ │ │ │ │ └── DerbyDatabaseDialect.java
│ │ │ │ │ └── enums/
│ │ │ │ │ └── derby/
│ │ │ │ │ ├── TrustedDerbyFunctionEnum.java
│ │ │ │ │ └── TrustedDerbylFunctionEnum.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── derby-schema.sql
│ │ │ │ └── services/
│ │ │ │ ├── com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect
│ │ │ │ └── com.alibaba.nacos.plugin.datasource.mapper.Mapper
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── datasource/
│ │ │ └── impl/
│ │ │ ├── derby/
│ │ │ │ ├── ConfigInfoBetaMapperByDerbyTest.java
│ │ │ │ ├── ConfigInfoMapperByDerbyTest.java
│ │ │ │ ├── ConfigInfoTagMapperByDerbyTest.java
│ │ │ │ ├── ConfigInfoTagsRelationMapperByDerbyTest.java
│ │ │ │ ├── GroupCapacityMapperByDerbyTest.java
│ │ │ │ ├── HistoryConfigInfoMapperByDerbyTest.java
│ │ │ │ ├── TenantCapacityMapperByDerbyTest.java
│ │ │ │ └── TenantInfoMapperByDerbyTest.java
│ │ │ └── enums/
│ │ │ └── derby/
│ │ │ └── TrustedDerbyFunctionEnumTest.java
│ │ ├── nacos-datasource-plugin-mysql/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── alibaba/
│ │ │ │ │ └── nacos/
│ │ │ │ │ └── plugin/
│ │ │ │ │ └── datasource/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── dialect/
│ │ │ │ │ │ ├── DefaultDatabaseDialect.java
│ │ │ │ │ │ └── MysqlDatabaseDialect.java
│ │ │ │ │ ├── enums/
│ │ │ │ │ │ └── mysql/
│ │ │ │ │ │ └── TrustedMysqlFunctionEnum.java
│ │ │ │ │ └── mysql/
│ │ │ │ │ ├── AbstractMapperByMysql.java
│ │ │ │ │ ├── ConfigInfoAggrMapperByMySql.java
│ │ │ │ │ ├── ConfigInfoBetaMapperByMySql.java
│ │ │ │ │ ├── ConfigInfoGrayMapperByMySql.java
│ │ │ │ │ ├── ConfigInfoMapperByMySql.java
│ │ │ │ │ ├── ConfigInfoTagMapperByMySql.java
│ │ │ │ │ ├── ConfigMigrateMapperByMysql.java
│ │ │ │ │ ├── ConfigTagsRelationMapperByMySql.java
│ │ │ │ │ ├── GroupCapacityMapperByMysql.java
│ │ │ │ │ ├── HistoryConfigInfoMapperByMySql.java
│ │ │ │ │ ├── TenantCapacityMapperByMySql.java
│ │ │ │ │ └── TenantInfoMapperByMySql.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── mysql-schema.sql
│ │ │ │ └── services/
│ │ │ │ ├── com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect
│ │ │ │ └── com.alibaba.nacos.plugin.datasource.mapper.Mapper
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── datasource/
│ │ │ └── impl/
│ │ │ ├── enums/
│ │ │ │ └── mysql/
│ │ │ │ └── TrustedMysqlFunctionEnumTest.java
│ │ │ └── mysql/
│ │ │ ├── ConfigInfoBetaMapperByMySqlTest.java
│ │ │ ├── ConfigInfoMapperByMySqlTest.java
│ │ │ ├── ConfigInfoTagMapperByMySqlTest.java
│ │ │ ├── ConfigTagsRelationMapperByMySqlTest.java
│ │ │ ├── GroupCapacityMapperByMysqlTest.java
│ │ │ ├── HistoryConfigInfoMapperByMySqlTest.java
│ │ │ ├── TenantCapacityMapperByMySqlTest.java
│ │ │ └── TenantInfoMapperByMySqlTest.java
│ │ ├── nacos-datasource-plugin-oracle/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── alibaba/
│ │ │ │ │ └── nacos/
│ │ │ │ │ └── plugin/
│ │ │ │ │ └── datasource/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── dialect/
│ │ │ │ │ │ └── OracleDatabaseDialect.java
│ │ │ │ │ ├── enums/
│ │ │ │ │ │ └── oracle/
│ │ │ │ │ │ └── TrustedOracleFunctionEnum.java
│ │ │ │ │ └── oracle/
│ │ │ │ │ ├── AbstractMapperByOracle.java
│ │ │ │ │ ├── ConfigInfoAggrMapperByOracle.java
│ │ │ │ │ ├── ConfigInfoBetaMapperByOracle.java
│ │ │ │ │ ├── ConfigInfoGrayMapperByOracle.java
│ │ │ │ │ ├── ConfigInfoMapperByOracle.java
│ │ │ │ │ ├── ConfigInfoTagMapperByOracle.java
│ │ │ │ │ ├── ConfigMigrateMapperByOracle.java
│ │ │ │ │ ├── ConfigTagsRelationMapperByOracle.java
│ │ │ │ │ ├── GroupCapacityMapperByOracle.java
│ │ │ │ │ ├── HistoryConfigInfoMapperByOracle.java
│ │ │ │ │ ├── TenantCapacityMapperByOracle.java
│ │ │ │ │ └── TenantInfoMapperByOracle.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── oracle-schema.sql
│ │ │ │ └── services/
│ │ │ │ ├── com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect
│ │ │ │ └── com.alibaba.nacos.plugin.datasource.mapper.Mapper
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── datasource/
│ │ │ └── impl/
│ │ │ ├── enums/
│ │ │ │ └── oracle/
│ │ │ │ └── TrustedOracleFunctionEnumTest.java
│ │ │ └── oracle/
│ │ │ ├── ConfigInfoAggrMapperByOracleTest.java
│ │ │ ├── ConfigInfoBetaMapperByOracleTest.java
│ │ │ ├── ConfigInfoGrayMapperByOracleTest.java
│ │ │ ├── ConfigInfoMapperByOracleTest.java
│ │ │ ├── ConfigInfoTagMapperByOracleTest.java
│ │ │ ├── ConfigMigrateMapperByOracleTest.java
│ │ │ ├── ConfigTagsRelationMapperByOracleTest.java
│ │ │ ├── GroupCapacityMapperByOracleTest.java
│ │ │ ├── HistoryConfigInfoMapperByOracleTest.java
│ │ │ ├── TenantCapacityMapperByOracleTest.java
│ │ │ └── TenantInfoMapperByOracleTest.java
│ │ ├── nacos-datasource-plugin-postgresql/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── alibaba/
│ │ │ │ │ └── nacos/
│ │ │ │ │ └── plugin/
│ │ │ │ │ └── datasource/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── dialect/
│ │ │ │ │ │ └── PostgresqlDatabaseDialect.java
│ │ │ │ │ ├── enums/
│ │ │ │ │ │ └── postgresql/
│ │ │ │ │ │ └── TrustedPostgresqlFunctionEnum.java
│ │ │ │ │ └── postgresql/
│ │ │ │ │ ├── ConfigInfoAggrMapperByPostgresql.java
│ │ │ │ │ ├── ConfigInfoBetaMapperByPostgresql.java
│ │ │ │ │ ├── ConfigInfoGrayMapperByPostgresql.java
│ │ │ │ │ ├── ConfigInfoMapperByPostgresql.java
│ │ │ │ │ ├── ConfigInfoTagMapperByPostgresql.java
│ │ │ │ │ ├── ConfigMigrateMapperByPostgresql.java
│ │ │ │ │ ├── ConfigTagsRelationMapperByPostgresql.java
│ │ │ │ │ ├── GroupCapacityMapperByPostgresql.java
│ │ │ │ │ ├── HistoryConfigInfoMapperByPostgresql.java
│ │ │ │ │ ├── TenantCapacityMapperByPostgresql.java
│ │ │ │ │ └── TenantInfoMapperByPostgresql.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── pg-schema.sql
│ │ │ │ └── services/
│ │ │ │ ├── com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect
│ │ │ │ └── com.alibaba.nacos.plugin.datasource.mapper.Mapper
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── datasource/
│ │ │ └── impl/
│ │ │ ├── enums/
│ │ │ │ └── postgresql/
│ │ │ │ └── TrustedPostgresqlFunctionEnumTest.java
│ │ │ └── postgresql/
│ │ │ ├── ConfigInfoMapperByPostgresqlTest.java
│ │ │ └── ConfigTagsRelationMapperByPostgresqlTest.java
│ │ └── pom.xml
│ ├── nacos-default-plugin-all/
│ │ └── pom.xml
│ ├── nacos-oidc-auth-plugin/
│ │ ├── dependency-reduced-pom.xml
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── plugin/
│ │ │ └── auth/
│ │ │ └── impl/
│ │ │ └── oidc/
│ │ │ ├── AuthorityProvider.java
│ │ │ ├── IdentityProvider.java
│ │ │ ├── OidcAuthPluginService.java
│ │ │ ├── OidcAuthorityProvider.java
│ │ │ ├── OidcIdentityProvider.java
│ │ │ ├── authenticate/
│ │ │ │ ├── AuthorizationCodeHandler.java
│ │ │ │ ├── OidcAuthenticationManager.java
│ │ │ │ └── OidcSessionManager.java
│ │ │ ├── authorization/
│ │ │ │ ├── AuthorizationClient.java
│ │ │ │ ├── AuthorizationRequest.java
│ │ │ │ └── AuthorizationResponse.java
│ │ │ ├── config/
│ │ │ │ ├── OidcAuthConfig.java
│ │ │ │ ├── OidcPluginAutoConfiguration.java
│ │ │ │ └── OidcWebSecurityConfig.java
│ │ │ ├── constant/
│ │ │ │ └── OidcConstants.java
│ │ │ ├── controller/
│ │ │ │ └── OidcLoginController.java
│ │ │ ├── identity/
│ │ │ │ └── OidcUserMapper.java
│ │ │ └── token/
│ │ │ ├── JwksProvider.java
│ │ │ └── JwtTokenValidator.java
│ │ └── resources/
│ │ └── META-INF/
│ │ ├── services/
│ │ │ └── com.alibaba.nacos.plugin.auth.spi.server.AuthPluginService
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ └── pom.xml
├── pom.xml
├── prometheus/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── prometheus/
│ │ ├── PrometheusApp.java
│ │ ├── api/
│ │ │ └── ApiConstants.java
│ │ ├── conf/
│ │ │ └── PrometheusSecurityConfiguration.java
│ │ ├── controller/
│ │ │ └── PrometheusController.java
│ │ ├── exception/
│ │ │ └── PrometheusApiExceptionHandler.java
│ │ ├── filter/
│ │ │ └── PrometheusAuthFilter.java
│ │ └── utils/
│ │ └── PrometheusUtils.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── prometheus/
│ │ └── controller/
│ │ ├── PrometheusControllerTest.java
│ │ └── exception/
│ │ └── PrometheusApiExceptionHandlerTest.java
│ └── resources/
│ └── application.properties
├── resources/
│ └── copyright
├── server/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ ├── NacosServerBasicApplication.java
│ │ ├── NacosServerWebApplication.java
│ │ └── server/
│ │ ├── AbstractNacosWebBeanTypeFilter.java
│ │ ├── NacosNormalBeanTypeFilter.java
│ │ ├── NacosWebBeanPostProcessorConfiguration.java
│ │ └── NacosWebBeanTypeFilter.java
│ └── resources/
│ ├── nacos-server-web-banner.txt
│ └── nacos-server.properties
├── skills/
│ └── nacos-skill-registry/
│ └── SKILL.md
├── style/
│ ├── NacosCheckStyle.xml
│ ├── codeStyle.md
│ ├── nacos-code-style-for-idea.xml
│ └── spotbugs-exclude.xml
├── sys/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── alibaba/
│ │ │ └── nacos/
│ │ │ └── sys/
│ │ │ ├── env/
│ │ │ │ ├── AbstractNacosDuplicateBeanPostProcessor.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── DeploymentType.java
│ │ │ │ ├── EnvModuleStateBuilder.java
│ │ │ │ ├── EnvUtil.java
│ │ │ │ ├── NacosDuplicateConfigurationBeanPostProcessor.java
│ │ │ │ ├── NacosDuplicateSpringBeanPostProcessor.java
│ │ │ │ ├── OperatingSystemBeanManager.java
│ │ │ │ └── OriginTrackedPropertiesLoader.java
│ │ │ ├── file/
│ │ │ │ ├── FileChangeEvent.java
│ │ │ │ ├── FileWatcher.java
│ │ │ │ └── WatchFileCenter.java
│ │ │ ├── filter/
│ │ │ │ ├── NacosPackageExcludeFilter.java
│ │ │ │ └── NacosTypeExcludeFilter.java
│ │ │ ├── module/
│ │ │ │ ├── AbstractConsoleModuleStateBuilder.java
│ │ │ │ ├── AbstractServerModuleStateBuilder.java
│ │ │ │ ├── ModuleState.java
│ │ │ │ ├── ModuleStateBuilder.java
│ │ │ │ └── ModuleStateHolder.java
│ │ │ └── utils/
│ │ │ ├── ApplicationUtils.java
│ │ │ ├── DiskUtils.java
│ │ │ ├── InetUtils.java
│ │ │ ├── MethodUtil.java
│ │ │ ├── PropertiesUtil.java
│ │ │ └── TimerContext.java
│ │ └── resources/
│ │ └── META-INF/
│ │ ├── nacos-default.properties
│ │ ├── services/
│ │ │ └── com.alibaba.nacos.sys.module.ModuleStateBuilder
│ │ └── spring.factories
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── sys/
│ │ ├── env/
│ │ │ ├── EnvModuleStateBuilderTest.java
│ │ │ ├── EnvUtilTest.java
│ │ │ ├── EnvUtilWithConfigTest.java
│ │ │ ├── EnvUtilWithoutConfigTest.java
│ │ │ ├── NacosDuplicateConfigurationBeanPostProcessorTest.java
│ │ │ ├── NacosDuplicateSpringBeanPostProcessorTest.java
│ │ │ ├── OperatingSystemBeanManagerTest.java
│ │ │ ├── OriginTrackedPropertiesLoaderTest.java
│ │ │ └── mock/
│ │ │ └── MockAutoConfiguration.java
│ │ ├── file/
│ │ │ └── WatchFileCenterTest.java
│ │ ├── filter/
│ │ │ ├── NacosTypeExcludeFilterTest.java
│ │ │ └── mock/
│ │ │ └── MockNacosPackageExcludeFilter.java
│ │ ├── module/
│ │ │ ├── ModuleStateHolderTest.java
│ │ │ └── mock/
│ │ │ ├── ExceptionMockModuleStateBuilder.java
│ │ │ ├── MockModuleStateBuilder.java
│ │ │ └── MockRebuildModuleStateBuilder.java
│ │ └── utils/
│ │ ├── ApplicationUtilsTest.java
│ │ ├── DiskUtilsTest.java
│ │ ├── DiskUtilsZipTest.java
│ │ ├── InetUtilsTest.java
│ │ ├── MethodUtilTest.java
│ │ ├── PropertiesUtilTest.java
│ │ └── TimerContextTest.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ ├── com.alibaba.nacos.sys.filter.NacosPackageExcludeFilter
│ │ └── com.alibaba.nacos.sys.module.ModuleStateBuilder
│ ├── application-empty.properties
│ ├── application-prefix.properties
│ ├── application-test.properties
│ ├── application.properties
│ ├── conf/
│ │ └── cluster.conf
│ ├── existing-non-multi-document.properties
│ ├── line_iterator_test.txt
│ ├── logback-test.xml
│ ├── test-file-watcher-overflow/
│ │ └── test.properties
│ ├── test-properties-malformed-unicode.properties
│ └── test-properties.properties
└── test/
├── config-test/
│ ├── pom.xml
│ └── src/
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── test/
│ │ ├── base/
│ │ │ ├── BaseClusterTest.java
│ │ │ ├── ConfigCleanUtils.java
│ │ │ ├── HttpClient4Test.java
│ │ │ └── Params.java
│ │ └── config/
│ │ ├── AbstractConfigAPIConfigITCase.java
│ │ ├── ConfigAPIConfigITCase.java
│ │ ├── ConfigAPIV2ConfigITCase.java
│ │ ├── ConfigAPIWithRootContextPathConfigITCase.java
│ │ ├── ConfigBetaConfigITCase.java
│ │ ├── ConfigDerbyImportConfigITCase.java
│ │ ├── ConfigDerbyRaftConfigITCase.java
│ │ ├── ConfigExportAndImportAPIConfigITCase.java
│ │ ├── ConfigLongPollConfigITCase.java
│ │ ├── ConfigLongPollReturnChangesConfigITCase.java
│ │ ├── EmbeddedStorageContextUtilsConfigITCase.java
│ │ ├── NacosConfigServiceComTlsGrpcClientConfigITCase.java
│ │ ├── NacosConfigServiceNoComTlsGrpcClientConfigITCase.java
│ │ ├── NacosConfigV2MutualAuthConfigITCase.java
│ │ └── TextChangeParser.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.api.config.listener.ConfigChangeParser
│ ├── application.properties
│ ├── derby-schema.sql
│ ├── logback-test.xml
│ ├── test-ca-cert.pem
│ ├── test-ca-key.pem
│ ├── test-client-cert.pem
│ ├── test-client-key.pem
│ ├── test-server-cert.pem
│ └── test-server-key.pem
├── core-test/
│ ├── pom.xml
│ └── src/
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── test/
│ │ ├── ConfigCleanUtils.java
│ │ ├── ability/
│ │ │ ├── AbilityDiscovery.java
│ │ │ └── component/
│ │ │ └── TestServerAbilityControlManager.java
│ │ ├── base/
│ │ │ ├── HttpClient4Test.java
│ │ │ ├── Params.java
│ │ │ └── TextChangeParser.java
│ │ ├── client/
│ │ │ ├── ConfigIntegrationV1ServerNonCompatibilityCoreITCase.java
│ │ │ ├── ConfigIntegrationV2MutualAuthCoreITCase.java
│ │ │ └── ConfigIntegrationV3CoreITCase.java
│ │ ├── common/
│ │ │ ├── FileTypeEnumCoreITCase.java
│ │ │ ├── NacosAsyncRestTemplateCoreITCase.java
│ │ │ ├── NacosRestTemplateCoreITCase.java
│ │ │ ├── NacosRestTemplateInterceptorsCoreITCase.java
│ │ │ └── WatchFileCenterCoreITCase.java
│ │ ├── core/
│ │ │ ├── SnowFlowerIdGeneratorCoreITCase.java
│ │ │ ├── auth/
│ │ │ │ ├── AuthBase.java
│ │ │ │ ├── ConfigAuthCoreITCase.java
│ │ │ │ ├── LdapAuthCoreITCase.java
│ │ │ │ ├── NamingAuthCoreITCase.java
│ │ │ │ ├── PermissionCoreITCase.java
│ │ │ │ ├── RoleCoreITCase.java
│ │ │ │ └── UserCoreITCase.java
│ │ │ ├── cluster/
│ │ │ │ ├── MemberLookupCoreITCase.java
│ │ │ │ └── ServerMemberManagerCoreITCase.java
│ │ │ └── code/
│ │ │ └── ControllerMethodsCacheCoreITCase.java
│ │ └── smoke/
│ │ └── NacosSmokeCoreITCase.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ └── com.alibaba.nacos.api.config.listener.ConfigChangeParser
│ ├── application.properties
│ ├── logback-test.xml
│ ├── test-ca-cert.pem
│ ├── test-ca-key.pem
│ ├── test-client-cert.pem
│ ├── test-client-key.pem
│ ├── test-server-cert.pem
│ └── test-server-key.pem
├── naming-test/
│ ├── pom.xml
│ └── src/
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── alibaba/
│ │ └── nacos/
│ │ └── test/
│ │ ├── base/
│ │ │ ├── BaseClusterTest.java
│ │ │ ├── ConfigCleanUtils.java
│ │ │ ├── HttpClient4Test.java
│ │ │ └── Params.java
│ │ └── naming/
│ │ ├── AbstractInstanceOperateNamingITCase.java
│ │ ├── CPInstancesAPINamingITCase.java
│ │ ├── ClientBeatNamingITCase.java
│ │ ├── CompatibilityServiceTlsNamingITCase.java
│ │ ├── InstanceOperateNamingITCase.java
│ │ ├── MaintainServiceNamingITCase.java
│ │ ├── MultiTenantInstanceAPINamingITCase.java
│ │ ├── MultiTenantNamingITCase.java
│ │ ├── NamingBase.java
│ │ ├── RaftNamingITCase.java
│ │ ├── RandomUtils.java
│ │ ├── RestAPINamingITCase.java
│ │ ├── SelectInstancesNamingITCase.java
│ │ ├── SelectOneHealthyInstanceNamingITCase.java
│ │ ├── ServiceListTestNamingITCase.java
│ │ ├── SubscribeClusterNamingITCase.java
│ │ ├── SubscribeNamingITCase.java
│ │ ├── SubscribeSelectorNamingITCase.java
│ │ ├── TlsServiceAndMutualAuthNamingITCase.java
│ │ ├── TlsServiceTlsNamingITCase.java
│ │ └── UnsubscribeNamingITCase.java
│ └── resources/
│ ├── application.properties
│ ├── logback-test.xml
│ ├── test-ca-cert.pem
│ ├── test-ca-key.pem
│ ├── test-client-cert.pem
│ ├── test-client-key.pem
│ ├── test-server-cert.pem
│ └── test-server-key.pem
└── pom.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.js linguist-language=java
*.css linguist-language=java
*.html linguist-language=java
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Actually behavior**
A clear and concise description of what you actually to happen.
**How to Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See errors
**Desktop (please complete the following information):**
- OS: [e.g. Centos]
- Version [e.g. nacos-server 1.3.1, nacos-client 1.3.1]
- Module [e.g. naming/config]
- SDK [e.g. original, spring-cloud-alibaba-nacos, dubbo]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Questions
url: https://github.com/alibaba/nacos/discussions
about: For questions and discussions. Bug reports and feature requests should use the templates above.
- name: Security Vulnerabilities
url: https://security.alibaba.com
about: Report security vulnerabilities to ASRC (Alibaba Security Response Center).
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
## Issue Description
Type: *bug report* or *feature request*
### Describe what happened (or what feature you want)
### Describe what you expected to happen
### How to reproduce it (as minimally and precisely as possible)
1.
2.
3.
### Tell us your environment
### Anything else we need to know?
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
Please do not create a Pull Request without creating an issue first.
## What is the purpose of the change
XXXXX
## Brief changelog
XX
## Verifying this change
XXXX
Follow this checklist to help us incorporate your contribution quickly and easily:
* [ ] Make sure there is a Github issue filed for the change (usually before you start working on it). Trivial changes like typos do not require a Github issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue.
* [ ] Format the pull request title like `[ISSUE #123] Fix UnknownException when host config not exist`. Each commit in the pull request should have a meaningful subject line and body.
* [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
* [ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add integration-test in [test module](https://github.com/alibaba/nacos/tree/master/test).
* [ ] Run `mvn -B clean package apache-rat:check spotbugs:check -DskipTests` to make sure basic checks pass. Run `mvn clean install -DskipITs` to make sure unit-test pass. Run `mvn clean test-compile failsafe:integration-test` to make sure integration-test pass.
================================================
FILE: .github/workflows/anti-spam.yml
================================================
name: Anti-Spam Protection
on:
issues:
types: [opened, edited]
permissions:
issues: write
jobs:
spam-detection:
runs-on: ubuntu-latest
steps:
- name: Check for spam
uses: actions/github-script@v7
with:
script: |
const issue = context.payload.issue;
const title = issue.title.toLowerCase();
const body = (issue.body || '').toLowerCase();
const author = issue.user.login;
const authorAssociation = issue.author_association;
// Skip if author is a member, collaborator, or owner
if (['MEMBER', 'COLLABORATOR', 'OWNER'].includes(authorAssociation)) {
console.log(`Skipping spam check for ${authorAssociation}: ${author}`);
return;
}
// Get user details via API to calculate account age
let accountAgeDays = 365; // Default to old account if API fails
try {
const { data: userData } = await github.rest.users.getByUsername({
username: author
});
const authorCreatedAt = new Date(userData.created_at);
const now = new Date();
accountAgeDays = (now - authorCreatedAt) / (1000 * 60 * 60 * 24);
console.log(`Account ${author} created at ${userData.created_at}, age: ${accountAgeDays.toFixed(1)} days`);
} catch (error) {
console.log(`Failed to get user info for ${author}: ${error.message}`);
}
// Spam keywords - airlines and travel-related spam
const spamKeywords = [
// Airlines
'lufthansa', 'emirates', 'klm', 'turkish airlines', 'singapore airlines',
'aer lingus', 'sas airlines', 'qatar airways', 'british airways',
'american airlines', 'united airlines', 'delta airlines', 'air france',
'swiss air', 'austrian airlines', 'tap portugal', 'air canada',
'air europa', 'ita airways',
// Italian terms
'telefono', 'rimborso', 'volo', 'biglietto', 'prenotazione',
'annullare', 'cancellare', 'modifica', 'gestire', 'chiamare',
'numero di telefono', 'contattare', 'assistenza clienti',
// German terms
'kontakt', 'buchen', 'kundenservice', 'hotline', 'kundendienst',
'buchung', 'stornieren', 'umbuchung', 'erreichen', 'telefonnummer',
// French terms
'billet', 'réservation', 'annuler', 'rembours', 'vol',
'contacter', 'numéro', 'téléphone', 'modifier', 'payer',
// Common spam patterns
'customer service number', 'booking number', 'flight cancel',
'refund process', 'how to contact', 'toll free', 'helpline',
'1-800', '1-888', '1-877', '1-866'
];
// Check content for spam keywords
const contentToCheck = title + ' ' + body;
const matchedKeywords = spamKeywords.filter(kw => contentToCheck.includes(kw));
// Check for phone number patterns (3+ phone numbers is suspicious)
const phonePatterns = [
/\+\d{1,3}[\s-]?\d{2,4}[\s-]?\d{3,4}[\s-]?\d{3,4}/g, // International format
/\d{3}[\s.-]?\d{3}[\s.-]?\d{4}/g // US/common format
];
let phoneCount = 0;
for (const pattern of phonePatterns) {
const matches = contentToCheck.match(pattern) || [];
phoneCount += matches.length;
}
const hasExcessivePhones = phoneCount >= 2;
// Spam detection rules:
// 1. Match 2+ spam keywords
// 2. New account (< 7 days) + 1 spam keyword
// 3. 2+ phone numbers in content
const isSpam = matchedKeywords.length >= 2 ||
(accountAgeDays < 7 && matchedKeywords.length >= 1) ||
hasExcessivePhones;
if (isSpam) {
console.log(`Spam detected in issue #${issue.number}`);
console.log(`Author: ${author}, Account age: ${accountAgeDays.toFixed(1)} days`);
console.log(`Matched keywords: ${matchedKeywords.join(', ')}`);
console.log(`Phone numbers found: ${phoneCount}`);
// Add spam label
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: ['spam']
});
// Add comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `This issue has been automatically detected as spam and will be closed.\n\n` +
`If this is a legitimate issue, please create a new issue using the [issue template](https://github.com/${context.repo.owner}/${context.repo.repo}/issues/new/choose).\n\n` +
`---\n` +
`此 Issue 被自动检测为垃圾信息,将被关闭。如果这是一个合法的问题,请使用 [Issue 模板](https://github.com/${context.repo.owner}/${context.repo.repo}/issues/new/choose) 重新创建。`
});
// Close issue
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed',
state_reason: 'not_planned'
});
// Lock issue
await github.rest.issues.lock({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
lock_reason: 'spam'
});
console.log(`Issue #${issue.number} closed and locked as spam`);
} else {
console.log(`No spam detected in issue #${issue.number}`);
console.log(`Matched keywords: ${matchedKeywords.length}, Phone numbers: ${phoneCount}, Account age: ${accountAgeDays.toFixed(1)} days`);
}
================================================
FILE: .github/workflows/ci.yml
================================================
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: "Continuous Integration"
on:
push:
branches: [ develop, v2.x-develop ]
pull_request:
branches: [ develop, v2.x-develop ]
permissions: read-all
jobs:
ci:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: "Cache Maven Repos"
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: "Checkout"
uses: actions/checkout@v4
- name: "Set up JDK 17"
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'zulu'
- name: "Print maven version"
run: mvn -version
- name: "Check with Maven"
run: mvn -B clean compile apache-rat:check spotbugs:check -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- name: "Build and Test with Maven"
run: mvn -B '-Prelease-nacos,!dev' clean install -Drat.skip=true -Dspotbugs.skip=true -DtrimStackTrace=false -U -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- name: "Upload coverage to Codecov"
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
verbose: true
files: ./core/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-auth-plugin/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-control-plugin/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-datasource-plugin/nacos-datasource-plugin-base/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-datasource-plugin/nacos-datasource-plugin-mysql/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-datasource-plugin/nacos-datasource-plugin-derby/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-datasource-plugin/nacos-datasource-plugin-postgresql/target/site/jacoco/jacoco.xml,./plugin-default-impl/nacos-default-datasource-plugin/nacos-datasource-plugin-oracle/target/site/jacoco/jacoco.xml,./config/target/site/jacoco/jacoco.xml,./auth/target/site/jacoco/jacoco.xml,./plugin/encryption/target/site/jacoco/jacoco.xml,./plugin/datasource/target/site/jacoco/jacoco.xml,./plugin/trace/target/site/jacoco/jacoco.xml,./plugin/config/target/site/jacoco/jacoco.xml,./plugin/auth/target/site/jacoco/jacoco.xml,./plugin/environment/target/site/jacoco/jacoco.xml,./plugin/control/target/site/jacoco/jacoco.xml,./lock/target/site/jacoco/jacoco.xml,./logger-adapter-impl/log4j2-adapter/target/site/jacoco/jacoco.xml,./logger-adapter-impl/logback-adapter-12/target/site/jacoco/jacoco.xml,./consistency/target/site/jacoco/jacoco.xml,./common/target/site/jacoco/jacoco.xml,./sys/target/site/jacoco/jacoco.xml,./ai/target/site/jacoco/jacoco.xml,./naming/target/site/jacoco/jacoco.xml,./client-basic/target/site/jacoco/jacoco.xml,./address/target/site/jacoco/jacoco.xml,./persistence/target/site/jacoco/jacoco.xml,./api/target/site/jacoco/jacoco.xml,./maintainer-client/target/site/jacoco/jacoco.xml,./prometheus/target/site/jacoco/jacoco.xml,./client/target/site/jacoco/jacoco.xml,./console/target/site/jacoco/jacoco.xml
================================================
FILE: .github/workflows/it.yml
================================================
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: "Integration Test For 2.X"
on:
push:
branches: [ v2.x-develop ]
pull_request:
branches: [ v2.x-develop ]
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
java: [8, 8.0.192, 11, 11.0.3]
steps:
- name: "Cache Maven Repos"
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: "Checkout"
uses: actions/checkout@v3
- name: "Set up JDK ${{ matrix.java }}"
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java }}
distribution: 'zulu'
architecture: x64
- name: "Print maven version"
run: mvn -version
- name: "Test Config"
run: mvn clean package -Pcit-test -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- name: "Clean Env"
run: mvn clean -Premove-test-data -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- name: "Test Naming"
run: mvn clean package -Pnit-test -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- name: "Clean Env"
run: mvn clean -Premove-test-data -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
================================================
FILE: .github/workflows/pr-ci.yml
================================================
name: PR-CI
on:
pull_request:
branches: [ develop, v2.x-develop ]
jobs:
dist-tar:
name: Build distribution tar
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- uses: actions/checkout@v3
with:
submodules: true
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "17"
cache: "maven"
- name: Build distribution tar
run: |
mvn '-Prelease-nacos,!dev' -DskipTests clean install -U -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- uses: actions/upload-artifact@v4
name: Upload distribution tar
with:
name: nacos
path: distribution/target/nacos-server-*.tar.gz
- name: Save PR number
run: |
mkdir -p ./pr
echo ${{ github.event.pull_request.number }} > ./pr/pr.txt
- uses: actions/upload-artifact@v4
name: Upload PR number
with:
name: pr
path: pr/pr.txt
================================================
FILE: .github/workflows/pr-comment.yml
================================================
name: "Comment on PR"
on:
pull_request_target:
types: [opened, reopened]
jobs:
thanks-and-hint-to-document:
runs-on: ubuntu-latest
permissions:
pull-requests: write
name: Say thanks for the PR and hint to document
steps:
- name: comment on the pull request
uses: hasura/comment-progress@v2.3.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
number: ${{ github.event.number }}
id: thanks-and-hint-to-document
recreate: true
message: |
Thanks for your this PR. :pray:
Please check again for your PR changes whether contains any usage/api/configuration change such as `Add new API `, `Add new configuration`, `Change default value of configuration`.
If so, please add or update documents(markdown type) in `docs/next/` for repository [nacos-group/nacos-group.github.io](https://github.com/nacos-group/nacos-group.github.io/tree/develop-astro-nacos/src/content/docs/next)
---
感谢您提交的PR。 :pray:
请再次查看您的PR内容,确认是否包含任何使用方式/API/配置参数的变更,如:`新增API`、`新增配置参数`、`修改默认配置`等操作。
如果是,请确保在提交之前,在仓库[nacos-group/nacos-group.github.io](https://github.com/nacos-group/nacos-group.github.io/tree/develop-astro-nacos/src/content/docs/next)中的`docs/next/`目录下添加或更新文档(markdown格式)。
================================================
FILE: .github/workflows/pr-e2e-test.yml
================================================
name: E2E test for pull request
on:
workflow_run:
workflows: ["PR-CI"]
types:
- completed
env:
DOCKER_REPO: wuyfeedocker/nacos-ci
DOCKER_REPO_B: wuyfeehub/nacos-ci
TEST_REPO_NAME: nacos-group/nacos-e2e
HEADER_PARAMS: "-H \"Accept: application/vnd.github+json\" -H \"Authorization: Bearer ${{ secrets.ACTION_TOKEN }}\" -H \"X-GitHub-Api-Version: 2022-11-28\""
HEADER_PARAMS_WRITE_COMMENT: "-H \"Accept: application/vnd.github+json\" -H \"Authorization: Bearer ${{ secrets.ACTION_TOKEN }}\" -H \"X-GitHub-Api-Version: 2022-11-28\""
BASE_URL_NACOS: https://api.github.com/repos/${GITHUB_REPOSITORY}
BASE_URL_ROBOT: https://api.github.com/repos/wuyfee/nacos
jobs:
docker:
runs-on: ubuntu-latest
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
timeout-minutes: 30
strategy:
matrix:
base-image: ["ubuntu"]
java-version: ["17"]
outputs:
version-json: ${{ steps.show_versions.outputs.version-json }}
steps:
- name: 'Download artifact'
uses: actions/github-script@v6
with:
script: |
let artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }},
});
let matchArtifactNacos = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "nacos"
})[0];
let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifactNacos.id,
archive_format: 'zip',
});
var fs = require('fs');
fs.writeFileSync('${{github.workspace}}/nacos.zip', Buffer.from(download.data));
- run: |
unzip nacos.zip
mkdir nacos
cp -r nacos-* nacos/
- uses: actions/checkout@v3
with:
repository: nacos-group/nacos-e2e.git
ref: main
path: nacos-e2e
- name: Generate image tag
id: build-images
run: |
mv nacos-server-*.tar.gz nacos-e2e/cicd/build
cd nacos-e2e/cicd/build
version=${{ github.event.pull_request.number || github.ref_name }}-$(uuidgen)
mkdir versionlist
touch versionlist/"${version}-`echo ${{ matrix.java-version }} | sed -e "s/:/-/g"`"
ls versionlist/
echo TAG=${version}-$(echo ${{ matrix.java-version }} | sed -e "s/:/-/g") >> $GITHUB_ENV
- name: docker-login-1
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: save docker_1 images
run: |
mkdir build_backup
cp -rf nacos-e2e/cicd/build/* ./build_backup/
cd nacos-e2e/cicd/build
docker build --no-cache -f Dockerfile -t ${DOCKER_REPO}:${{ env.TAG }} .
docker push ${DOCKER_REPO}:${{ env.TAG }}
- name: docker-login-2
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKERHUB_USER_B }}
password: ${{ secrets.DOCKERHUB_TOKEN_B }}
- name: save docker_2 images
run: |
rm -rf nacos-e2e/cicd/build/*
mv ./build_backup/* nacos-e2e/cicd/build/
cd nacos-e2e/cicd/build
docker build --no-cache -f Dockerfile -t ${DOCKER_REPO_B}:${{ env.TAG }} .
docker push ${DOCKER_REPO_B}:${{ env.TAG }}
- name: Show versions
id: show_versions
run: |
a=(`ls nacos-e2e/cicd/build/versionlist`)
printf '%s\n' "${a[@]}" | jq -R . | jq -s .
echo version-json=`printf '%s\n' "${a[@]}" | jq -R . | jq -s .` >> $GITHUB_OUTPUT
deploy:
if: ${{ success() }}
name: Deploy nacos
needs: [docker]
runs-on: ubuntu-latest
timeout-minutes: 60
env:
REPLICA_COUNT: 3
DATABASE: mysql
NODE_PORT: 30000
AUTH_ENABLED: false
ACTUAL_MODE: cluster
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone","standalone_auth"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- name: set nodeport
run: |
echo "NODE_PORT=$(expr $(expr $(expr $(expr ${{ strategy.job-index }} + 1) * ${{ github.run_number }}) % 30000) + 30000)" >> $GITHUB_ENV
- name: set params values
run: |
if [[ ${{ matrix.mode }} == "standalone"* ]];then
if [[ ${{ matrix.mode }} = "standalone_auth" ]]; then
echo "AUTH_ENABLED=true" >> $GITHUB_ENV
fi
echo "ACTUAL_MODE=standalone" >> $GITHUB_ENV
echo "REPLICA_COUNT=1" >> $GITHUB_ENV
echo "DATABASE=embedded" >> $GITHUB_ENV
echo ${{ matrix.mode }}-nacos-${{ github.run_id }}-${{ strategy.job-index }}
fi
- name: allocate docker repo
run: |
if [[ $(expr $(expr ${{ github.run_id }} + ${{ strategy.job-index }} ) % 2 ) -eq 1 ]]; then
echo "DOCKER_REPO_ACTUAL=${{ env.DOCKER_REPO }}" >> $GITHUB_ENV
else
echo "DOCKER_REPO_ACTUAL=${{ env.DOCKER_REPO_B }}" >> $GITHUB_ENV
fi
- uses: apache/rocketmq-test-tool@java-dev
name: Deploy nacos
with:
yamlString: |
action: deploy
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
waitTimes: 2000
velaAppDescription: nacos-${{ env.GITHUB_WORKFLOW }}-${{ github.run_id }}@${{ matrix.version }}
repoName: nacos
helm:
chart: ./cicd/helm
git:
branch: main
repoType: git
retries: 3
url: https://github.com/nacos-group/nacos-e2e.git
values:
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
global:
mode: ${{ env.ACTUAL_MODE }}
nacos:
replicaCount: ${{ env.REPLICA_COUNT }}
image:
repository: ${{ env.DOCKER_REPO_ACTUAL }}
tag: ${{ matrix.version }}
auth:
enabled: ${{ env.AUTH_ENABLED }}
storage:
type: ${{ env.DATABASE }}
db:
port: 3306
username: nacos
password: nacos
param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
service:
nodePort: ${{ env.NODE_PORT }}
type: ClusterIP
e2e-java-test:
if: ${{ success() }}
name: Java e2e Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
env:
CODE_PATH: java/nacos-2X
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone","standalone_auth"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- name: set code path
run: |
if [[ ${{ matrix.mode }} = "standalone_auth" ]]; then
echo "CODE_PATH=java/auth" >> $GITHUB_ENV
echo ${{ matrix.mode }}-nacos-${{ github.run_id }}-${{ strategy.job-index }}
fi
- uses: apache/rocketmq-test-tool@java-dev
name: java e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: ${{ env.CODE_PATH }}
CMD: mvn clean test -B
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-java.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-go-test:
if: ${{ success() }}
name: GO E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: go e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: golang
CMD: |
cd /root/code/golang && go mod init nacos_go_test && go mod tidy
gotestsum --junitfile ./target/surefire-reports/TEST-report.xml ./nacosgotest
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-go.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-cpp-test:
if: ${{ success() }}
name: Cpp E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: cpp e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: cpp
CMD: |
yum-config-manager remove centos-sclo-rh
cd /root/code/cpp && make install
echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc && source ~/.bashrc
cd /root/code/cpp/nacoscpptest
g++ nacos_test.cpp -o nacos_test -lgtest -lpthread -I/usr/local/include/nacos/ -L/usr/local/lib/ -lnacos-cli
chmod 777 nacos_test && ./nacos_test --gtest_output="xml:../target/surefire-reports/TEST-gtestresults.xml"
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-cpp.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-csharp-test:
if: ${{ success() }}
name: Csharp E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: csharp e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: csharp
CMD: |
rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
yum -y install dotnet-sdk-3.1 && yum -y install aspnetcore-runtime-7.0
cd /root/code/csharp/nacos-csharp-sdk-test && dotnet restore
dotnet test --logger:"junit;LogFilePath=../target/surefire-reports/TEST-result.xml"
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-csharp.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-nodejs-test:
if: ${{ success() }}
name: Nodejs E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: nodejs e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: nodejs
CMD: |
cd /root/code/nodejs/nacosnodejstest && npm install
mocha test --reporter mocha-junit-reporter --reporter-options mochaFile=../target/surefire-reports/TEST-report.xml
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-nodejs.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-python-test:
if: ${{ success() }}
name: Python E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: python e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: python
CMD: |
cd /root/code/python
pip3 install -r requirements.txt
source ~/.bashrc
cd nacospythontest && pytest --junitxml ../target/surefire-reports/TEST-report.xml test/*_test.py --log-cli-level=DEBUG
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-python.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
clean:
if: ${{ always() }}
name: Clean
needs: [docker, e2e-java-test, e2e-go-test, e2e-cpp-test, e2e-csharp-test, e2e-nodejs-test, e2e-python-test]
runs-on: ubuntu-latest
timeout-minutes: 5
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone","standalone_auth"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: clean
with:
yamlString: |
action: clean
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
write-comment:
if: ${{ always() }}
name: write comment to pr
needs: [docker, deploy, e2e-java-test, e2e-go-test, e2e-cpp-test, e2e-csharp-test, e2e-nodejs-test, e2e-python-test, clean]
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: 'Download artifact'
uses: actions/github-script@v6
with:
script: |
let artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }},
});
let matchArtifactPR = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "pr"
})[0];
let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifactPR.id,
archive_format: 'zip',
});
var fs = require('fs');
fs.writeFileSync('${{github.workspace}}/pr.zip', Buffer.from(download.data));
- name: unzip pr
run: |
unzip pr.zip
cat pr.txt
pr_number=`cat pr.txt`
echo "PR_NUMBER=${pr_number}" >> $GITHUB_ENV
- name: write issue comment
run: |
echo ${{ env.PR_NUMBER }}
job_status=""
if [ ${{ needs.docker.result }} = 'success' ] && [ ${{ needs.deploy.result }} = 'success' ] && [ ${{ needs.e2e-java-test.result }} = 'success' ] && [ ${{ needs.e2e-go-test.result }} = 'success' ] && [ ${{ needs.e2e-cpp-test.result }} = 'success' ] && [ ${{ needs.e2e-csharp-test.result }} = 'success' ] && [ ${{ needs.e2e-nodejs-test.result }} = 'success' ] && [ ${{ needs.e2e-python-test.result }} = 'success' ]; then
jobs_status='$\\color{green}{SUCCESS}$'
jobs_status+="\n[DETAILS](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${{ github.run_id }})"
else
jobs_status='$\\color{red}{FAILURE}$'
jobs_status+="\n[DETAILS](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${{ github.run_id }})"
fi
echo ${jobs_status}
markdown_content="${jobs_status}"
generate_content() {
if [ $1 = "success" ];then
echo "\n ✅ $2 $1 "
else
echo "\n ❌ $2 $1 "
fi
}
markdown_content+=$(generate_content ${{ needs.docker.result }} "- docker: ")
markdown_content+=$(generate_content ${{ needs.deploy.result }} "- deploy (standalone & cluster & standalone_auth): ")
markdown_content+=$(generate_content ${{ needs.e2e-java-test.result }} "- e2e-java-test (standalone & cluster & standalone_auth): ")
markdown_content+=$(generate_content ${{ needs.e2e-go-test.result }} "- e2e-go-test (standalone & cluster): ")
markdown_content+=$(generate_content ${{ needs.e2e-cpp-test.result }} "- e2e-cpp-test (standalone & cluster): ")
markdown_content+=$(generate_content ${{ needs.e2e-csharp-test.result }} "- e2e-csharp-test (standalone & cluster): ")
markdown_content+=$(generate_content ${{ needs.e2e-nodejs-test.result }} "- e2e-nodejs-test (standalone & cluster): ")
markdown_content+=$(generate_content ${{ needs.e2e-python-test.result }} "- e2e-python-test (standalone & cluster): ")
markdown_content+=$(generate_content ${{ needs.clean.result }} "- clean (standalone & cluster & standalone_auth): ")
echo "markdown_content: \n ${markdown_content}"
payload=`echo "{\"body\": \"${markdown_content}\"}" | jq .`
curl -L -X POST ${{ env.HEADER_PARAMS_WRITE_COMMENT }} ${{ env.BASE_URL_NACOS }}/issues/${{ env.PR_NUMBER }}/comments -d "${payload}"
================================================
FILE: .github/workflows/push-ci.yaml
================================================
name: PUSH-CI
on:
push:
branches: [master, develop, v2.x-develop]
permissions:
contents: read
concurrency:
group: nacos-${{ github.ref }}
env:
DOCKER_REPO: wuyfeedocker/nacos-ci
DOCKER_REPO_B: wuyfeehub/nacos-ci
TEST_REPO_NAME: nacos-group/nacos-e2e
jobs:
dist-tar:
name: Build dist tar
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- uses: actions/checkout@v3
with:
submodules: true
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "17"
cache: "maven"
- name: Build distribution tar
run: |
mvn '-Prelease-nacos,!dev' -DskipTests clean install -U -e -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
- uses: actions/upload-artifact@v4
name: Upload distribution tar
with:
name: nacos
path: distribution/target/nacos-server-*.tar.gz
docker:
if: ${{ success() }}
name: Docker images
needs: [dist-tar]
runs-on: ubuntu-latest
timeout-minutes: 30
env:
DOCKERHUB_USER_ACTUAL: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN_ACTUAL: ${{ secrets.DOCKERHUB_TOKEN }}
strategy:
matrix:
base-image: ["centos"]
java-version: ["17"]
outputs:
version-json: ${{ steps.show_versions.outputs.version-json }}
steps:
- uses: actions/checkout@v3
with:
repository: nacos-group/nacos-e2e.git
ref: main
path: nacos-e2e
- uses: actions/download-artifact@v4.1.7
name: Download distribution tar
with:
name: nacos
path: ./
- name: Generate image tag
id: build-images
run: |
mv nacos-server-*.tar.gz nacos-e2e/cicd/build/
cd nacos-e2e/cicd/build
version=${{ github.event.pull_request.number || github.ref_name }}-$(uuidgen)
mkdir versionlist
touch versionlist/"${version}-`echo ${{ matrix.java-version }} | sed -e "s/:/-/g"`"
ls versionlist/
echo TAG=${version}-$(echo ${{ matrix.java-version }} | sed -e "s/:/-/g") >> $GITHUB_ENV
- name: docker-login-1
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: save docker_1 images
run: |
mkdir build_backup
cp -rf nacos-e2e/cicd/build/* ./build_backup/
cd nacos-e2e/cicd/build
docker build --no-cache -f Dockerfile -t ${DOCKER_REPO}:${{ env.TAG }} .
docker push ${DOCKER_REPO}:${{ env.TAG }}
- name: docker-login-2
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKERHUB_USER_B }}
password: ${{ secrets.DOCKERHUB_TOKEN_B }}
- name: save docker_2 images
run: |
rm -rf nacos-e2e/cicd/build/*
mv ./build_backup/* nacos-e2e/cicd/build/
cd nacos-e2e/cicd/build
docker build --no-cache -f Dockerfile -t ${DOCKER_REPO_B}:${{ env.TAG }} .
docker push ${DOCKER_REPO_B}:${{ env.TAG }}
- name: Show versions
id: show_versions
run: |
a=(`ls nacos-e2e/cicd/build/versionlist`)
printf '%s\n' "${a[@]}" | jq -R . | jq -s .
echo version-json=`printf '%s\n' "${a[@]}" | jq -R . | jq -s .` >> $GITHUB_OUTPUT
deploy:
if: ${{ success() }}
name: Deploy nacos
needs: [docker]
runs-on: ubuntu-latest
timeout-minutes: 60
env:
REPLICA_COUNT: 3
DATABASE: mysql
NODE_PORT: 30000
AUTH_ENABLED: false
ACTUAL_MODE: cluster
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone","standalone_auth"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- name: set nodeport
run: |
echo "NODE_PORT=$(expr $(expr $(expr $(expr ${{ strategy.job-index }} + 1) * ${{ github.run_number }}) % 30000) + 30000)" >> $GITHUB_ENV
- name: set params values
run: |
if [[ ${{ matrix.mode }} == "standalone"* ]];then
if [[ ${{ matrix.mode }} = "standalone_auth" ]]; then
echo "AUTH_ENABLED=true" >> $GITHUB_ENV
fi
echo "ACTUAL_MODE=standalone" >> $GITHUB_ENV
echo "REPLICA_COUNT=1" >> $GITHUB_ENV
echo "DATABASE=embedded" >> $GITHUB_ENV
echo ${{ matrix.mode }}-nacos-${{ github.run_id }}-${{ strategy.job-index }}
fi
- name: allocate docker repo
run: |
if [[ $(expr $(expr ${{ github.run_id }} + ${{ strategy.job-index }} ) % 2 ) -eq 1 ]]; then
echo "DOCKER_REPO_ACTUAL=${{ env.DOCKER_REPO }}" >> $GITHUB_ENV
else
echo "DOCKER_REPO_ACTUAL=${{ env.DOCKER_REPO_B }}" >> $GITHUB_ENV
fi
- uses: apache/rocketmq-test-tool@java-dev
name: Deploy nacos
with:
yamlString: |
action: deploy
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
waitTimes: 2000
velaAppDescription: nacos-${{ env.GITHUB_WORKFLOW }}-${{ github.run_id }}@${{ matrix.version }}
repoName: nacos
helm:
chart: ./cicd/helm
git:
branch: main
repoType: git
retries: 3
url: https://github.com/nacos-group/nacos-e2e.git
values:
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
global:
mode: ${{ env.ACTUAL_MODE }}
nacos:
replicaCount: ${{ env.REPLICA_COUNT }}
image:
repository: ${{ env.DOCKER_REPO_ACTUAL }}
tag: ${{ matrix.version }}
auth:
enabled: ${{ env.AUTH_ENABLED }}
storage:
type: ${{ env.DATABASE }}
db:
port: 3306
username: nacos
password: nacos
param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
service:
nodePort: ${{ env.NODE_PORT }}
type: ClusterIP
e2e-java-test:
if: ${{ success() }}
name: Java e2e Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
env:
CODE_PATH: java/nacos-2X
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone","standalone_auth"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- name: set code path
run: |
if [[ ${{ matrix.mode }} = "standalone_auth" ]]; then
echo "CODE_PATH=java/auth" >> $GITHUB_ENV
echo ${{ matrix.mode }}-nacos-${{ github.run_id }}-${{ strategy.job-index }}
fi
- uses: apache/rocketmq-test-tool@java-dev
name: java e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: ${{ env.CODE_PATH }}
CMD: mvn clean test -B
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-java.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-go-test:
if: ${{ success() }}
name: GO E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: go e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: golang
CMD: |
cd /root/code/golang && go mod init nacos_go_test && go mod tidy
gotestsum --junitfile ./target/surefire-reports/TEST-report.xml ./nacosgotest
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-go.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-cpp-test:
if: ${{ success() }}
name: Cpp E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: cpp e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: cpp
CMD: |
yum-config-manager remove centos-sclo-rh
cd /root/code/cpp && make install
echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc && source ~/.bashrc
cd /root/code/cpp/nacoscpptest
g++ nacos_test.cpp -o nacos_test -lgtest -lpthread -I/usr/local/include/nacos/ -L/usr/local/lib/ -lnacos-cli
chmod 777 nacos_test && ./nacos_test --gtest_output="xml:../target/surefire-reports/TEST-gtestresults.xml"
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-cpp.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-csharp-test:
if: ${{ success() }}
name: Csharp E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: csharp e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: csharp
CMD: |
rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
yum -y install dotnet-sdk-3.1 && yum -y install aspnetcore-runtime-7.0
cd /root/code/csharp/nacos-csharp-sdk-test && dotnet restore
dotnet test --logger:"junit;LogFilePath=../target/surefire-reports/TEST-result.xml"
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-csharp.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-nodejs-test:
if: ${{ success() }}
name: Nodejs E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: nodejs e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: nodejs
CMD: |
cd /root/code/nodejs/nacosnodejstest && npm install
mocha test --reporter mocha-junit-reporter --reporter-options mochaFile=../target/surefire-reports/TEST-report.xml
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-nodejs.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
e2e-python-test:
if: ${{ success() }}
name: Python E2E Test
needs: [docker, deploy]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: python e2e test
with:
yamlString: |
action: test
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
API_VERSION: v1
KIND: Pod
RESTART_POLICY: Never
ENV:
WAIT_TIME: 900
REPO_NAME: ${{ env.TEST_REPO_NAME }}
CODE: https://github.com/${{ env.TEST_REPO_NAME }}
BRANCH: main
CODE_PATH: python
CMD: |
cd /root/code/python && pip3 install -r requirements.txt && source ~/.bashrc
cd nacospythontest && pytest --junitxml ../target/surefire-reports/TEST-report.xml test/*_test.py --log-cli-level=DEBUG
ALL_IP: null
CONTAINER:
IMAGE: cloudnativeofalibabacloud/test-runner:v0.0.4
RESOURCE_LIMITS:
cpu: 2
memory: 2Gi
RESOURCE_REQUIRE:
cpu: 2
memory: 2Gi
- uses: actions/upload-artifact@v4
if: always()
name: Upload test log
with:
name: testlog-${{ matrix.mode }}-python.txt
path: testlog.txt
- name: add markdown
if: always()
run: |
cat result.md >> $GITHUB_STEP_SUMMARY
clean:
if: always()
name: Clean
needs: [docker, e2e-java-test, e2e-go-test, e2e-cpp-test, e2e-csharp-test, e2e-nodejs-test, e2e-python-test]
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode: ["cluster","standalone","standalone_auth"]
version: ${{ fromJSON(needs.docker.outputs.version-json) }}
steps:
- uses: apache/rocketmq-test-tool@java-dev
name: clean
with:
yamlString: |
action: clean
namespace: nacos-${{ github.run_id }}-${{ strategy.job-index }}
askConfig: ${{ secrets.ASK_CONFIG_VIRGINA }}
================================================
FILE: .github/workflows/stale.yml
================================================
name: Close inactive issues
on:
schedule:
- cron: "0 17 * * *" # UTC+8 01:00(UTC 17:00)
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v10
with:
operations-per-run: 50
days-before-issue-stale: 7
days-before-issue-close: 7
stale-issue-label: "expired"
stale-issue-message: "This issue has been open 7 days with no activity. This will be closed in 7 days."
close-issue-message: "This issue was closed because it has been inactive for 7 days since being marked as expired."
days-before-pr-stale: -1
days-before-pr-close: -1
exempt-all-milestones: true
exempt-issue-labels: "kind/bug,kind/code quality,kind/discussion,kind/enhancement,kind/feature,kind/notice,kind/performance,kind/proposal,kind/question,kind/refactor,kind/user experience,good first issue,contribution welcome,dependencies"
repo-token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .gitignore
================================================
# Except this file !.gitignore
.classpath
.project
.settings
target
.idea
.vscode
.DS_Store
.factorypath
/logs
*.iml
*.log
node_modules
test/derby.log
derby.log
work
test/logs
derby.log
yarn.lock
.flattened-pom.xml
lefthook.yml
distribution/conf/*.sql
distribution/plugins/*.jar
================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
# 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.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
================================================
FILE: .travis.yml
================================================
notifications:
email:
recipients:
- dev-nacos@googlegroups.com
- mw_configcenter@list.alibaba-inc.com
on_success: change
on_failure: always
language: java
matrix:
include:
# On OSX, run with default JDK only.
# - os: osx
# On Linux, run with specific JDKs only.
- os: linux
env: CUSTOM_JDK="oraclejdk8"
- name: Linux aarch64
dist: focal
arch: arm64-graviton2
group: edge
virt: vm
jdk:
- openjdk11
- openjdk8
before_install:
- echo 'MAVEN_OPTS="$MAVEN_OPTS -Xmx1024m -XX:MaxPermSize=512m -XX:+BytecodeVerificationLocal"' >> ~/.mavenrc
- cat ~/.mavenrc
# - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export JAVA_HOME=$(/usr/libexec/java_home); fi
# - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then jdk_switcher use "$CUSTOM_JDK"; fi
script:
- mvn -B clean package apache-rat:check findbugs:findbugs -Dmaven.test.skip=true
- mvn clean -Premove-test-data
- mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
- mvn clean -Premove-test-data
- mvn clean package -Pcit-test
- mvn clean -Premove-test-data
- mvn clean package -Pnit-test
- mvn clean -Premove-test-data
after_success:
- mvn clean package -Pit-test
- mvn sonar:sonar -Psonar-apache
================================================
FILE: BUILDING
================================================
Build Instructions for NACOS
====================================================
(1) Prerequisites
JDK 17+ is required in order to compile and run Nacos.
nacos utilizes Maven as a distribution management and packaging tool. Version 3.6.3 or later is required.
The plugin org.apache.maven.plugins:maven-enforcer-plugin:3.5.0 requires Maven version 3.6.3 .
Maven installation and configuration instructions can be found here:
http://maven.apache.org/run-maven/index.html
(2) Run test cases
Execute the following command in order to compile and run test cases of each components:
$ mvn test
(3) Import projects to Eclipse IDE
First, generate eclipse project files:
$ mvn -U eclipse:eclipse
Then, import to eclipse by specifying the root directory of the project via:
[File] > [Import] > [Existing Projects into Workspace].
(4) Build distribution packages
Execute the following command in order to build the tar.gz packages and install JAR into local repository:
#build nacos
$ mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
$ ./mvnw -Prelease-nacos -Dmaven.test.skip=true clean install -U
================================================
FILE: CHANGELOG.md
================================================
## 1.0.0-RC4(Mar 22, 2019)
* [#923] Nacos 1.0.0 compatible with nacos-client 0.6.2
* [#938] Client beat processor task lost
* [#946] Change default server mode to AP
## 1.0.0-RC1(Mar 15, 2019)
* [#870] About Nacos's namespace and tenant design
* [#869] Client exception message is confusing
* [#866] BeatInfo scheduled property may have the memory visibility issue
* [#865] checksum value is not correct
* [#839] Refactor API URLs
* [#811] ApiCommands.updateIpPublish countDownLatch timeout issue
* [#809] Instance field 'valid' should be deprecated and replaced by 'healthy'
* [#803] Nacos front-end function regression plan and landing
* [#801] Nacos uses nignx as a best practice article for current limiting.
* [#757] The word 'domain' should be replaced by 'service'
* [#745] Support server running mode in CP, AP or mixed
* [#744] The exact status of server should be stored and controlled
* [#725] Will the nacos registry be how to do multi-environment deployment?
* [#677] Support ephemeral instances and persistent instances
* [#651] Remove old API entry 'APICommands'
* [#650] Refactor server list management to make it irrelevant to consistency protocol
* [#634] Add global push enable switch and data query enable switch
* [#629] Server data needs warm up before open traffic
* [#502] Registering ephemeral instance as well as persistent instances
* [#501] Health check mode confict when building muilt clusters whit nacos sync + nacos
* [#479] Metadata should be displayed and edited using standard property syntax
* [#327] Inform the ACM SDK of the RAM role name and access the configuration ? ?
* [#269] need to support service group in naming module
## 0.9.0(Feb 28, 2019)
* [#840] Nacos server adds startup mode to distinguish between config and naming.
* [#762] Register instance returns failed when the health check mode is 'server' in standalone mode.
* [#473] Nacos Cluster Mode kubernate Startup nacos.log error Log.
* [#240] Log strong dependence problem.
* [#824] getServicesOfServer throws exception if service list is empty.
* [#802] Nacos server multi-boot mode support.
* [#800] Nacos's client-to-server addressing mode document introduction.
* [#768] The interval at which the heartbeat is sent in BeatReactor is not controlled by the server return value.
* [#759] why instance can't auto-delete.
* [#756] Format of instance and service should be validated.
* [#720] Memory leak in PushService.
* [#653] IoUtils under nacos-common-0.2.1-RC1.jar lacks "" judgment on encoding.
* [#588] Client compatible to jdk1.6.
## 0.8.0(Jan 22, 2019) PRE-GA
* [#162] Support open metrics and prometheus
* [#268] Health check is performed in the Nacos startup script
* [#320] Nacos supports multiple configuration files, configuration template abstraction and inheritance
* [#333] Use nacos in k8s to get hostname exception
* [#335] update nacos.io docker img priority/low
* [#339] Project language problem identified in github
* [#381] Discuss:How to support Login
* [#397] Some questions for Nacos
* [#402] When the configuration is added or edited, the edit box will not come out
* [#462] Nacos monitor discuss (0.8 version)
* [#496] Warning log printing when quering a nonexistent service
* [#497] Make subscription of service triggered by getInstance method optional
* [#498] Support namespace for service discovery
* [#499] When the configuration is newly created (if data-id and group already exist), the original configuration will be overwritten
* [#512] nacos-logs start.out always print 8848 (but port can be changed)
* [#514] Nacos 0.7 not support namespace
* [#523] Add a switch to control server detection and client reporting heartbeat switching
* [#526] Possible data loss in server side health check mode
* [#527] Many repeat client beat tasks can be generated
* [#558] Enable access log recording by default
* [#560] Nacos server startup issues
* [#579] New API support - “update health in none health check mode through api”
* [#587] Client sends request concurrently
* [#592] Service restful interface put/post is reversed
* [#599] getSubscribeServices method gets services that were deregistered
* [#603] Format log of naming module
* [#609] Always print a NPE log at start
* [#663] Nacos update instance info NPE
* [#668] 0.8.0-SNAPSHOT naming heartbeat not compatible with lower version client
* [#672] Startup.cmd bug
## 0.7.0(Dec, 2018)
* [ #461 ] Registration failed when instance port is set to 0
* [ #455 ] The console can't change the change code
* [ #447 ] 集群模式server挂掉一台后,提供方注册失败
* [ #445 ] 0.6.1控制台创建配置发布提交时,提示信息有问题
* [ #442 ] Typos in class names and variables.
* [ #413 ] The console has some uncaught exceptions
* [ #395 ] nacos surport mysql in the case of stand-alone mode
* [ #393 ] Support operation of selector on console
* [ #365 ] NodeJs SDK support
* [ #362 ] The metadata will lost when online or offline instance through web ui
* [ #187 ] Provide Label ability for Naming Service into NACOS for complex multi-DC scenario.
## 0.6.1(Dec, 2018)
* [#421] NamingService's serivce name can't use colon(:) in Windows
* [#432] When packing nacos-core, ${user.home} is replaced in the logback configuration file (nacos.xml)
## 0.6.0(Dec, 2018)
* [#388] Cluster name should be provided in the Instance
* [#377] Clean up messy code in Naming module
* [#369] Support instance list persisted on disk
* [#366] findbugs-maven-plugin version
* [#362] The metadata will lost when online or offline instance through web ui
* [#352] Refactoring internationalization Nacos console
* [#278] Nacos docker img
* [#243] optimize the efficiency of integration testing, it’s taking too long now
## 0.5.0(Nov, 2018)
* [#148] Naming write performace.
* [#175] Support deregistering instance automatically.
* [#176] Naming client query instance method should bypass local cache at client start.
* [#177] Console supports registering new empty service and delete empty service.
* [#181] NPE when adding an instance if no leader in the raft cluster.
* [#193] Configure host domain name cause nacos server cluster is unavailable.
* [#209] Disable service and cluster level customization in client registerInstance method.
* [#214] Please support Java 11.
* [#222] print more nacos server start status info in start.log.
* [#231] Refactoring: Parsing the Nacos home directory and the cluster.conf file.
* [#246] "mvn -B clean apache-rat:check findbugs:findbugs" did not work as expected.
* [#251] Console Editor Optimization.
* [#254] DataId and group are required in historical version and listener query.
* [#256] Whether the service discovery data needs to add a newline link symbol.
* [#257] Listening query switching query dimension data is not refreshed.
* [#258] Remove the Balloon of DataId/Group.
* [#259] Listening query paging size problem.
* [#272] "#it is ip" is also parsed into an instance IP.
* [#275] nacos coredns plugin to support DNS.
* [#281] We should lint the console code.
* [#302] Maven build project supports java 11.
* [#316] In stand alone mode, Nacos still checks the cluster.conf.
## 0.4.0(Nov 7, 2018)
* [#216] Fix tenant dir problem
* [#197] Service update ignored some properties
* [#190] Client beat lose weight info and metadata info
* [#188] Console delete data cannot be updated in time
* [#179] Listening query fail when namespace is not blank
* [#157] Lack information in readme.md to describe the related project repositories for Nacos echosystem
* [#144] There have a error and something are not clear
* [#106] Snapshot file create error
* [#92] Eliminate warnings, refactor code, show start.log detail
## 0.3.0(Oct 26, 2018)
* [#171] UI debug errors
* [#156] Web UI 404 problem
* [#155] use local resource
* [#145] nacos-example not found :org.apache.logging.log4j.core.Logger
* [#142] UI console show Group
* [#149] Fix naming client beat process failed bug.
* [#150] Fix naming service registration hangs bug.
## 0.3.0-RC1(Oct 19, 2018)
* [#33] Support console for config management.
* [#51] Support console for naming service.
* [#121] Fix get instance method hanging bug.
* [#138] Add a flag to indicate if instance is offline.
* [#130] Fix health check disabled if machine has one CPU core bug.
* [#139] Fix still get instance with zero weight bug.
* [#128] Fix console layout bug.
## 0.2.1-release(Sept 28, 2018)
* Fix deregister last instance failed error.
* Fix url pattern error.
* Fully integrate with and seamlessly support Spring framework, Spring Boot and Spring Cloud
* Separate nacos-api from nacos client implementation
* Support high available cluster mode
* Fix cluster node health check abnormality
* Fix stand-alone mode gets the change history list exception
* Fix Pulling does not exist configuration print io exception
* Optimized log framework
* Service Discovery: Client support getting server status.
* Service Discovery: Client support get all service names of server.
* Service Discovery: Client support get all subscribed services.
## 0.2.0 (Sept 17, 2018)
#### FEATURES:
* separate nacos-api from nacos client implementation
* Cluster node health check abnormality
* Stand-alone mode gets the change history list exception
* Pulling does not exist configuration print io exception
* Optimized log framework
* Service Discovery: Client support getting server status.
* Service Discovery: Client support get all service names of server.
* Service Discovery: Client support get all subscribed services.
#### IMPROVEMENTS:
#### BUG FIXES:
#### BREAKING CHANGES:
## 0.1.0 (July 18, 2018)
#### FEATURES:
* Creating, deleting, modifying, and querying configurations: the core functionalities.
* Multiple languages support: supports Java/Shell/HTTP OpenAPI.
* Service Discovery: Basic service registry and discovery.
* Service Discovery: Service load balancing using instance weights, protect threshold and instance health statuses.
* Service Discovery: Supports four ways for health check: http, tcp, mysql and client heartbeat.
* Service Discovery: CRUD operations on service instances through Java client and open API.
* Service Discovery: Service subscribtion and push through Java client.
* Nacos official website is coming. https://nacos.io/
#### IMPROVEMENTS:
#### BUG FIXES:
#### BREAKING CHANGES:
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance, race,
religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at users-nacos@googlegroups.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Nacos
[中文版](./CONTRIBUTING_zh.md)
Welcome to Nacos! This document is a guideline about how to contribute to Nacos.
If you find something incorrect or missing, please leave comments / suggestions.
## Before you get started
### Code of Conduct
Please make sure to read and observe our [Code of Conduct](./CODE_OF_CONDUCT.md).
## Contributing
Nacos welcome new participants of any role, including user, contributor, committer and PMC.

We encourage newcomers actively joining in Nacos projects and involving from user roles to committer roles, and even PMC roles. In order to accomplish this, new comers needs to actively contribute in Nacos project. The following paragraph introduce how to contribute in Nacos way.
#### Open / pickup an issue for preparation
If you find a typo in a document, find a bug in code or want new features, or want to give suggestions, you can [open an issue on GitHub](https://github.com/alibaba/Nacos/issues/new) to report it.
If you just want to contribute directly you can choose the issue below.
- [Contribution Welcome](https://github.com/alibaba/nacos/labels/contribution%20welcome): Heavily needed issue, but currently short of hand.
- [good first issue](https://github.com/alibaba/nacos/labels/good%20first%20issue): Good for newcomers, newcomers can pick up one for warm-up.
We strongly value documentation and integration with other projects such as Spring Cloud, Kubernetes, Dubbo, etc. We are very glad to work on any issue for these aspects.
Please note that any PR must be associated with a valid issue. Otherwise, the PR will be rejected.
#### Begin your contribution
Now if you want to contribute, please create a new pull request.
We use the `develop` branch as the development branch, which indicates that this is an unstable branch.
Furthermore, our branching model complies with [https://nvie.com/posts/a-successful-git-branching-model/](https://nvie.com/posts/a-successful-git-branching-model/). We strongly suggest new comers walk through the above article before creating PR.
Now, if you are ready to create PR, here is the workflow for contributors:
1. Fork to your own
2. Clone fork to a local repository
3. Create a new branch and work on it
4. Keep your branch in sync
5. Commit your changes (make sure your commit message is concise)
6. Run pre-submission checks locally (see [Pre-submission Checks](#pre-submission-checks) below)
7. Push your commits to your forked repository
8. Create a pull request to **develop** branch.
When creating pull request:
1. Please follow [the pull request template](./.github/PULL_REQUEST_TEMPLATE.md).
2. Please create the request to **develop** branch.
3. Please make sure the PR has a corresponding issue.
4. If your PR contains large changes, e.g. component refactor or new components, please write detailed documents about its design and usage.
5. Note that a single PR should not be too large. If heavy changes are required, it's better to separate the changes to a few individual PRs.
6. After creating a PR, one or more reviewers will be assigned to the pull request.
7. Before merging a PR, squash any fix review feedback, typo, merged and rebased sorts of commits. The final commit message should be clear and concise.
If your PR contains large changes, e.g. component refactor or new components, please write detailed documents about its design and usage.
### License header
Every new source file (`.java`, `.xml`, etc.) **must** include the Apache License 2.0 header. CI enforces this via `apache-rat:check` and your PR will fail without it.
Copy the header below into every new file (adjust the comment style for non-Java files):
```java
/*
* Copyright 1999-2026 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
```
### Pre-submission checks
Before pushing your commits, run the following command locally to catch issues early:
```bash
mvn -B clean compile apache-rat:check checkstyle:check spotbugs:check -DskipTests
```
| Check | What it verifies |
|-------|-----------------|
| `compile` | Code compiles without errors |
| `apache-rat:check` | All source files have the required Apache License header |
| `checkstyle:check` | Code style complies with [Alibaba Java Coding Guidelines](style/NacosCheckStyle.xml) |
| `spotbugs:check` | No high-priority bug patterns detected by [SpotBugs](https://spotbugs.github.io/) |
To run unit tests:
```bash
mvn clean test
```
### Code review guidance
Committers will rotate reviewing the code to make sure all the PR will be reviewed timely and by at least one committer before merge. If we aren't doing our job (sometimes we drop things). And as always, we welcome volunteers for code review.
Some principles:
- Readability - Important code should be well-documented. API should have Javadoc. Code style should be complied with the existing one.
- Elegance: New functions, classes or components should be well-designed.
- Testability - 80% of the new code should be covered by unit test cases.
- Maintainability - Comply with our [PMD spec](style/codeStyle.md), and 3-month-frequency update should be maintained at least.
### Now how about try become a committer?
Generally speaking, contribute 8 non-trivial patches and get at least three different people to review them (you'll need three people to support you). Then ask someone to nominate you. You're demonstrating your:
- at least 8 PR and the associated issues to the project,
- ability to collaborate with the team,
- understanding of the projects' code base and coding style, and
- ability to write good code (last but certainly not least)
A current committer nominates you by slacking the team on the Nacos issue with the label "nomination"
- your first and last name
- a link to your Git profile
- an explanation of why you should be a committer,
- Elaborate on the top 3 PR and the associated issues the nominator has worked with you that can demonstrate your ability.
Two other committers need to second your nomination. If no one objects in 5 working days (China), you're a committer. If anyone objects or wants more information, the committers discuss and usually come to a consensus (within the 5 working days). If issues cannot be resolved, there's a vote among current committers.

In the worst case, this can drag out for two weeks. Keep contributing! Even in the rare cases where a nomination fails, the objection is usually something easy to address like "more patches" or "not enough people are familiar with this person's work."
================================================
FILE: CONTRIBUTING_zh.md
================================================
# 贡献指南
[English](./CONTRIBUTING.md)
欢迎来到 Nacos!本文档是关于如何为 Nacos 做贡献的指南。
如果您发现任何不正确或遗漏的内容,请留下意见或建议。
## 开始之前
### 行为准则
请务必阅读并遵守我们的[行为准则](./CODE_OF_CONDUCT.md)。
## 参与贡献
Nacos 欢迎任何角色的新参与者,包括用户、贡献者、Committer 和 PMC。

我们鼓励新人积极参与 Nacos 项目,从用户角色发展到贡献者、Committer,甚至 PMC。为了实现这一目标,新人需要积极地为 Nacos 项目做贡献。以下内容介绍了如何以 Nacos 的方式进行贡献。
#### 创建或认领 Issue
如果您发现文档中的拼写错误、代码中的 bug,或者想要新功能、提出建议,可以在 [GitHub 上创建 Issue](https://github.com/alibaba/Nacos/issues/new) 进行反馈。
如果您想直接参与贡献,可以选择以下标签的 Issue:
- [Contribution Welcome](https://github.com/alibaba/nacos/labels/contribution%20welcome):急需解决但人手不足的 Issue。
- [good first issue](https://github.com/alibaba/nacos/labels/good%20first%20issue):适合新手的 Issue,可以作为入门热身。
我们非常重视文档编写以及与其他项目(如 Spring Cloud、Kubernetes、Dubbo 等)的集成。我们很乐意处理这些方面的任何 Issue。
请注意,每个 PR 必须关联一个有效的 Issue,否则 PR 将被拒绝。
#### 开始贡献
如果您准备开始贡献,请创建一个新的 Pull Request。
我们使用 `develop` 分支作为开发分支,这是一个不稳定的分支。
此外,我们的分支模型遵循 [Git Flow](https://nvie.com/posts/a-successful-git-branching-model/)。我们强烈建议新人在创建 PR 之前先阅读上述文章。
以下是贡献者的工作流程:
1. Fork 仓库到自己的账号下
2. 将 Fork 克隆到本地
3. 创建新分支并在上面开发
4. 保持分支与上游同步
5. 提交更改(确保 commit message 简洁明了)
6. 在本地运行提交前检查(参见下方[提交前检查](#提交前检查))
7. 将提交推送到您的 Fork 仓库
8. 向 **develop** 分支创建 Pull Request
创建 Pull Request 时:
1. 请遵循 [PR 模板](./.github/PULL_REQUEST_TEMPLATE.md)。
2. 请将 PR 提交到 **develop** 分支。
3. 请确保 PR 关联了对应的 Issue。
4. 如果 PR 包含较大的改动(如组件重构或新组件),请编写详细的设计和使用文档。
5. 注意单个 PR 不要过大。如果需要大量改动,最好将其拆分为多个独立的 PR。
6. 创建 PR 后,一名或多名审核者会被分配到该 PR。
7. 合并前,请将修复审查意见、拼写错误、合并和变基等提交压缩为有意义的提交。最终的 commit message 应当清晰简洁。
如果 PR 包含较大的改动(如组件重构或新组件),请编写详细的设计和使用文档。
### License 头
每个新的源文件(`.java`、`.xml` 等)**必须**包含 Apache License 2.0 头。CI 会通过 `apache-rat:check` 自动检查,缺少 License 头的 PR 将无法通过。
请将以下头信息复制到每个新文件中(非 Java 文件请调整注释风格):
```java
/*
* Copyright 1999-2026 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
```
### 提交前检查
在推送代码之前,请在本地运行以下命令以尽早发现问题:
```bash
mvn -B clean compile apache-rat:check checkstyle:check spotbugs:check -DskipTests
```
| 检查项 | 说明 |
|-------|------|
| `compile` | 代码是否能正常编译 |
| `apache-rat:check` | 所有源文件是否包含 Apache License 头 |
| `checkstyle:check` | 代码风格是否符合[阿里巴巴 Java 开发规约](style/NacosCheckStyle.xml) |
| `spotbugs:check` | 是否存在 [SpotBugs](https://spotbugs.github.io/) 检测到的高优先级 bug |
运行单元测试:
```bash
mvn clean test
```
### 代码审查指南
Committer 会轮流审查代码,确保所有 PR 在合并前至少经过一名 Committer 的及时审核。如果我们有所疏漏,欢迎随时提醒。同时,我们也欢迎志愿者参与代码审查。
一些原则:
- 可读性 - 重要的代码应有完善的文档。API 应有 Javadoc。代码风格应与现有代码保持一致。
- 优雅性 - 新的函数、类或组件应当设计良好。
- 可测试性 - 新代码应有 80% 的单元测试覆盖率。
- 可维护性 - 遵守我们的[代码规范](style/codeStyle.md)。
### 如何成为 Committer?
一般来说,需要贡献 8 个非琐碎的补丁,并获得至少三个不同的人来审核(您需要三个人的支持)。然后请人提名您。您需要展示:
- 至少为项目贡献了 8 个 PR 和对应的 Issue
- 能够与团队协作
- 了解项目代码库和编码风格
- 能够编写高质量的代码
Committer 通过在带有 "nomination" 标签的 Nacos Issue 中通知团队来提名您,需要包含:
- 您的姓名
- 您的 Git 主页链接
- 解释您为何应该成为 Committer
- 详细说明提名者与您合作过的前 3 个 PR 和对应 Issue,以证明您的能力
需要另外两名 Committer 附议您的提名。如果 5 个工作日(中国时间)内没有人反对,您就是 Committer 了。如果有人反对或需要更多信息,Committer 们会进行讨论并通常在 5 个工作日内达成共识。如果问题无法解决,将在现有 Committer 中进行投票。

在最坏的情况下,这个过程可能会持续两周。请继续贡献!即使在提名失败的罕见情况下,反对意见通常也是容易解决的,比如"需要更多补丁"或"没有足够的人熟悉此人的工作"。
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed 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.
================================================
FILE: NOTICE
================================================
Nacos
Copyright 2018-2020
This product includes software developed at
The Alibaba MiddleWare Group.
------
This product has a bundle Spring Boot:
The Spring Boot Project
=================
Please visit the Spring Boot web site for more information:
* https://spring.io/projects/spring-boot
Copyright 2014 The Spring Boot Project
The Spring Boot Project 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.
Also, please refer to each LICENSE.
* `namespaceId` and `mcpName` can't be changed.
* Provides REST APIs for prompt management operations. Used for updating prompt description without changing version. Example: [{"name":"question","defaultValue":"Hello","description":"User question"}]
* TODO This Memory cache might include some design issues:
*
# Nacos: Dynamic *Na*ming and *Co*nfiguration *S*ervice
[](https://gitter.im/alibaba/nacos?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [](https://www.apache.org/licenses/LICENSE-2.0.html)
[](https://travis-ci.org/alibaba/nacos)
[](https://opensource.alibaba.com/contribution_leaderboard/details?projectValue=nacos)
[](https://deepwiki.com/alibaba/nacos)
-------
## What does it do
Nacos (official site: [nacos.io](https://nacos.io)) is an easy-to-use platform designed for dynamic service discovery and configuration and service management. It helps you to build cloud native applications and microservices platform easily.
Service is a first-class citizen in Nacos. Nacos supports almost all type of services,for example,[Dubbo/gRPC service](https://nacos.io/docs/latest/ecology/use-nacos-with-dubbo/), [Spring Cloud RESTFul service](https://nacos.io/docs/latest/ecology/use-nacos-with-spring-cloud/) or [Kubernetes service](https://nacos.io/docs/latest/quickstart/quick-start-kubernetes/).
Nacos provides four major functions.
* **Service Discovery and Service Health Check**
Nacos makes it simple for services to register themselves and to discover other services via a DNS or HTTP interface. Nacos also provides real-time health checks of services to prevent sending requests to unhealthy hosts or service instances.
* **Dynamic Configuration Management**
Dynamic Configuration Service allows you to manage configurations of all services in a centralized and dynamic manner across all environments. Nacos eliminates the need to redeploy applications and services when configurations are updated, which makes configuration changes more efficient and agile.
* **Dynamic DNS Service**
Nacos supports weighted routing, making it easier for you to implement mid-tier load balancing, flexible routing policies, flow control, and simple DNS resolution services in the production environment within your data center. It helps you to implement DNS-based service discovery easily and prevent applications from coupling to vendor-specific service discovery APIs.
* **Service and MetaData Management**
Nacos provides an easy-to-use service dashboard to help you manage your services metadata, configuration, kubernetes DNS, service health and metrics statistics.
## Quick Start
It is super easy to get started with your first project.
### Deploying Nacos on cloud
You can deploy Nacos on cloud, which is the easiest and most convenient way to start Nacos.
Use the following [Nacos deployment guide](https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0) to see more information and deploy a stable and out-of-the-box Nacos server.
### Start by the provided startup package
#### Step 1: Download the binary package
You can download the package from the [latest stable release](https://github.com/alibaba/nacos/releases).
Take release `nacos-server-1.0.0.zip` for example:
```sh
unzip nacos-server-1.0.0.zip
cd nacos/bin
```
#### Step 2: Start Server
On the **Linux/Unix/Mac** platform, run the following command to start server with standalone mode:
```sh
sh startup.sh -m standalone
```
On the **Windows** platform, run the following command to start server with standalone mode. Alternatively, you can also double-click the `startup.cmd` to run NacosServer.
```
startup.cmd -m standalone
```
For more details, see [quick-start.](https://nacos.io/docs/latest/quickstart/quick-start/)
## Quick start for other open-source projects:
* [Quick start with Nacos command and console](https://nacos.io/docs/latest/quickstart/quick-start/)
* [Quick start with dubbo](https://nacos.io/docs/latest/ecology/use-nacos-with-dubbo/)
* [Quick start with spring cloud](https://nacos.io/docs/latest/ecology/use-nacos-with-spring-cloud/)
* [Quick start with kubernetes](https://nacos.io/docs/latest/quickstart/quick-start-kubernetes/)
## Documentation
You can view the full documentation from the [Nacos website](https://nacos.io/docs/latest/overview/).
You can also read this online eBook from the [NACOS ARCHITECTURE & PRINCIPLES](https://nacos.io/docs/ebook/kbyo6n/).
All the latest and long-term notice can also be found here from [GitHub notice issue](https://github.com/alibaba/nacos/labels/notice).
## Contributing
Contributors are welcomed to join Nacos project. Please check [CONTRIBUTING](./CONTRIBUTING.md) about how to contribute to this project.
### How can I contribute?
* Take a look at issues with tags marked [`good first issue`](https://github.com/alibaba/nacos/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) or [`contribution welcome`](https://github.com/alibaba/nacos/issues?q=is%3Aopen+is%3Aissue+label%3A%22contribution+welcome%22).
* Answer questions on [issues](https://github.com/alibaba/nacos/issues).
* Fix bugs reported on [issues](https://github.com/alibaba/nacos/issues), and send us a pull request.
* Review the existing [pull request](https://github.com/alibaba/nacos/pulls).
* Improve the [website](https://github.com/nacos-group/nacos-group.github.io), typically we need
* blog post
* translation on documentation
* use cases around the integration of Nacos in enterprise systems.
## Other Related Project Repositories
* [nacos-spring-project](https://github.com/nacos-group/nacos-spring-project) provides the integration functionality for Spring.
* [nacos-group](https://github.com/nacos-group) is the repository that hosts the eco tools for Nacos, such as SDK, synchronization tool, etc.
* [spring-cloud-alibaba](https://github.com/spring-cloud-incubator/spring-cloud-alibaba) provides the one-stop solution for application development over Alibaba middleware which includes Nacos.
## Contact
* [Gitter](https://gitter.im/alibaba/nacos): Nacos's IM tool for community messaging, collaboration and discovery.
* [Twitter](https://twitter.com/nacos2): Follow along for latest nacos news on Twitter.
* [Weibo](https://weibo.com/u/6574374908): Follow along for latest nacos news on Weibo (Twitter of China version).
* [Nacos Segmentfault](https://segmentfault.com/t/nacos): Get latest notice and prompt help from Segmentfault.
* Email Group:
* users-nacos@googlegroups.com: Nacos usage general discussion.
* dev-nacos@googlegroups.com: Nacos developer discussion (APIs, feature design, etc).
* commits-nacos@googlegroups.com: Commits notice, very high frequency.
* Join us from DingDing(Group 1: 21708933(full), Group 2: 30438813(full), Group 3: 31222241(full), Group 4: 12810027056).
### DingDing Group QR Code

### DingDing MCP Group QR Code

### WeChat Group QR Code

## Enterprise Service
If you need Nacos enterprise service support, or purchase cloud product services, you can join the discussion by scanning the following DingTalk group. It can also be directly activated and used through the microservice engine (MSE) provided by Alibaba Cloud.
https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0
## Download
- [Nacos Official Website](https://nacos.io/download/nacos-server)
- [GitHub Release](https://github.com/alibaba/nacos/releases)
## Who is using
These are only part of the companies using Nacos, for reference only. If you are using Nacos, please [add your company here](https://github.com/alibaba/nacos/issues/273) to tell us your scenario to make Nacos better.
================================================
FILE: REPORTING-BUGS.md
================================================
# How to report bugs
If any part of the Nacos project has bugs or documentation mistakes, please let us know by [opening an issue][Nacos-issue]. We treat bugs and mistakes very seriously and believe no issue is too small, anyone is implement. Before creating a bug report, please check that an issue reporting the same problem does not already exist.
To make the bug report accurate and easy to understand, please try to create bug reports that are:
- Specific. Include as many details as possible: which version, what environment, what configuration, etc. If the bug is related to running the Nacos server, please attach the Nacos log (the starting log with Nacos configuration is especially important).
- Reproducible. Include the steps to reproduce the problem. We understand some issues might be hard to reproduce, please includes the steps that might lead to the problem. If possible, please attach the affected Nacos data dir and stack strace to the bug report.
- Unique. Do not duplicate the existing bug report.
It may be worthwhile to read [Elika Etemad’s article on filing good bug reports][filing-good-bugs] before creating a bug report.
We might ask for further information to locate a bug. A duplicated bug report will be closed.
[etcd-issue]: https://github.com/etcd-io/etcd/issues/new
[filing-good-bugs]: http://fantasai.inkedblade.net/style/talks/filing-good-bugs/
# 如何提交错误报告
如果Nacos项目的任何部分存在问题或文档问题,请通过[opening an issue][Nacos-issue]告诉我们。我们非常认真地对待错误和缺陷,在产品面前没有不重要的问题。不过在创建错误报告之前,请检查是否存在报告相同问题的issues。
为了使错误报告准确且易于理解,请尝试创建以下错误报告:
- 具体到细节。包括尽可能多的细节:哪个版本,什么环境,什么配置等。如果错误与运行Nacos服务器有关,请附加Nacos日志(具有Nacos配置的起始日志尤为重要)。
- 可复现。包括重现问题的步骤。我们理解某些问题可能难以重现,请包括可能导致问题的步骤。如果可能,请将受影响的Nacos数据目录和堆栈strace附加到错误报告中。
- 不重复。不要复制现有的错误报告。
在创建错误报告之前,最好阅读下[Elika Etemad关于提交好错误报告的文章] [归档好错误],相信 会给你启发。
我们可能会要求您提供更多信息以查找错误。将关闭重复的错误报告。
[etcd-issue]:https://github.com/etcd-io/etcd/issues/new
[filing-good-bugs]:http://fantasai.inkedblade.net/style/talks/filing-good-bugs/
================================================
FILE: address/pom.xml
================================================





























































郑州山水
知氏教育
> listAgentVersions(AgentForm agentForm) throws NacosException {
agentForm.validate();
return Result.success(
a2aServerOperationService.listAgentVersions(agentForm.getNamespaceId(), agentForm.getAgentName()));
}
}
================================================
FILE: ai/src/main/java/com/alibaba/nacos/ai/controller/McpAdminController.java
================================================
/*
* Copyright 1999-2025 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.nacos.ai.controller;
import com.alibaba.nacos.ai.constant.Constants;
import com.alibaba.nacos.ai.form.mcp.admin.McpDetailForm;
import com.alibaba.nacos.ai.form.mcp.admin.McpForm;
import com.alibaba.nacos.ai.form.mcp.admin.McpListForm;
import com.alibaba.nacos.ai.form.mcp.admin.McpUpdateForm;
import com.alibaba.nacos.ai.param.McpHttpParamExtractor;
import com.alibaba.nacos.ai.service.McpServerOperationService;
import com.alibaba.nacos.ai.utils.McpRequestUtil;
import com.alibaba.nacos.api.ai.model.mcp.McpEndpointSpec;
import com.alibaba.nacos.api.ai.model.mcp.McpServerBasicInfo;
import com.alibaba.nacos.api.ai.model.mcp.McpServerDetailInfo;
import com.alibaba.nacos.api.ai.model.mcp.McpToolSpecification;
import com.alibaba.nacos.api.annotation.NacosApi;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.exception.api.NacosApiException;
import com.alibaba.nacos.api.model.Page;
import com.alibaba.nacos.api.model.v2.Result;
import com.alibaba.nacos.auth.annotation.Secured;
import com.alibaba.nacos.core.model.form.PageForm;
import com.alibaba.nacos.core.paramcheck.ExtractorManager;
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
import com.alibaba.nacos.plugin.auth.constant.ApiType;
import com.alibaba.nacos.plugin.auth.constant.SignType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Nacos AI MCP controller.
*
* @author xiweng.yy
*/
@NacosApi
@RestController
@RequestMapping(Constants.MCP_ADMIN_PATH)
@ExtractorManager.Extractor(httpExtractor = McpHttpParamExtractor.class)
public class McpAdminController {
private final McpServerOperationService mcpServerOperationService;
public McpAdminController(McpServerOperationService mcpServerOperationService) {
this.mcpServerOperationService = mcpServerOperationService;
}
/**
* List mcp server.
*
* @param mcpListForm list mcp servers request form.
* @param pageForm page info about the request.
* @return mcp server list wrapper with {@link Result}
* @throws NacosApiException if request parameter is invalid or handle error
*/
@GetMapping(value = "/list")
@Secured(action = ActionTypes.READ, signType = SignType.AI, apiType = ApiType.ADMIN_API)
public Result
>() {
});
}
}
================================================
FILE: ai/src/main/java/com/alibaba/nacos/ai/controller/PromptClientController.java
================================================
/*
* Copyright 1999-2026 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.nacos.ai.controller;
import com.alibaba.nacos.ai.constant.Constants;
import com.alibaba.nacos.ai.form.prompt.PromptQueryForm;
import com.alibaba.nacos.ai.param.PromptHttpParamExtractor;
import com.alibaba.nacos.ai.service.prompt.PromptClientOperationService;
import com.alibaba.nacos.api.ai.model.prompt.Prompt;
import com.alibaba.nacos.api.ai.model.prompt.PromptVersionInfo;
import com.alibaba.nacos.api.annotation.NacosApi;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.model.v2.Result;
import com.alibaba.nacos.auth.annotation.Secured;
import com.alibaba.nacos.core.paramcheck.ExtractorManager;
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
import com.alibaba.nacos.plugin.auth.constant.ApiType;
import com.alibaba.nacos.plugin.auth.constant.SignType;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Prompt client controller for prompt runtime read query.
*
* @author nacos
*/
@NacosApi
@RestController
@RequestMapping(Constants.Prompt.CLIENT_PATH)
@ExtractorManager.Extractor(httpExtractor = PromptHttpParamExtractor.class)
public class PromptClientController {
private final PromptClientOperationService promptOperationService;
public PromptClientController(PromptClientOperationService promptOperationService) {
this.promptOperationService = promptOperationService;
}
/**
* Query prompt by label/version/latest with priority label > version > latest.
*/
@GetMapping
@Secured(action = ActionTypes.READ, signType = SignType.AI, apiType = ApiType.OPEN_API)
public Result
*
*
* proxy for {@link ConnectionBasedClientManager}, only listen connection that module `ai`. * The actual implementation is {@link ConnectionBasedClientManager}, *
* * @author xiweng.yy */ @Service public class AiConnectionBasedClientManager extends ClientConnectionEventListener implements ClientManager { private final ConnectionBasedClientManager delegate; public AiConnectionBasedClientManager(ConnectionBasedClientManager connectionBasedClientManager) { this.delegate = connectionBasedClientManager; } @Override public void clientConnected(Connection connect) { // ignore `naming`, `config` and `lock` module connection if (!RemoteConstants.LABEL_MODULE_AI.equals(connect.getMetaInfo().getLabel(RemoteConstants.LABEL_MODULE))) { return; } ClientAttributes attributes = new ClientAttributes(); attributes.addClientAttribute(ClientConstants.CONNECTION_TYPE, connect.getMetaInfo().getConnectType()); attributes.addClientAttribute(ClientConstants.CONNECTION_METADATA, connect.getMetaInfo()); clientConnected(connect.getMetaInfo().getConnectionId(), attributes); } @Override public boolean clientConnected(String clientId, ClientAttributes attributes) { return delegate.clientConnected(clientId, attributes); } @Override public boolean clientConnected(Client client) { return delegate.clientConnected(client); } @Override public boolean syncClientConnected(String clientId, ClientAttributes attributes) { return delegate.syncClientConnected(clientId, attributes); } @Override public void clientDisConnected(Connection connect) { // ignore `naming`, `config` and `lock` module connection if (!RemoteConstants.LABEL_MODULE_AI.equals(connect.getMetaInfo().getLabel(RemoteConstants.LABEL_MODULE))) { return; } clientDisconnected(connect.getMetaInfo().getConnectionId()); } @Override public boolean clientDisconnected(String clientId) { return delegate.clientDisconnected(clientId); } @Override public Client getClient(String clientId) { return delegate.getClient(clientId); } @Override public boolean contains(String clientId) { return delegate.contains(clientId); } @Override public CollectionIf type is REF, directly return service
*If service not exist, do create new service and register instance, then return service
*If service exist, only do register instance, then return service
* * @param namespaceId namespace id of mcp server * @param mcpName name of mcp server * @param endpointSpecification mcp server endpoint specification, see {@link McpEndpointSpec} * @param overrideExisting if replace all the instances when update the mcp server * @return {@link Service} * @throws NacosException any exception during handling */ public Service createMcpServerEndpointServiceIfNecessary(String namespaceId, String mcpName, String version, McpEndpointSpec endpointSpecification, boolean overrideExisting) throws NacosException { if (AiConstants.Mcp.MCP_ENDPOINT_TYPE_REF.equalsIgnoreCase(endpointSpecification.getType())) { MapIf service not exist, return directly
*If service exist and service is ref, return directly
*If service exist and service is direct, do deregister instance and remove service
* * @param namespaceId namespace id of mcp server * @param mcpServerName name of mcp server * @throws NacosException any exception during handling */ public void deleteMcpServerEndpointService(String namespaceId, String mcpServerName) throws NacosException { Service service = Service.newService(namespaceId, Constants.MCP_SERVER_ENDPOINT_GROUP, mcpServerName); if (isNotExist(service) || !isMcpDirectService(service)) { return; } ListAdapt the External data(mcp server json file, mcp registry api data) to Nacos MCP server format * {@link McpServerDetailInfo}. MCP official formats docs.
* *1. MCP Server format is defined in * * server.schema.json.
* *2. MCP Registry Api is defined in * * openapi.yaml.
* * @author nacos */ @Service public class McpExternalDataAdaptor { private HttpClient httpClient; private static final String CURSOR_QUERY_NAME = "cursor"; private static final String LIMIT_QUERY_NAME = "limit"; private static final String SEARCH_QUERY_NAME = "search"; private static final String HEADER_ACCEPT = "Accept"; private static final String HEADER_ACCEPT_JSON = "application/json"; private static final String QUERY_MARK = "?"; private static final String AMPERSAND = "&"; private static final int HTTP_STATUS_SUCCESS_MIN = 200; private static final int HTTP_STATUS_SUCCESS_MAX = 299; private static final int CONNECT_TIMEOUT_SECONDS = 10; private static final int READ_TIMEOUT_SECONDS = 20; private static final int FETCH_ALL_LIMIT_MARK = -1; /** * Safety guard to avoid infinite loops when server keeps returning cursors. * Limits the maximum number of pages iterated when fetching from URL. */ private static final int MAX_PAGES_GUARD = 200; /** * Adapt the external data to Nacos MCP server format. * * @param request import request * @return Nacos MCP server format * @throws Exception if adapt failed */ public ListThis service listens to ConfigDataChangeEvent and invalidates MCP server cache * when MCP-related configurations are deleted or modified. The implementation follows * the same pattern as AsyncNotifyService for configuration synchronization.
* * @author xinluo */ @Service public class McpServerCacheInvalidateService extends SubscriberMCP server configurations follow these naming patterns:
*This method is idempotent - calling it multiple times with the same * serverId will not cause any side effects.
* * @param namespaceId namespace ID * @param serverId MCP server ID */ private void invalidateCache(String namespaceId, String serverId) { try { // Clear cache by server ID mcpServerIndex.removeMcpServerById(serverId); LOGGER.info("MCP Server cache invalidated successfully: namespaceId={}, serverId={}", namespaceId, serverId); } catch (Exception e) { // Cache invalidation failure should not affect configuration deletion LOGGER.error("Failed to invalidate MCP Server cache: namespaceId={}, serverId={}, error={}", namespaceId, serverId, e.getMessage(), e); } } @Override public void onEvent(LocalDataChangeEvent event) { handleConfigDataChangeEvent(event); } @Override public Class extends Event> subscribeType() { return LocalDataChangeEvent.class; } } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/service/McpServerImportService.java ================================================ /* * Copyright 1999-2021 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.service; import com.alibaba.nacos.ai.constant.McpServerValidationConstants; import com.alibaba.nacos.ai.enums.ExternalDataTypeEnum; import com.alibaba.nacos.ai.enums.McpImportResultStatusEnum; import com.alibaba.nacos.ai.index.McpCacheIndex; import com.alibaba.nacos.ai.model.mcp.McpServerIndexData; import com.alibaba.nacos.ai.utils.McpConfigUtils; import com.alibaba.nacos.api.ai.constant.AiConstants; import com.alibaba.nacos.api.ai.model.mcp.FrontEndpointConfig; import com.alibaba.nacos.api.ai.model.mcp.McpEndpointSpec; import com.alibaba.nacos.api.ai.model.mcp.McpServerBasicInfo; import com.alibaba.nacos.api.ai.model.mcp.McpServerDetailInfo; import com.alibaba.nacos.api.ai.model.mcp.McpServerImportRequest; import com.alibaba.nacos.api.ai.model.mcp.McpServerImportResponse; import com.alibaba.nacos.api.ai.model.mcp.McpServerImportResult; import com.alibaba.nacos.api.ai.model.mcp.McpServerImportValidationResult; import com.alibaba.nacos.api.ai.model.mcp.McpServerValidationItem; import com.alibaba.nacos.api.ai.model.mcp.McpToolSpecification; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.common.utils.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** * MCP Server Import Service. * Handles the import logic for MCP servers from various sources. * * @author WangzJi */ @Service public class McpServerImportService { private final McpCacheIndex mcpCacheIndex; private static final Logger LOG = LoggerFactory.getLogger(McpServerImportService.class); private final McpExternalDataAdaptor transformService; private final McpServerValidationService validationService; private final McpServerOperationService operationService; public McpServerImportService(McpExternalDataAdaptor transformService, McpServerValidationService validationService, McpServerOperationService operationService, McpCacheIndex mcpCacheIndex) { this.transformService = transformService; this.validationService = validationService; this.operationService = operationService; this.mcpCacheIndex = mcpCacheIndex; } /** * Validate servers for import. * * @param namespaceId namespace ID * @param request import request * @return validation result * @throws NacosException if validation fails */ public McpServerImportValidationResult validateImport(String namespaceId, McpServerImportRequest request) throws NacosException { ExternalDataTypeEnum externalDataTypeEnum = ExternalDataTypeEnum.parseType(request.getImportType()); if (Objects.isNull(externalDataTypeEnum)) { throw new NacosException(NacosException.INVALID_PARAM, "Invalid import type: " + request.getImportType()); } try { ListOnly keep first item in frontEndpointConfigList for endpoint spec generation.
* * @param server server detail info * @return endpoint spec, null if not convert is not supported. */ private McpEndpointSpec generateEndpointSpec(McpServerDetailInfo server) { if (AiConstants.Mcp.MCP_PROTOCOL_STDIO.equals(server.getProtocol())) { return null; } if (server.getRemoteServerConfig() == null || CollectionUtils.isEmpty(server.getRemoteServerConfig().getFrontEndpointConfigList())) { return null; } try { FrontEndpointConfig first = server.getRemoteServerConfig() .getFrontEndpointConfigList() .get(0); return McpConfigUtils.convertFrontEndpointConfig(first); } catch (Exception e) { LOG.error("Failed to convert to endpoint spec", e); throw new RuntimeException("Failed to convert to endpoint spec", e); } } } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/service/McpServerOperationService.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.service; import com.alibaba.nacos.ai.constant.Constants; import com.alibaba.nacos.ai.index.McpServerIndex; import com.alibaba.nacos.ai.model.mcp.McpServerIndexData; import com.alibaba.nacos.ai.model.mcp.McpServerStorageInfo; import com.alibaba.nacos.ai.utils.McpConfigUtils; import com.alibaba.nacos.ai.utils.McpRequestUtil; import com.alibaba.nacos.api.ai.constant.AiConstants; import com.alibaba.nacos.api.ai.model.mcp.FrontEndpointConfig; import com.alibaba.nacos.api.ai.model.mcp.McpCapability; import com.alibaba.nacos.api.ai.model.mcp.McpEndpointInfo; import com.alibaba.nacos.api.ai.model.mcp.McpEndpointSpec; import com.alibaba.nacos.api.ai.model.mcp.McpServerBasicInfo; import com.alibaba.nacos.api.ai.model.mcp.McpServerDetailInfo; import com.alibaba.nacos.api.ai.model.mcp.McpServerVersionInfo; import com.alibaba.nacos.api.ai.model.mcp.McpServiceRef; import com.alibaba.nacos.api.ai.model.mcp.McpToolSpecification; import com.alibaba.nacos.api.ai.model.mcp.registry.KeyValueInput; import com.alibaba.nacos.api.ai.model.mcp.registry.ServerVersionDetail; import com.alibaba.nacos.api.config.ConfigType; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.api.NacosApiException; import com.alibaba.nacos.api.model.Page; import com.alibaba.nacos.api.model.v2.ErrorCode; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.common.utils.CollectionUtils; import com.alibaba.nacos.common.utils.InternetAddressUtil; import com.alibaba.nacos.common.utils.JacksonUtils; import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.config.server.model.ConfigRequestInfo; import com.alibaba.nacos.config.server.model.form.ConfigForm; import com.alibaba.nacos.config.server.model.form.ConfigFormV3; import com.alibaba.nacos.config.server.service.ConfigOperationService; import com.alibaba.nacos.config.server.service.query.ConfigQueryChainService; import com.alibaba.nacos.config.server.service.query.model.ConfigQueryChainRequest; import com.alibaba.nacos.config.server.service.query.model.ConfigQueryChainResponse; import com.alibaba.nacos.naming.core.v2.pojo.Service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import static com.alibaba.nacos.ai.constant.Constants.MCP_SERVER_CONFIG_MARK; import static com.alibaba.nacos.ai.utils.McpConfigUtils.buildMcpServerVersionConfigTags; /** * Nacos AI MCP server operation service. Currently, mcp server is present by there configs: 1. mcp server version info * {@link McpServerVersionInfo} 2. mcp server description for specified version {@link McpServerDetailInfo} 3. mcp tools * info {@link McpToolSpecification} when create the mcp server, we will tag the {@link McpServerVersionInfo} with mcp * servername for name fuzzy search. * * @author xiweng.yy */ @org.springframework.stereotype.Service public class McpServerOperationService { private static final Logger LOGGER = LoggerFactory.getLogger(McpServerOperationService.class); private final ConfigQueryChainService configQueryChainService; private final ConfigOperationService configOperationService; private final McpToolOperationService toolOperationService; private final McpEndpointOperationService endpointOperationService; private final McpServerIndex mcpServerIndex; private final SyncEffectService syncEffectService; public McpServerOperationService(ConfigQueryChainService configQueryChainService, ConfigOperationService configOperationService, McpToolOperationService toolOperationService, McpEndpointOperationService endpointOperationService, McpServerIndex mcpServerIndex, SyncEffectService syncEffectService) { this.configQueryChainService = configQueryChainService; this.configOperationService = configOperationService; this.toolOperationService = toolOperationService; this.endpointOperationService = endpointOperationService; this.mcpServerIndex = mcpServerIndex; this.syncEffectService = syncEffectService; } /** * List mcp server. * * @param namespaceId namespace id of mcp servers * @param mcpName mcp name pattern, if null or empty, filter all mcp servers. * @param search search type `blur` or `accurate`, means whether to search by fuzzy or exact match by * `mcpName`. * @param pageNo page number, start from 1 * @param pageSize page size each page * @return list of {@link McpServerBasicInfo} matched input parameters. */ public Page* `namespaceId` and `mcpServerId` can't be changed. *
* * @param namespaceId namespace id of mcp server, used to mark which mcp server to update * @param serverSpecification mcp server specification, see {@link McpServerBasicInfo} * @param toolSpecification mcp server included tools, see {@link McpToolSpecification}, optional * @param endpointSpecification mcp server endpoint specification, see {@link McpEndpointSpec}, optional * @param overrideExisting if replace all the instances when update the mcp server * @throws NacosException any exception during handling */ public void updateMcpServer(String namespaceId, boolean isPublish, McpServerBasicInfo serverSpecification, McpToolSpecification toolSpecification, McpEndpointSpec endpointSpecification, boolean overrideExisting) throws NacosException { String mcpServerId = serverSpecification.getId(); mcpServerId = resolveMcpServerId(namespaceId, serverSpecification.getName(), mcpServerId); if (StringUtils.isEmpty(serverSpecification.getId())) { serverSpecification.setId(mcpServerId); } ServerVersionDetail versionDetail = serverSpecification.getVersionDetail(); if (null == versionDetail && StringUtils.isNotBlank(serverSpecification.getVersion())) { versionDetail = new ServerVersionDetail(); versionDetail.setVersion(serverSpecification.getVersion()); serverSpecification.setVersionDetail(versionDetail); } if (Objects.isNull(versionDetail) || StringUtils.isEmpty(versionDetail.getVersion())) { throw new NacosApiException(NacosApiException.INVALID_PARAM, ErrorCode.PARAMETER_VALIDATE_ERROR, "Version must be specified in parameter `serverSpecification`"); } final McpServerVersionInfo mcpServerVersionInfo = getMcpServerVersionInfo(namespaceId, mcpServerId); String updateVersion = versionDetail.getVersion(); McpServerStorageInfo newSpecification = new McpServerStorageInfo(); BeanUtils.copyProperties(serverSpecification, newSpecification); injectToolAndEndpoint(namespaceId, mcpServerId, newSpecification, toolSpecification, endpointSpecification, overrideExisting); ConfigForm configForm = buildMcpConfigForm(namespaceId, mcpServerId, updateVersion, newSpecification); configOperationService.publishConfig(configForm, new ConfigRequestInfo(), null); List* This implementation is a very simple one. The best expected one is listen * {@link com.alibaba.nacos.config.server.model.event.LocalDataChangeEvent} and then do async to sync by * {@link java.util.concurrent.CountDownLatch} or {@link java.util.concurrent.Future} *
* * @author xiweng.yy */ @Service public class SimpleSyncEffectService implements SyncEffectService { @Override public void toSync(ConfigForm configForm, long startTimeStamp, long timeout, TimeUnit timeUnit) { try { Thread.sleep(timeout); } catch (InterruptedException ignored) { } } } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/service/SyncEffectService.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.service; import com.alibaba.nacos.config.server.model.form.ConfigForm; import java.util.concurrent.TimeUnit; /** * Nacos Mcp server async effect service. * ** Nacos Mcp server or Agent will be written to Nacos configuration, and the configuration dump to local is async and need time. * This service is used to adapt and transfer async dump to sync dump. *
* * @author xiweng.yy */ public interface SyncEffectService { /** * Transfer Async mcp server operation to sync with 200 milliseconds timeout. * * @param configForm mcp server configuration changed form * @param startTimeStamp start time of operation mcp server. */ default void toSync(ConfigForm configForm, long startTimeStamp) { toSync(configForm, startTimeStamp, 200L, TimeUnit.MILLISECONDS); } /** * Transfer Async mcp server operation to sync. * * @param configForm mcp server configuration changed form * @param startTimeStamp start time of operation mcp server. * @param timeout max time wait for operation mcp server. * @param timeUnit the time unit for timeout */ void toSync(ConfigForm configForm, long startTimeStamp, long timeout, TimeUnit timeUnit); } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/service/a2a/A2aServerOperationService.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.service.a2a; import com.alibaba.nacos.ai.constant.Constants; import com.alibaba.nacos.ai.service.SyncEffectService; import com.alibaba.nacos.ai.service.a2a.identity.AgentIdCodecHolder; import com.alibaba.nacos.ai.utils.AgentCardUtil; import com.alibaba.nacos.api.ai.constant.AiConstants; import com.alibaba.nacos.api.ai.model.a2a.AgentCard; import com.alibaba.nacos.api.ai.model.a2a.AgentCardDetailInfo; import com.alibaba.nacos.api.ai.model.a2a.AgentCardVersionInfo; import com.alibaba.nacos.api.ai.model.a2a.AgentInterface; import com.alibaba.nacos.api.ai.model.a2a.AgentVersionDetail; import com.alibaba.nacos.api.config.ConfigType; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.api.NacosApiException; import com.alibaba.nacos.api.model.Page; import com.alibaba.nacos.api.model.v2.ErrorCode; import com.alibaba.nacos.api.naming.pojo.ServiceInfo; import com.alibaba.nacos.common.utils.JacksonUtils; import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.config.server.exception.ConfigAlreadyExistsException; import com.alibaba.nacos.config.server.model.ConfigInfo; import com.alibaba.nacos.config.server.model.ConfigRequestInfo; import com.alibaba.nacos.config.server.model.form.ConfigForm; import com.alibaba.nacos.config.server.service.ConfigDetailService; import com.alibaba.nacos.config.server.service.ConfigOperationService; import com.alibaba.nacos.config.server.service.query.ConfigQueryChainService; import com.alibaba.nacos.config.server.service.query.model.ConfigQueryChainRequest; import com.alibaba.nacos.config.server.service.query.model.ConfigQueryChainResponse; import com.alibaba.nacos.naming.core.v2.index.ServiceStorage; import com.alibaba.nacos.naming.core.v2.pojo.Service; import org.springframework.beans.BeanUtils; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import static com.alibaba.nacos.ai.constant.Constants.A2A.AGENT_GROUP; import static com.alibaba.nacos.ai.constant.Constants.A2A.AGENT_VERSION_GROUP; /** * A2a server operation service. * * @author KiteSoar */ @org.springframework.stereotype.Service public class A2aServerOperationService { private final ConfigQueryChainService configQueryChainService; private final ConfigOperationService configOperationService; private final ConfigDetailService configDetailService; private final SyncEffectService syncEffectService; private final ServiceStorage serviceStorage; private final AgentIdCodecHolder agentIdCodecHolder; public A2aServerOperationService(ConfigQueryChainService configQueryChainService, ConfigOperationService configOperationService, ConfigDetailService configDetailService, SyncEffectService syncEffectService, ServiceStorage serviceStorage, AgentIdCodecHolder agentIdCodecHolder) { this.configQueryChainService = configQueryChainService; this.configOperationService = configOperationService; this.configDetailService = configDetailService; this.syncEffectService = syncEffectService; this.serviceStorage = serviceStorage; this.agentIdCodecHolder = agentIdCodecHolder; } /** * Register agent. * * @param agentCard agent card * @throws NacosException nacos exception */ public void registerAgent(AgentCard agentCard, String namespaceId, String registrationType) throws NacosException { try { // 1. register agent's info AgentCardVersionInfo agentCardVersionInfo = AgentCardUtil.buildAgentCardVersionInfo(agentCard, registrationType, true); ConfigForm configForm = transferVersionInfoToConfigForm(agentCardVersionInfo, namespaceId); ConfigRequestInfo versionConfigRequest = new ConfigRequestInfo(); versionConfigRequest.setUpdateForExist(Boolean.FALSE); configOperationService.publishConfig(configForm, versionConfigRequest, null); // 2. register agent's version info AgentCardDetailInfo agentCardDetailInfo = AgentCardUtil.buildAgentCardDetailInfo(agentCard, registrationType); ConfigForm configFormVersion = transferAgentInfoToConfigForm(agentCardDetailInfo, namespaceId); ConfigRequestInfo agentCardConfigRequest = new ConfigRequestInfo(); agentCardConfigRequest.setUpdateForExist(Boolean.FALSE); long startOperationTime = System.currentTimeMillis(); configOperationService.publishConfig(configFormVersion, agentCardConfigRequest, null); syncEffectService.toSync(configFormVersion, startOperationTime); } catch (ConfigAlreadyExistsException e) { throw new NacosApiException(NacosException.CONFLICT, ErrorCode.RESOURCE_CONFLICT, String.format("AgentCard name %s already exist", agentCard.getName())); } } /** * Delete agent. * * @param namespaceId namespaceId of agent * @param agentName agent name * @param version target version of want to delete, if is null or empty, delete all versions * @throws NacosException nacos exception */ public void deleteAgent(String namespaceId, String agentName, String version) throws NacosException { String encodedName = agentIdCodecHolder.encode(agentName); ConfigQueryChainRequest request = ConfigQueryChainRequest.buildConfigQueryChainRequest(encodedName, AGENT_GROUP, namespaceId); ConfigQueryChainResponse response = configQueryChainService.handle(request); if (response.getStatus() == ConfigQueryChainResponse.ConfigQueryStatus.CONFIG_NOT_FOUND) { return; } AgentCardVersionInfo agentCardVersionInfo = JacksonUtils.toObj(response.getContent(), AgentCardVersionInfo.class); List* Agent and AgentCard allow user custom agent name without limit for now, but no limit means out of control and might cause un-expected behavior. * So when storage in Nacos, it should be match some word limits. * We need to encode and decode agent name as the identity to do storage. *
* * @author xiweng.yy */ public interface AgentIdCodec { /** * Encode agent name to identity. * * @param agentName agent name * @return identity encoded from agent name */ String encode(String agentName); /** * Encode agent name to identity for search, which means only do encode value without any prefix and suffix, used to do blur search. * * @param agentName agent name * @return identity encoded from agent name */ String encodeForSearch(String agentName); /** * Decode agent id to agent name. * * @param agentId agent identity * @return agent name */ String decode(String agentId); } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/service/a2a/identity/AgentIdCodecHolder.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.service.a2a.identity; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; /** * The Holder of {@link AgentIdCodec}. * * @author xiweng.yy */ @Component public class AgentIdCodecHolder { private final AgentIdCodec agentIdCodec; public AgentIdCodecHolder(ObjectProvider* Only consider show-able ASCII code from 32(x20) to 126(x7E). *
* * @author xiweng.yy */ public class AsciiAgentIdCodec implements AgentIdCodec { private static final String ENCODE_PREFIX = "____:"; private static final char ENCODE_MARK_CHAR = '_'; /** * Come From {@link ParamUtils#validChars} and remove {@link #ENCODE_MARK_CHAR}. */ private static final SetOnly support MCP_ENDPOINT_TYPE_DIRECT type.
* @param frontEndpointConfig front endpoint config * @return mcp endpoint spec * @throws IllegalArgumentException if convert failed */ public static McpEndpointSpec convertFrontEndpointConfig(FrontEndpointConfig frontEndpointConfig) { Object epDataObj = frontEndpointConfig.getEndpointData(); String epData = (String) epDataObj; McpEndpointSpec endpointSpec = new McpEndpointSpec(); String[] hp = epData.split(MCP_ENDPOINT_CONFIG_DIRECT_SPLIT); if (hp.length != MCP_ENDPOINT_SPEC_PORT_KEY_LENGTH) { throw new IllegalArgumentException("Invalid endpoint data: " + epData); } endpointSpec.setType(AiConstants.Mcp.MCP_ENDPOINT_TYPE_DIRECT); endpointSpec.getData().put(MCP_ENDPOINT_SPEC_ADDRESS_KEY, hp[0]); endpointSpec.getData().put(MCP_ENDPOINT_SPEC_PORT_KEY, hp[1]); endpointSpec.getData().put(Constants.MCP_BACKEND_INSTANCE_PROTOCOL_KEY, frontEndpointConfig.getProtocol()); return endpointSpec; } } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/utils/McpRequestUtil.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.utils; import com.alibaba.nacos.ai.form.mcp.admin.McpDetailForm; import com.alibaba.nacos.api.ai.constant.AiConstants; import com.alibaba.nacos.api.ai.model.mcp.McpEndpointSpec; import com.alibaba.nacos.api.ai.model.mcp.McpServerBasicInfo; import com.alibaba.nacos.api.ai.model.mcp.McpServiceRef; import com.alibaba.nacos.api.ai.model.mcp.McpTool; import com.alibaba.nacos.api.ai.model.mcp.McpToolSpecification; import com.alibaba.nacos.api.ai.remote.request.AbstractMcpRequest; import com.alibaba.nacos.api.exception.api.NacosApiException; import com.alibaba.nacos.api.exception.runtime.NacosDeserializationException; import com.alibaba.nacos.api.model.v2.ErrorCode; import com.alibaba.nacos.common.utils.JacksonUtils; import com.alibaba.nacos.common.utils.StringUtils; import com.fasterxml.jackson.core.type.TypeReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; /** * MCP request util. * * @author xiweng.yy */ public class McpRequestUtil { private static final Logger LOGGER = LoggerFactory.getLogger(McpRequestUtil.class); /** * Parse Mcp detail request form to {@link McpServerBasicInfo}. * * @param mcpForm mcp detail request. * @return mcp server basic info. * @throws NacosApiException if parse failed or request parameter is conflicted. */ public static McpServerBasicInfo parseMcpServerBasicInfo(McpDetailForm mcpForm) throws NacosApiException { McpServerBasicInfo result = McpRequestUtil.deserializeSpec(mcpForm.getServerSpecification(), new TypeReference<>() { }); if (StringUtils.isEmpty(result.getName())) { result.setName(mcpForm.getMcpName()); } return result; } /** * Parse Mcp tools request form to {@link McpTool}. * * @param mcpForm mcp detail request. * @return mcp server tool info * @throws NacosApiException if parse failed. */ public static McpToolSpecification parseMcpTools(McpDetailForm mcpForm) throws NacosApiException { if (StringUtils.isBlank(mcpForm.getToolSpecification())) { return null; } return McpRequestUtil.deserializeSpec(mcpForm.getToolSpecification(), new TypeReference<>() { }); } /** * Parse Mcp endpoint request form to {@link McpEndpointSpec}. * * @param basicInfo mcp server basic info * @param mcpForm mcp detail request. * @return mcp server endpoint info * @throws NacosApiException if parse failed or request parameter is conflicted. */ public static McpEndpointSpec parseMcpEndpointSpec(McpServerBasicInfo basicInfo, McpDetailForm mcpForm) throws NacosApiException { if (AiConstants.Mcp.MCP_PROTOCOL_STDIO.equalsIgnoreCase(basicInfo.getProtocol())) { return null; } if (StringUtils.isBlank(mcpForm.getEndpointSpecification())) { throw new NacosApiException(NacosApiException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING, "request parameter `endpointSpecification` is required if mcp server type not `local`."); } return McpRequestUtil.deserializeSpec(mcpForm.getEndpointSpecification(), new TypeReference<>() { }); } /** * Deserialize spec from json request. * * @param spec spec json string. * @param typeReference the type of spec. * @paramVersion format: major.minor.patch (e.g., "1.0.0", "2.1.3")
* * @author nacos */ public class PromptVersionUtils { /** * Version pattern: a.b.c where a, b, c are non-negative integers. */ private static final Pattern VERSION_PATTERN = Pattern.compile("^\\d+\\.\\d+\\.\\d+$"); /** * Number of parts in semantic version (major.minor.patch). */ private static final int VERSION_PARTS_COUNT = 3; /** * JSON file extension suffix. */ private static final String JSON_SUFFIX = ".json"; private PromptVersionUtils() { } /** * Validate version format. * * @param version version string * @return true if version is valid (a.b.c format) */ public static boolean isValidVersion(String version) { if (StringUtils.isBlank(version)) { return false; } return VERSION_PATTERN.matcher(version).matches(); } /** * Compare two versions. * * @param version1 first version * @param version2 second version * @return positive if version1 > version2, negative if version1 < version2, 0 if equal * @throws IllegalArgumentException if version format is invalid */ public static int compareVersion(String version1, String version2) { if (!isValidVersion(version1)) { throw new IllegalArgumentException("Invalid version format: " + version1); } if (!isValidVersion(version2)) { throw new IllegalArgumentException("Invalid version format: " + version2); } String[] parts1 = version1.split("\\."); String[] parts2 = version2.split("\\."); for (int i = 0; i < VERSION_PARTS_COUNT; i++) { int num1 = Integer.parseInt(parts1[i]); int num2 = Integer.parseInt(parts2[i]); if (num1 != num2) { return num1 - num2; } } return 0; } /** * Check if newVersion is greater than currentVersion. * * @param newVersion new version to publish * @param currentVersion current version (can be null or empty for first publish) * @return true if newVersion > currentVersion, or currentVersion is null/empty */ public static boolean isVersionGreater(String newVersion, String currentVersion) { if (!isValidVersion(newVersion)) { return false; } if (StringUtils.isBlank(currentVersion)) { // First publish, any valid version is allowed return true; } if (!isValidVersion(currentVersion)) { // Current version is invalid, allow override return true; } return compareVersion(newVersion, currentVersion) > 0; } /** * Build dataId from promptKey. * * @param promptKey prompt key * @return dataId (promptKey.json) */ public static String buildDataId(String promptKey) { return promptKey + JSON_SUFFIX; } /** * Extract promptKey from dataId. * * @param dataId dataId * @return promptKey */ public static String extractPromptKey(String dataId) { if (StringUtils.isBlank(dataId)) { return null; } if (dataId.endsWith(JSON_SUFFIX)) { return dataId.substring(0, dataId.length() - JSON_SUFFIX.length()); } return dataId; } } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/utils/SkillRequestUtil.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.utils; import com.alibaba.nacos.ai.constant.Constants; import com.alibaba.nacos.ai.form.skills.admin.SkillDetailForm; import com.alibaba.nacos.api.ai.model.skills.Skill; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.api.NacosApiException; import com.alibaba.nacos.api.exception.runtime.NacosDeserializationException; import com.alibaba.nacos.api.model.v2.ErrorCode; import com.alibaba.nacos.common.utils.JacksonUtils; import com.alibaba.nacos.common.utils.StringUtils; import com.fasterxml.jackson.core.type.TypeReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; /** * Skill request util. * * @author nacos */ public class SkillRequestUtil { private static final Logger LOGGER = LoggerFactory.getLogger(SkillRequestUtil.class); /** * Parse Skill request form to {@link Skill}. * * @param skillDetailForm skill detail form. * @return skill * @throws NacosApiException if parse failed or request parameter is conflicted. */ public static Skill parseSkill(SkillDetailForm skillDetailForm) throws NacosApiException { try { Skill result = JacksonUtils.toObj(skillDetailForm.getSkillCard(), new TypeReference<>() { }); validateSkill(result); return result; } catch (NacosDeserializationException e) { LOGGER.error(String.format("Deserialize %s from %s failed, ", Skill.class.getSimpleName(), skillDetailForm.getSkillCard()), e); throw new NacosApiException(NacosApiException.INVALID_PARAM, ErrorCode.PARAMETER_VALIDATE_ERROR, "skillCard is invalid. Can't be parsed."); } } /** * Validate skill is legal. * * @param skill skill * @throws NacosApiException if skill is illegal. */ public static void validateSkill(Skill skill) throws NacosApiException { validateSkillField("name", skill.getName()); validateSkillField("description", skill.getDescription()); validateSkillField("instruction", skill.getInstruction()); } private static void validateSkillField(String fieldName, String fieldValue) throws NacosApiException { if (StringUtils.isEmpty(fieldValue)) { throw new NacosApiException(NacosApiException.INVALID_PARAM, ErrorCode.PARAMETER_MISSING, "Required parameter `skillCard." + fieldName + "` not present"); } } /** * Validate uploaded skill zip file and extract bytes. * *Validates the file is not null/empty, checks file size against the maximum limit, * and extracts the file bytes. This method is shared by both admin and console upload endpoints.
* * @param file the uploaded multipart file * @return the file bytes * @throws NacosException if validation fails or file reading fails */ public static byte[] validateAndExtractZipBytes(MultipartFile file) throws NacosException { if (file == null || file.isEmpty()) { throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.DATA_EMPTY, "File is required"); } if (file.getSize() > Constants.Skills.MAX_UPLOAD_ZIP_BYTES) { throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.PARAMETER_VALIDATE_ERROR, "Skill zip size must not exceed " + (Constants.Skills.MAX_UPLOAD_ZIP_BYTES / 1024 / 1024) + "MB, current: " + (file.getSize() / 1024 / 1024) + "MB"); } try { return file.getBytes(); } catch (IOException e) { throw new NacosApiException(NacosException.SERVER_ERROR, ErrorCode.PARSING_DATA_FAILED, "Failed to read file: " + e.getMessage()); } } } ================================================ FILE: ai/src/main/java/com/alibaba/nacos/ai/utils/SkillZipParser.java ================================================ /* * Copyright 1999-2025 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.nacos.ai.utils; import com.alibaba.nacos.ai.constant.Constants; import com.alibaba.nacos.api.ai.model.skills.Skill; import com.alibaba.nacos.api.ai.model.skills.SkillResource; import com.alibaba.nacos.api.ai.model.skills.SkillUtils; import com.alibaba.nacos.api.exception.api.NacosApiException; import com.alibaba.nacos.api.model.v2.ErrorCode; import com.alibaba.nacos.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; /** * Skill zip parser utility. Supports both text and binary resources: * text files are stored as UTF-8; binary files (e.g. .ttf, .png) are stored as Base64 with metadata encoding=base64. * * @author nacos */ public class SkillZipParser { private static final Logger LOGGER = LoggerFactory.getLogger(SkillZipParser.class); private static final String SKILL_MD_FILE = "SKILL.md"; /** UTF-8 BOM character that some editors prepend to files. Must be stripped before parsing. */ private static final char UTF8_BOM = '\uFEFF'; /** macOS AppleDouble/resource fork metadata file prefix (e.g. ._LICENSE.txt). Should be excluded from skill zip. */ private static final String MACOS_METADATA_PREFIX = "._"; private static final String INSTRUCTIONS_HEADER_WITH_SPACE = "## Instructions"; private static final String INSTRUCTIONS_HEADER_NO_SPACE = "##Instructions"; private static final String DOUBLE_QUOTE = "\""; private static final String SINGLE_QUOTE = "'"; private static final String DOUBLE_SINGLE_QUOTE = "''"; private static final String BACKSLASH = "\\"; private static final String DOUBLE_BACKSLASH = "\\\\"; private static final String ESCAPED_DOUBLE_QUOTE = "\\\""; private static final String SLASH = "/"; private static final String DOT = "."; /** Metadata key for binary resources: value "base64" means content is Base64-encoded. */ private static final String METADATA_ENCODING = "encoding"; private static final String METADATA_ENCODING_BASE64 = "base64"; /** File extensions treated as binary; content will be stored as Base64. */ private static final Set修复说明:
* 1. 使用EFFECTIVE_KEY_COUNT限制实际使用的键数量,避免超出缓存容量 2. 在并发更新测试中,80%操作更新现有键,20%操作创建新键,更真实地模拟实际场景 3.
* 确保生成的键数量在合理范围内,避免频繁的缓存替换和内存压力
*/
private static void testConcurrentPerformance() {
System.out.println("\n=== 并发性能测试 ===");
MemoryMcpCacheIndex cacheIndex = new MemoryMcpCacheIndex(createTestProperties(CACHE_SIZE, 3600, 300));
// 预热缓存 - 使用有效键数量,避免超出缓存容量
System.out.println("预热缓存...");
for (int i = 0; i < EFFECTIVE_KEY_COUNT; i++) {
String namespaceId = "namespace-" + (i % 10);
String mcpName = "mcp-" + i;
String mcpId = "id-" + i;
cacheIndex.updateIndex(namespaceId, mcpName, mcpId);
}
// 并发查询测试
System.out.printf("启动 %d 个线程进行并发查询测试...\n", THREAD_COUNT);
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
CountDownLatch latch = new CountDownLatch(THREAD_COUNT);
AtomicLong totalOperations = new AtomicLong(0);
long startTime = System.nanoTime();
for (int t = 0; t < THREAD_COUNT; t++) {
final int threadId = t;
executor.submit(() -> {
try {
for (int i = 0; i < OPERATION_COUNT; i++) {
String namespaceId = "namespace-" + (threadId % 10);
String mcpName = "mcp-" + (i % EFFECTIVE_KEY_COUNT);
cacheIndex.getMcpId(namespaceId, mcpName);
totalOperations.incrementAndGet();
}
} finally {
latch.countDown();
}
});
}
try {
latch.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
long endTime = System.nanoTime();
long duration = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);
System.out.printf("并发查询 %d 次操作耗时: %d ms\n", totalOperations.get(), duration);
System.out.printf("平均每次查询耗时: %.2f μs\n", (duration * 1000.0) / totalOperations.get());
System.out.printf("吞吐量: %.2f ops/ms\n", (double) totalOperations.get() / duration);
// 并发更新测试
System.out.printf("启动 %d 个线程进行并发更新测试...\n", THREAD_COUNT);
CountDownLatch updateLatch = new CountDownLatch(THREAD_COUNT);
AtomicLong totalUpdates = new AtomicLong(0);
startTime = System.nanoTime();
for (int t = 0; t < THREAD_COUNT; t++) {
final int threadId = t;
executor.submit(() -> {
try {
for (int i = 0; i < OPERATION_COUNT; i++) {
String namespaceId = "namespace-" + (threadId % 10);
// 使用模运算确保键的数量在有效范围内,模拟真实的缓存更新场景
// 80%的操作更新现有键,20%的操作创建新键(在有效范围内)
int keyIndex;
if (i % 5 == 0) {
// 20%的操作:创建新键(在有效范围内)
keyIndex = (threadId * 50 + i) % EFFECTIVE_KEY_COUNT;
} else {
// 80%的操作:更新现有键
keyIndex = i % EFFECTIVE_KEY_COUNT;
}
String mcpName = "mcp-" + keyIndex;
String mcpId = "id-" + keyIndex;
cacheIndex.updateIndex(namespaceId, mcpName, mcpId);
totalUpdates.incrementAndGet();
}
} finally {
updateLatch.countDown();
}
});
}
try {
updateLatch.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
endTime = System.nanoTime();
duration = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);
System.out.printf("并发更新 %d 次操作耗时: %d ms\n", totalUpdates.get(), duration);
System.out.printf("平均每次更新耗时: %.2f μs\n", (duration * 1000.0) / totalUpdates.get());
System.out.printf("吞吐量: %.2f ops/ms\n", (double) totalUpdates.get() / duration);
executor.shutdown();
// 显示最终缓存统计
McpCacheIndex.CacheStats stats = cacheIndex.getStats();
System.out.printf("最终缓存统计 - 命中次数: %d, 未命中次数: %d, 命中率: %.2f%%, 缓存大小: %d\n",
stats.getHitCount(), stats.getMissCount(), stats.getHitRate() * 100, stats.getSize());
}
/**
* 测试缓存大小对性能的影响.
*/
private static void testCacheSizeImpact() {
System.out.println("\n=== 缓存大小对性能的影响测试 ===");
int[] cacheSizes = {100, 1000, 10000, 100000};
for (int size : cacheSizes) {
System.out.printf("\n测试缓存大小: %d\n", size);
MemoryMcpCacheIndex cacheIndex = new MemoryMcpCacheIndex(createTestProperties(size, 3600, 300));
// 预热缓存
for (int i = 0; i < size; i++) {
String namespaceId = "namespace-" + (i % 10);
String mcpName = "mcp-" + i;
String mcpId = "id-" + i;
cacheIndex.updateIndex(namespaceId, mcpName, mcpId);
}
// 测试查询性能
long startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
String namespaceId = "namespace-" + (i % 10);
String mcpName = "mcp-" + (i % size);
cacheIndex.getMcpId(namespaceId, mcpName);
}
long endTime = System.nanoTime();
long duration = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);
System.out.printf("查询 10000 次操作耗时: %d ms, 平均: %.2f μs\n", duration, (duration * 1000.0) / 10000);
// 显示内存使用情况
Runtime runtime = Runtime.getRuntime();
long memoryUsed = runtime.totalMemory() - runtime.freeMemory();
System.out.printf("内存使用: %.2f MB\n", memoryUsed / (1024.0 * 1024.0));
}
}
/**
* 验证修复效果:确保生成的键数量在合理范围内.
*/
@Test
void testKeyGenerationValidation() {
System.out.println("\n=== 键生成验证测试 ===");
int threadCount = 10;
int operationCount = 10000;
int cacheSize = 1000;
int effectiveKeyCount = 800;
// 模拟并发更新测试中的键生成逻辑
Set