diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java index c98f64dfb..ab9d8da37 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java @@ -21,6 +21,8 @@ import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; import com.tencent.cloud.polaris.extend.consul.ConsulConfigModifier; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; +import com.tencent.cloud.polaris.extend.nacos.NacosConfigModifier; +import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.client.api.SDKContext; @@ -38,7 +40,7 @@ import org.springframework.context.annotation.Import; */ @Configuration(proxyBeanMethods = false) @ConditionalOnPolarisEnabled -@Import({PolarisDiscoveryProperties.class, ConsulContextProperties.class}) +@Import({PolarisDiscoveryProperties.class, ConsulContextProperties.class, NacosContextProperties.class}) public class DiscoveryPropertiesAutoConfiguration { @Bean @@ -66,4 +68,10 @@ public class DiscoveryPropertiesAutoConfiguration { public PolarisDiscoveryConfigModifier polarisDiscoveryConfigModifier(PolarisDiscoveryProperties polarisDiscoveryProperties) { return new PolarisDiscoveryConfigModifier(polarisDiscoveryProperties); } + + @Bean + @ConditionalOnMissingBean + public NacosConfigModifier nacosConfigModifier(@Autowired(required = false) NacosContextProperties nacosContextProperties){ + return new NacosConfigModifier(nacosContextProperties); + } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java new file mode 100644 index 000000000..90cf352bc --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java @@ -0,0 +1,93 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.extend.nacos; + +import com.tencent.cloud.common.constant.ContextConstant; +import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.api.config.plugin.DefaultPlugins; +import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.factory.config.consumer.DiscoveryConfigImpl; +import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; +import com.tencent.polaris.factory.config.provider.RegisterConfigImpl; +import org.apache.commons.lang.StringUtils; + +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; + +/** + * @author lingxiao.wlx + */ +public class NacosConfigModifier implements PolarisConfigModifier { + private static final String ID = "nacos"; + private static final String ADDRESS_FORMAT = "%s:%s@%s"; + private static final String INTERNAL_NACOS_CLUSTER = "internal-nacos-cluster"; + + private final NacosContextProperties nacosContextProperties; + + public NacosConfigModifier(NacosContextProperties nacosContextProperties) { + this.nacosContextProperties = nacosContextProperties; + } + + @Override + public void modify(ConfigurationImpl configuration) { + if (Objects.isNull(nacosContextProperties) || !nacosContextProperties.isEnabled()) { + return; + } + + if (CollectionUtils.isEmpty(configuration.getGlobal().getServerConnectors())) { + configuration.getGlobal().setServerConnectors(new ArrayList<>()); + } + if (CollectionUtils.isEmpty(configuration.getGlobal().getServerConnectors()) + && null != configuration.getGlobal().getServerConnector()) { + configuration.getGlobal().getServerConnectors().add(configuration.getGlobal().getServerConnector()); + } + ServerConnectorConfigImpl serverConnectorConfig = new ServerConnectorConfigImpl(); + serverConnectorConfig.setId(ID); + // Nacos Address URI: nacos:nacos@127.0.0.1:8848 + String address = String.format(ADDRESS_FORMAT, nacosContextProperties.getUsername(), nacosContextProperties.getPassword(), nacosContextProperties.getServerAddr()); + serverConnectorConfig.setAddresses( + Collections.singletonList(address)); + serverConnectorConfig.setProtocol(DefaultPlugins.SERVER_CONNECTOR_NACOS); + Map metadata = serverConnectorConfig.getMetadata(); + // set internal-nacos-cluster if necessary + String clusterName = nacosContextProperties.getClusterName(); + if (StringUtils.isNotBlank(clusterName)) { + metadata.put(INTERNAL_NACOS_CLUSTER, clusterName); + } + configuration.getGlobal().getServerConnectors().add(serverConnectorConfig); + DiscoveryConfigImpl discoveryConfig = new DiscoveryConfigImpl(); + discoveryConfig.setServerConnectorId(ID); + discoveryConfig.setEnable(nacosContextProperties.isDiscoveryEnabled()); + configuration.getConsumer().getDiscoveries().add(discoveryConfig); + + RegisterConfigImpl registerConfig = new RegisterConfigImpl(); + registerConfig.setServerConnectorId(ID); + registerConfig.setEnable(nacosContextProperties.isRegisterEnabled()); + configuration.getProvider().getRegisters().add(registerConfig); + } + + @Override + public int getOrder() { + return ContextConstant.ModifierOrder.LAST; + } +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosContextProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosContextProperties.java new file mode 100644 index 000000000..fbb938df7 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosContextProperties.java @@ -0,0 +1,151 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.extend.nacos; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author lingxiao.wlx + */ +@ConfigurationProperties("spring.cloud.nacos") +public class NacosContextProperties { + + public static final String DEFAULT_GROUP = "DEFAULT_GROUP"; + + private boolean enabled = false; + + @Value("${spring.cloud.nacos.discovery.enabled:#{'true'}}") + private boolean discoveryEnabled; + + /** + * if you just want to subscribe on nacos , but don't want to register your service, set it to + * false. + */ + @Value("${spring.cloud.nacos.discovery.registerEnabled:#{'true'}}") + private boolean registerEnabled; + + /** + * nacos discovery server address. + */ + @Value("${spring.cloud.nacos.discovery.serverAddr:}") + private String serverAddr; + + /** + * the nacos authentication username. + */ + @Value("${spring.cloud.nacos.discovery.username:nacos}") + private String username; + + /** + * the nacos authentication password. + */ + @Value("${spring.cloud.nacos.discovery.username:nacos}") + private String password; + + /** + * cluster name for nacos . + */ + @Value("${spring.cloud.nacos.discovery.cluster-name:}") + private String clusterName; + + /** + * group name for nacos. + */ + @Value("${spring.cloud.nacos.discovery.group:DEFAULT_GROUP}") + private String group = DEFAULT_GROUP; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public boolean isRegisterEnabled() { + return registerEnabled; + } + + public void setRegisterEnabled(boolean registerEnabled) { + this.registerEnabled = registerEnabled; + } + + public boolean isDiscoveryEnabled() { + return discoveryEnabled; + } + + public void setDiscoveryEnabled(boolean discoveryEnabled) { + this.discoveryEnabled = discoveryEnabled; + } + + public String getServerAddr() { + return serverAddr; + } + + public void setServerAddr(String serverAddr) { + this.serverAddr = serverAddr; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + @Override + public String toString() { + return "NacosContextProperties{" + + "enabled=" + enabled + + ", discoveryEnabled=" + discoveryEnabled + + ", registerEnabled=" + registerEnabled + + ", serverAddr='" + serverAddr + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", clusterName='" + clusterName + '\'' + + ", group='" + group + '\'' + + '}'; + } +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java index 7ff1c2e39..90a0283dc 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java @@ -21,10 +21,12 @@ package com.tencent.cloud.polaris.registry; import java.net.URI; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; +import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.polaris.client.api.SDKContext; import org.apache.commons.lang.StringUtils; @@ -33,6 +35,8 @@ import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; +import static com.tencent.cloud.polaris.extend.nacos.NacosContextProperties.DEFAULT_GROUP; + /** * Registration object of Polaris. * @@ -51,6 +55,8 @@ public class PolarisRegistration implements Registration { private final StaticMetadataManager staticMetadataManager; + private final NacosContextProperties nacosContextProperties; + private Map metadata; private String host; @@ -60,18 +66,30 @@ public class PolarisRegistration implements Registration { public PolarisRegistration( PolarisDiscoveryProperties polarisDiscoveryProperties, @Nullable ConsulContextProperties consulContextProperties, - SDKContext context, StaticMetadataManager staticMetadataManager) { + SDKContext context, StaticMetadataManager staticMetadataManager, + @Nullable NacosContextProperties nacosContextProperties) { this.polarisDiscoveryProperties = polarisDiscoveryProperties; this.consulContextProperties = consulContextProperties; this.polarisContext = context; this.staticMetadataManager = staticMetadataManager; - + this.nacosContextProperties = nacosContextProperties; host = polarisContext.getConfig().getGlobal().getAPI().getBindIP(); } @Override public String getServiceId() { - return polarisDiscoveryProperties.getService(); + if (Objects.isNull(nacosContextProperties)) { + return polarisDiscoveryProperties.getService(); + } + else { + String group = nacosContextProperties.getGroup(); + if (StringUtils.isNotBlank(group) && !DEFAULT_GROUP.equals(group)) { + return group + "_" + polarisDiscoveryProperties.getService(); + } + else { + return polarisDiscoveryProperties.getService(); + } + } } @Override diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java index b5203f97c..3ff76fb3c 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java @@ -23,6 +23,7 @@ import com.tencent.cloud.polaris.PolarisDiscoveryProperties; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; +import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.polaris.client.api.SDKContext; import org.springframework.beans.factory.annotation.Autowired; @@ -61,8 +62,8 @@ public class PolarisServiceRegistryAutoConfiguration { public PolarisRegistration polarisRegistration( PolarisDiscoveryProperties polarisDiscoveryProperties, @Autowired(required = false) ConsulContextProperties consulContextProperties, - SDKContext context, StaticMetadataManager staticMetadataManager) { - return new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, context, staticMetadataManager); + SDKContext context, StaticMetadataManager staticMetadataManager, NacosContextProperties nacosContextProperties) { + return new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, context, staticMetadataManager,nacosContextProperties); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java index 420f61569..1b0f9b424 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java @@ -23,6 +23,7 @@ import java.util.Map; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; +import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.polaris.api.config.Configuration; import com.tencent.polaris.api.config.global.APIConfig; import com.tencent.polaris.api.config.global.GlobalConfig; @@ -60,6 +61,7 @@ public class PolarisRegistrationTest { // mock ConsulContextProperties consulContextProperties = mock(ConsulContextProperties.class); + NacosContextProperties nacosContextProperties = mock(NacosContextProperties.class); // mock SDKContext APIConfig apiConfig = mock(APIConfig.class); @@ -76,7 +78,7 @@ public class PolarisRegistrationTest { doReturn(Collections.singletonMap("key1", "value1")).when(staticMetadataManager).getMergedStaticMetadata(); polarisRegistration = new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, - polarisContext, staticMetadataManager); + polarisContext, staticMetadataManager, nacosContextProperties); } @Test diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 4b7214f9f..8126a44b3 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -73,7 +73,7 @@ 1.9.0-2021.0.3-SNAPSHOT - 1.9.1 + 1.10.0-SNAPSHOT 31.0.1-jre 1.2.11 4.5.1 diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml index 22c330986..64a54bad5 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml @@ -41,6 +41,15 @@ spring: # service-name: ${spring.application.name} # ip-address: localhost # prefer-ip-address: true +# nacos: +# enabled: true +# discovery: +# enabled: true +# registerEnabled: true +# group: polaris +# serverAddr: 127.0.0.1:8848 +# username: nacos +# password: nacos #eureka: # client: # serviceUrl: diff --git a/spring-cloud-tencent-polaris-context/pom.xml b/spring-cloud-tencent-polaris-context/pom.xml index 944f04a04..e59c2a278 100644 --- a/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-polaris-context/pom.xml @@ -69,6 +69,11 @@ connector-consul + + com.tencent.polaris + connector-nacos + + com.tencent.polaris connector-composite