feat:support dual discovery

pull/1718/head
fishtailfu 3 weeks ago
parent 7936f0e1fa
commit 7e755c046e

@ -23,7 +23,6 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.common.pojo.PolarisServiceInstance;
import com.tencent.cloud.common.util.DiscoveryUtil;
import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.exception.PolarisException;
import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.Instance;
import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.pojo.ServiceInfo;
@ -51,7 +50,6 @@ public class PolarisServiceDiscovery {
* @throws PolarisException polarisException * @throws PolarisException polarisException
*/ */
public List<ServiceInstance> getInstances(String serviceId) throws PolarisException { public List<ServiceInstance> getInstances(String serviceId) throws PolarisException {
serviceId = DiscoveryUtil.rewriteServiceId(serviceId);
List<ServiceInstance> instances = new ArrayList<>(); List<ServiceInstance> instances = new ArrayList<>();
InstancesResponse filteredInstances = polarisDiscoveryHandler.getHealthyInstances(serviceId); InstancesResponse filteredInstances = polarisDiscoveryHandler.getHealthyInstances(serviceId);
ServiceInstances serviceInstances = filteredInstances.toServiceInstances(); ServiceInstances serviceInstances = filteredInstances.toServiceInstances();

@ -61,7 +61,15 @@ public class NacosConfigModifier implements PolarisConfigModifier {
/** /**
* nacos group. * nacos group.
*/ */
public static final String GROUP = "group"; public static final String NACOS_GROUP = "nacos.group";
/**
* nacos service.
*/
public static final String NACOS_SERVICE = "nacos.service";
/**
* nacos cluster.
*/
public static final String NACOS_CLUSTER = "nacos.cluster";
private static final Logger LOGGER = LoggerFactory.getLogger(NacosConfigModifier.class); private static final Logger LOGGER = LoggerFactory.getLogger(NacosConfigModifier.class);
private static final String ID = "nacos"; private static final String ID = "nacos";
private final NacosContextProperties nacosContextProperties; private final NacosContextProperties nacosContextProperties;
@ -127,9 +135,14 @@ public class NacosConfigModifier implements PolarisConfigModifier {
} }
if (StringUtils.isNotBlank(nacosContextProperties.getGroup())) { if (StringUtils.isNotBlank(nacosContextProperties.getGroup())) {
metadata.put(GROUP, nacosContextProperties.getGroup()); metadata.put(NACOS_GROUP, nacosContextProperties.getGroup());
}
if (StringUtils.isNotBlank(nacosContextProperties.getClusterName())) {
metadata.put(NACOS_CLUSTER, nacosContextProperties.getClusterName());
}
if (StringUtils.isNotBlank(nacosContextProperties.getServiceName())) {
metadata.put(NACOS_SERVICE, nacosContextProperties.getServiceName());
} }
configuration.getGlobal().getServerConnectors().add(serverConnectorConfig); configuration.getGlobal().getServerConnectors().add(serverConnectorConfig);
DiscoveryConfigImpl discoveryConfig = new DiscoveryConfigImpl(); DiscoveryConfigImpl discoveryConfig = new DiscoveryConfigImpl();
discoveryConfig.setServerConnectorId(ID); discoveryConfig.setServerConnectorId(ID);

@ -67,6 +67,13 @@ public class NacosContextProperties {
@Value("${spring.cloud.nacos.discovery.username:}") @Value("${spring.cloud.nacos.discovery.username:}")
private String username; private String username;
/**
* service name to registry.
*/
@Value("${spring.cloud.nacos.discovery.service:${spring.application.name:}}")
private String serviceName;
/** /**
* the nacos authentication password. * the nacos authentication password.
*/ */
@ -170,6 +177,15 @@ public class NacosContextProperties {
this.namespace = namespace; this.namespace = namespace;
} }
String getServiceName() {
return serviceName;
}
void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
@Override @Override
public String toString() { public String toString() {
return "NacosContextProperties{" + return "NacosContextProperties{" +
@ -178,11 +194,12 @@ public class NacosContextProperties {
", registerEnabled=" + registerEnabled + ", registerEnabled=" + registerEnabled +
", serverAddr='" + serverAddr + '\'' + ", serverAddr='" + serverAddr + '\'' +
", username='" + username + '\'' + ", username='" + username + '\'' +
", serviceName='" + serviceName + '\'' +
", password='" + password + '\'' + ", password='" + password + '\'' +
", clusterName='" + clusterName + '\'' + ", clusterName='" + clusterName + '\'' +
", group='" + group + '\'' + ", group='" + group + '\'' +
", contextPath='" + contextPath + '\'' +
", namespace='" + namespace + '\'' + ", namespace='" + namespace + '\'' +
", contextPath='" + contextPath + '\'' +
'}'; '}';
} }
} }

@ -48,9 +48,11 @@ import static com.tencent.cloud.polaris.extend.nacos.NacosContextProperties.DEFA
*/ */
public class PolarisRegistration implements Registration { public class PolarisRegistration implements Registration {
private static final String GROUP_SERVER_ID_FORMAT = "%s__%s";
private static final String NACOS_CLUSTER = "nacos.cluster"; private static final String NACOS_CLUSTER = "nacos.cluster";
private static final String NACOS_GROUP = "nacos.group";
private final PolarisDiscoveryProperties polarisDiscoveryProperties; private final PolarisDiscoveryProperties polarisDiscoveryProperties;
private final SDKContext polarisContext; private final SDKContext polarisContext;
@ -83,20 +85,8 @@ public class PolarisRegistration implements Registration {
this.servletWebServerApplicationContext = servletWebServerApplicationContext; this.servletWebServerApplicationContext = servletWebServerApplicationContext;
this.reactiveWebServerApplicationContext = reactiveWebServerApplicationContext; this.reactiveWebServerApplicationContext = reactiveWebServerApplicationContext;
this.customizers = registrationCustomizers; this.customizers = registrationCustomizers;
this.serviceId = polarisDiscoveryProperties.getService();
// generate serviceId
if (Objects.isNull(nacosContextProperties)) {
serviceId = polarisDiscoveryProperties.getService();
}
else {
String group = nacosContextProperties.getGroup();
if (StringUtils.isNotBlank(group) && !DEFAULT_GROUP.equals(group)) {
serviceId = String.format(GROUP_SERVER_ID_FORMAT, group, polarisDiscoveryProperties.getService());
}
else {
serviceId = polarisDiscoveryProperties.getService();
}
}
// generate host // generate host
host = polarisContext.getConfig().getGlobal().getAPI().getBindIP(); host = polarisContext.getConfig().getGlobal().getAPI().getBindIP();
@ -119,6 +109,10 @@ public class PolarisRegistration implements Registration {
if (StringUtils.isNotBlank(clusterName) && !DEFAULT_CLUSTER.equals(clusterName)) { if (StringUtils.isNotBlank(clusterName) && !DEFAULT_CLUSTER.equals(clusterName)) {
instanceMetadata.put(NACOS_CLUSTER, clusterName); instanceMetadata.put(NACOS_CLUSTER, clusterName);
} }
String groupName = nacosContextProperties.getGroup();
if (StringUtils.isNotBlank(groupName) && !DEFAULT_GROUP.equals(groupName)) {
instanceMetadata.put(NACOS_GROUP, groupName);
}
} }
instanceMetadata.putAll(staticMetadataManager.getMergedStaticMetadata()); instanceMetadata.putAll(staticMetadataManager.getMergedStaticMetadata());

@ -134,6 +134,12 @@
"description": "the nacos authentication password.", "description": "the nacos authentication password.",
"sourceType": "com.tencent.cloud.polaris.extend.nacos.NacosContextProperties" "sourceType": "com.tencent.cloud.polaris.extend.nacos.NacosContextProperties"
}, },
{
"name": "spring.cloud.nacos.discovery.service",
"type": "java.lang.String",
"defaultValue": "${spring.application.name}",
"description": "the service name to register, default value is ${spring.application.name}."
},
{ {
"name": "spring.cloud.nacos.discovery.register-enabled", "name": "spring.cloud.nacos.discovery.register-enabled",
"type": "java.lang.Boolean", "type": "java.lang.Boolean",
@ -180,7 +186,7 @@
], ],
"hints": [ "hints": [
{ {
"name": "spring.cloud.loadbalancer.strategy", "name": "spring.cloud.loadbalancer.strategies",
"values": [ "values": [
{ {
"value": "polarisWeightedRoundRobin", "value": "polarisWeightedRoundRobin",

@ -86,7 +86,7 @@ public class NacosContextPropertiesTest {
assertThat(metadata.get(NacosConfigModifier.PASSWORD)).isEqualTo(nacosContextProperties.getPassword()); assertThat(metadata.get(NacosConfigModifier.PASSWORD)).isEqualTo(nacosContextProperties.getPassword());
assertThat(metadata.get(NacosConfigModifier.CONTEXT_PATH)).isEqualTo(nacosContextProperties.getContextPath()); assertThat(metadata.get(NacosConfigModifier.CONTEXT_PATH)).isEqualTo(nacosContextProperties.getContextPath());
assertThat(metadata.get(NacosConfigModifier.NAMESPACE)).isEqualTo(nacosContextProperties.getNamespace()); assertThat(metadata.get(NacosConfigModifier.NAMESPACE)).isEqualTo(nacosContextProperties.getNamespace());
assertThat(metadata.get(NacosConfigModifier.GROUP)).isEqualTo(nacosContextProperties.getGroup()); assertThat(metadata.get(NacosConfigModifier.NACOS_GROUP)).isEqualTo(nacosContextProperties.getGroup());
} }
@SpringBootApplication @SpringBootApplication

@ -19,11 +19,13 @@ package com.tencent.cloud.polaris.router;
import com.tencent.cloud.common.constant.OrderConstant; import com.tencent.cloud.common.constant.OrderConstant;
import com.tencent.cloud.polaris.context.PolarisConfigModifier; import com.tencent.cloud.polaris.context.PolarisConfigModifier;
import com.tencent.cloud.polaris.router.config.properties.PolarisMetadataRouterProperties;
import com.tencent.cloud.polaris.router.config.properties.PolarisNearByRouterProperties; import com.tencent.cloud.polaris.router.config.properties.PolarisNearByRouterProperties;
import com.tencent.polaris.api.config.consumer.ServiceRouterConfig; import com.tencent.polaris.api.config.consumer.ServiceRouterConfig;
import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.api.utils.StringUtils;
import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.factory.config.ConfigurationImpl;
import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig; import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig;
import com.tencent.polaris.plugins.router.metadata.MetadataRouterConfig;
import com.tencent.polaris.plugins.router.nearby.NearbyRouterConfig; import com.tencent.polaris.plugins.router.nearby.NearbyRouterConfig;
import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto; import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto;
@ -36,8 +38,10 @@ public class RouterConfigModifier implements PolarisConfigModifier {
private final PolarisNearByRouterProperties polarisNearByRouterProperties; private final PolarisNearByRouterProperties polarisNearByRouterProperties;
public RouterConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties) { private final PolarisMetadataRouterProperties polarisMetadataRouterProperties;
public RouterConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties, PolarisMetadataRouterProperties polarisMetadataRouterProperties) {
this.polarisNearByRouterProperties = polarisNearByRouterProperties; this.polarisNearByRouterProperties = polarisNearByRouterProperties;
this.polarisMetadataRouterProperties = polarisMetadataRouterProperties;
} }
@Override @Override
@ -50,7 +54,9 @@ public class RouterConfigModifier implements PolarisConfigModifier {
// Update modified config to source properties // Update modified config to source properties
configuration.getConsumer().getServiceRouter() configuration.getConsumer().getServiceRouter()
.setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, recoverRouterConfig); .setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, recoverRouterConfig);
MetadataRouterConfig metadataRouterConfig = configuration.getConsumer().getServiceRouter().getPluginConfig(
ServiceRouterConfig.DEFAULT_ROUTER_METADATA, MetadataRouterConfig.class);
metadataRouterConfig.setMetadataFailOverType(polarisMetadataRouterProperties.getFailoverType());
if (StringUtils.isNotBlank(polarisNearByRouterProperties.getMatchLevel())) { if (StringUtils.isNotBlank(polarisNearByRouterProperties.getMatchLevel())) {
RoutingProto.NearbyRoutingConfig.LocationLevel locationLevel = RoutingProto.NearbyRoutingConfig.LocationLevel locationLevel =
RoutingProto.NearbyRoutingConfig.LocationLevel.valueOf(StringUtils.upperCase(polarisNearByRouterProperties.getMatchLevel())); RoutingProto.NearbyRoutingConfig.LocationLevel.valueOf(StringUtils.upperCase(polarisNearByRouterProperties.getMatchLevel()));

@ -41,8 +41,8 @@ public class RouterConfigModifierAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public RouterConfigModifier routerConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties) { public RouterConfigModifier routerConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties, PolarisMetadataRouterProperties polarisMetadataRouterProperties) {
return new RouterConfigModifier(polarisNearByRouterProperties); return new RouterConfigModifier(polarisNearByRouterProperties, polarisMetadataRouterProperties);
} }
} }

@ -17,6 +17,9 @@
package com.tencent.cloud.polaris.router.config.properties; package com.tencent.cloud.polaris.router.config.properties;
import com.tencent.polaris.api.rpc.MetadataFailoverType;
import com.tencent.polaris.plugins.router.metadata.FailOverType;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
/** /**
@ -28,6 +31,16 @@ public class PolarisMetadataRouterProperties {
private boolean enabled = true; private boolean enabled = true;
private FailOverType failoverType = FailOverType.all;
public FailOverType getFailoverType() {
return failoverType;
}
public void setFailoverType(FailOverType failoverType) {
this.failoverType = failoverType;
}
public boolean isEnabled() { public boolean isEnabled() {
return enabled; return enabled;
} }

@ -25,7 +25,6 @@ import java.util.function.BiConsumer;
import com.tencent.cloud.common.constant.MetadataConstant; import com.tencent.cloud.common.constant.MetadataConstant;
import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
import com.tencent.cloud.common.util.DiscoveryUtil;
import com.tencent.polaris.metadata.core.MetadataContainer; import com.tencent.polaris.metadata.core.MetadataContainer;
import com.tencent.polaris.metadata.core.MetadataMapValue; import com.tencent.polaris.metadata.core.MetadataMapValue;
import com.tencent.polaris.metadata.core.MetadataObjectValue; import com.tencent.polaris.metadata.core.MetadataObjectValue;
@ -107,7 +106,6 @@ public class MetadataContext extends com.tencent.polaris.metadata.core.manager.M
LOG.error("namespace should not be blank. please configure spring.cloud.polaris.namespace or " LOG.error("namespace should not be blank. please configure spring.cloud.polaris.namespace or "
+ "spring.cloud.polaris.discovery.namespace"); + "spring.cloud.polaris.discovery.namespace");
} }
namespace = DiscoveryUtil.rewriteNamespace(namespace);
LOCAL_NAMESPACE = namespace; LOCAL_NAMESPACE = namespace;
String serviceName = ApplicationContextAwareUtils String serviceName = ApplicationContextAwareUtils
@ -121,7 +119,6 @@ public class MetadataContext extends com.tencent.polaris.metadata.core.manager.M
LOG.warn("service name should not be blank. please configure spring.cloud.polaris.service or " LOG.warn("service name should not be blank. please configure spring.cloud.polaris.service or "
+ "spring.cloud.polaris.discovery.service or spring.application.name"); + "spring.cloud.polaris.discovery.service or spring.application.name");
} }
serviceName = DiscoveryUtil.rewriteServiceId(serviceName);
LOCAL_SERVICE = serviceName; LOCAL_SERVICE = serviceName;
} }

Loading…
Cancel
Save