feature:multi register support nacos.

pull/693/head
wulingxiao 3 years ago
parent f36195109d
commit e1b577e30e

@ -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);
}
}

@ -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<String, String> 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;
}
}

@ -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 + '\'' +
'}';
}
}

@ -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<String, String> 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

@ -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

@ -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

@ -73,7 +73,7 @@
<revision>1.9.0-2021.0.3-SNAPSHOT</revision>
<!-- Dependencies -->
<polaris.version>1.9.1</polaris.version>
<polaris.version>1.10.0-SNAPSHOT</polaris.version>
<guava.version>31.0.1-jre</guava.version>
<logback.version>1.2.11</logback.version>
<mocktio.version>4.5.1</mocktio.version>

@ -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:

@ -69,6 +69,11 @@
<artifactId>connector-consul</artifactId>
</dependency>
<dependency>
<groupId>com.tencent.polaris</groupId>
<artifactId>connector-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.tencent.polaris</groupId>
<artifactId>connector-composite</artifactId>

Loading…
Cancel
Save