feat:optimize code.

pull/136/head
SkyeBeFreeman 3 years ago
parent a48f2344c2
commit 8f668870b5

@ -17,7 +17,7 @@
<!-- Spring Cloud Tencent dependencies start -->
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-tencent-polaris-context</artifactId>
<artifactId>spring-cloud-tencent-polaris-loadbalancer</artifactId>
</dependency>
<!-- Spring Cloud Tencent dependencies end -->

@ -24,6 +24,14 @@ package com.tencent.cloud.common.constant;
*/
public final class ContextConstant {
/**
* Name of Polaris.
*/
public static final String POLARIS = "POLARIS";
private ContextConstant() {
}
/**
* Order of configuration modifier.
*/

@ -18,6 +18,7 @@
package com.tencent.cloud.polaris.loadbalancer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@ -28,10 +29,12 @@ import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PollingServerListUpdater;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
import com.tencent.cloud.common.constant.ContextConstant;
import com.tencent.cloud.common.constant.MetadataConstant.SystemMetadataKey;
import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.metadata.MetadataContextHolder;
import com.tencent.cloud.common.pojo.PolarisServer;
import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.api.pojo.DefaultInstance;
import com.tencent.polaris.api.pojo.DefaultServiceInstances;
@ -44,10 +47,9 @@ import com.tencent.polaris.api.rpc.InstancesResponse;
import com.tencent.polaris.router.api.core.RouterAPI;
import com.tencent.polaris.router.api.rpc.ProcessRoutersRequest;
import com.tencent.polaris.router.api.rpc.ProcessRoutersResponse;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.CollectionUtils;
/**
* Routing load balancer of polaris.
*
@ -59,74 +61,27 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
private ConsumerAPI consumerAPI;
private boolean isPolarisDiscovery = true;
private boolean isFirstCall = true;
private PolarisLoadBalancerProperties polarisLoadBalancerProperties;
public PolarisLoadBalancer(IClientConfig config, IRule rule, IPing ping,
ServerList<Server> serverList, RouterAPI routerAPI, ConsumerAPI consumerAPI) {
public PolarisLoadBalancer(IClientConfig config, IRule rule, IPing ping, ServerList<Server> serverList,
RouterAPI routerAPI, ConsumerAPI consumerAPI, PolarisLoadBalancerProperties properties) {
super(config, rule, ping, serverList, null, new PollingServerListUpdater());
this.routerAPI = routerAPI;
this.consumerAPI = consumerAPI;
this.polarisLoadBalancerProperties = properties;
}
@Override
public List<Server> getReachableServers() {
List<Server> allServers = null;
if (isFirstCall) {
allServers = super.getAllServers();
if (CollectionUtils.isEmpty(allServers)) {
return allServers;
}
if (allServers.get(0) instanceof PolarisServer) {
isPolarisDiscovery = true;
}
else {
isPolarisDiscovery = false;
}
isFirstCall = false;
}
ServiceInstances serviceInstances;
String serviceName = null;
if (isPolarisDiscovery) {
// serviceName = ((PolarisServer)allServers.get(0)).getServiceInstances().getService();
serviceInstances = getAllInstances(MetadataContext.LOCAL_NAMESPACE,
MetadataContextHolder.get().getSystemMetadata(SystemMetadataKey.PEER_SERVICE)).toServiceInstances();
if (polarisLoadBalancerProperties.getDiscoveryType().equals(ContextConstant.POLARIS)) {
serviceInstances = getPolarisDiscoveryServiceInstances();
}
else {
if (CollectionUtils.isEmpty(allServers)) {
allServers = super.getAllServers();
}
// notice the difference between different service registries
if (StringUtils.isNotBlank(
allServers.get(0).getMetaInfo().getServiceIdForDiscovery())) {
serviceName = allServers.get(0).getMetaInfo().getServiceIdForDiscovery();
}
else {
serviceName = allServers.get(0).getMetaInfo().getAppName();
}
if (StringUtils.isBlank(serviceName)) {
throw new IllegalStateException(
"PolarisLoadBalancer only Server with AppName or ServiceIdForDiscovery attribute");
}
ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE,
serviceName);
List<Instance> instances = new ArrayList<>(8);
for (Server server : allServers) {
DefaultInstance instance = new DefaultInstance();
instance.setNamespace(MetadataContext.LOCAL_NAMESPACE);
instance.setService(serviceName);
instance.setHealthy(server.isAlive());
instance.setProtocol(server.getScheme());
instance.setId(server.getId());
instance.setHost(server.getHost());
instance.setPort(server.getPort());
instance.setZone(server.getZone());
instance.setWeight(100);
instances.add(instance);
}
serviceInstances = new DefaultServiceInstances(serviceKey, instances);
serviceInstances = getExtendDiscoveryServiceInstances();
}
if (serviceInstances == null || CollectionUtils.isEmpty(serviceInstances.getInstances())) {
return Collections.emptyList();
}
ProcessRoutersRequest processRoutersRequest = new ProcessRoutersRequest();
processRoutersRequest.setDstInstances(serviceInstances);
@ -155,6 +110,57 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
return filteredInstances;
}
private ServiceInstances getPolarisDiscoveryServiceInstances() {
String serviceName = MetadataContextHolder.get().getSystemMetadata(SystemMetadataKey.PEER_SERVICE);
if (StringUtils.isBlank(serviceName)) {
List<Server> allServers = super.getAllServers();
if (CollectionUtils.isEmpty(allServers)) {
return null;
}
serviceName = ((PolarisServer) super.getAllServers().get(0)).getServiceInstances().getService();
}
return getAllInstances(MetadataContext.LOCAL_NAMESPACE, serviceName).toServiceInstances();
}
private ServiceInstances getExtendDiscoveryServiceInstances() {
List<Server> allServers = super.getAllServers();
if (CollectionUtils.isEmpty(allServers)) {
return null;
}
ServiceInstances serviceInstances;
String serviceName;
// notice the difference between different service registries
if (StringUtils.isNotBlank(
allServers.get(0).getMetaInfo().getServiceIdForDiscovery())) {
serviceName = allServers.get(0).getMetaInfo().getServiceIdForDiscovery();
}
else {
serviceName = allServers.get(0).getMetaInfo().getAppName();
}
if (StringUtils.isBlank(serviceName)) {
throw new IllegalStateException(
"PolarisLoadBalancer only Server with AppName or ServiceIdForDiscovery attribute");
}
ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE,
serviceName);
List<Instance> instances = new ArrayList<>(8);
for (Server server : allServers) {
DefaultInstance instance = new DefaultInstance();
instance.setNamespace(MetadataContext.LOCAL_NAMESPACE);
instance.setService(serviceName);
instance.setHealthy(server.isAlive());
instance.setProtocol(server.getScheme());
instance.setId(server.getId());
instance.setHost(server.getHost());
instance.setPort(server.getPort());
instance.setZone(server.getZone());
instance.setWeight(100);
instances.add(instance);
}
serviceInstances = new DefaultServiceInstances(serviceKey, instances);
return serviceInstances;
}
@Override
public List<Server> getAllServers() {
return getReachableServers();

@ -40,8 +40,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnPolarisEnabled
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled",
matchIfMissing = true)
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true)
@AutoConfigureAfter(RibbonAutoConfiguration.class)
@RibbonClients(defaultConfiguration = PolarisRibbonClientConfiguration.class)
public class PolarisLoadBalancerAutoConfiguration {

@ -17,6 +17,8 @@
package com.tencent.cloud.polaris.loadbalancer.config;
import com.tencent.cloud.common.constant.ContextConstant;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
@ -37,6 +39,11 @@ public class PolarisLoadBalancerProperties {
*/
private String strategy = "weightedRandom";
/**
* Type of discovery server.
*/
private String discoveryType = ContextConstant.POLARIS;
public String getStrategy() {
return strategy;
}
@ -53,6 +60,14 @@ public class PolarisLoadBalancerProperties {
this.enabled = enabled;
}
public String getDiscoveryType() {
return discoveryType;
}
public void setDiscoveryType(String discoveryType) {
this.discoveryType = discoveryType;
}
@Override
public String toString() {
return "PolarisLoadBalancerProperties{" + "loadbalancerEnabled=" + enabled

@ -57,9 +57,9 @@ public class PolarisRibbonClientConfiguration {
@ConditionalOnMissingBean
public ILoadBalancer polarisLoadBalancer(IClientConfig iClientConfig, IRule iRule,
IPing iPing, ServerList<Server> serverList, RouterAPI polarisRouter,
ConsumerAPI consumerAPI) {
ConsumerAPI consumerAPI, PolarisLoadBalancerProperties polarisLoadBalancerProperties) {
return new PolarisLoadBalancer(iClientConfig, iRule, iPing, serverList,
polarisRouter, consumerAPI);
polarisRouter, consumerAPI, polarisLoadBalancerProperties);
}
}

@ -4,13 +4,19 @@
"name": "spring.cloud.polaris.loadbalancer.enabled",
"type": "java.lang.Boolean",
"defaultValue": "true",
"description": "polaris loadbalancer"
"description": "polaris loadbalancer."
},
{
"name": "spring.cloud.polaris.loadbalancer.discoveryType",
"type": "java.lang.String",
"defaultValue": "POLARIS",
"description": "Type of discovery server."
},
{
"name": "spring.cloud.polaris.loadbalancer.strategy",
"type": "java.lang.String",
"defaultValue": "random",
"description": "retry,best_available,availability_filtering,round_robin,weighted_response_time,zone_avoidance,random,consistent_hash,weighted_random"
"description": "retry,best_available,availability_filtering,round_robin,weighted_response_time,zone_avoidance,random,consistent_hash,weighted_random."
}
]
}

Loading…
Cancel
Save