From e1635009801be14ad574e7e381f111850c346302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=97=E5=B0=91?= <314226532@qq.com> Date: Thu, 10 Jan 2019 10:16:01 +0800 Subject: [PATCH] Code optimization for ans starter --- .../ans/migrate/MigrateOnConditionClass.java | 2 +- .../MigrateOnConditionMissingClass.java | 2 +- .../ans/migrate/MigrateProxyManager.java | 29 ++++++++++--------- .../migrate/MigrateRefreshEventListener.java | 18 +++++++----- .../migrate/MigrationAutoconfiguration.java | 11 +++++++ .../migrate/ServerListInvocationHandler.java | 21 ++++++++++++++ .../main/resources/META-INF/spring.factories | 4 +-- 7 files changed, 61 insertions(+), 26 deletions(-) diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java index cf5ee82a..23c58036 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java @@ -16,7 +16,7 @@ public class MigrateOnConditionClass extends MigrateOnCondition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { boolean result = isPresent(conditionOnClass[0], classLoader) || isPresent(conditionOnClass[1], classLoader); - log.info("the result of MigrateOnConditionClass is :" + result); + log.info("the result of match is :" + result); return result; } } \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java index e5651c6f..8501ed12 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java @@ -16,7 +16,7 @@ public class MigrateOnConditionMissingClass extends MigrateOnConditionClass { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { boolean result = !super.matches(context, metadata); - log.info("the result of MigrateOnConditionMissingClass is :" + result); + log.info("the result of match is :" + result); return result; } diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java index df280082..23427941 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java @@ -1,5 +1,15 @@ package org.springframework.cloud.alicloud.ans.migrate; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.ILoadBalancer; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerList; +import org.aopalliance.aop.Advice; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.aop.AfterReturningAdvice; +import org.springframework.aop.framework.ProxyFactory; + import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; @@ -8,17 +18,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.atomic.AtomicBoolean; -import org.aopalliance.aop.Advice; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.aop.AfterReturningAdvice; -import org.springframework.aop.framework.ProxyFactory; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; - /** * @author pbting */ @@ -49,17 +48,21 @@ final class MigrateProxyManager { } static Object newLoadBalancerProxy(Object bean, ClassLoader classLoader, - IClientConfig clientConfig) { + final IClientConfig clientConfig) { bean = springProxyFactory(bean, classLoader, Arrays.asList(new AfterReturningAdvice() { + private final IClientConfig iclientConfig = clientConfig; + @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) { String methodName = method.getName(); if ("chooseServer".equals(methodName)) { - String serviceId = clientConfig.getClientName(); + String serviceId = iclientConfig.getClientName(); Server server = (Server) returnValue; + server = ServerListInvocationHandler + .checkAndGetServiceServer(serviceId, server); ServerListInvocationHandler.incrementCallService(serviceId, server); } diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java index 620776d9..ed1505dc 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java @@ -1,16 +1,17 @@ package org.springframework.cloud.alicloud.ans.migrate; -import com.netflix.loadbalancer.ILoadBalancer; -import org.springframework.beans.factory.annotation.Autowired; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import javax.annotation.PostConstruct; + import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.endpoint.event.RefreshEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; +import com.netflix.loadbalancer.ILoadBalancer; /** * @author pbting @@ -22,13 +23,14 @@ public class MigrateRefreshEventListener implements ApplicationListener SERVER_LIST_CONCURRENT_MAP = new ConcurrentHashMap<>(); + private final static ConcurrentMap> CALL_SERVICE_COUNT = new ConcurrentHashMap<>(); + private final static Set INTERCEPTOR_METHOD_NAME = new ConcurrentSkipListSet(); private IClientConfig clientConfig; @@ -38,6 +41,7 @@ class ServerListInvocationHandler implements MethodInterceptor { ServerListInvocationHandler(IClientConfig clientConfig) { this.clientConfig = clientConfig; this.ansServerList = new AnsServerList(clientConfig.getClientName()); + SERVER_LIST_CONCURRENT_MAP.put(ansServerList.getDom(), ansServerList); } @Override @@ -122,6 +126,23 @@ class ServerListInvocationHandler implements MethodInterceptor { return Collections.unmodifiableMap(CALL_SERVICE_COUNT); } + static Server checkAndGetServiceServer(String serviceId, Server server) { + if (server != null) { + return server; + } + + log.warn(String.format("[%s] refers the server is null", server)); + + List ansServerList = SERVER_LIST_CONCURRENT_MAP.get(serviceId) + .getInitialListOfServers(); + + if (!ansServerList.isEmpty()) { + return ansServerList.get(0); + } + + return server; + } + static void incrementCallService(String serviceId, Server server) { ConcurrentMap concurrentHashMap = CALL_SERVICE_COUNT .putIfAbsent(serviceId, new ConcurrentHashMap<>()); diff --git a/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories index 050c64ec..f733a74e 100644 --- a/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories @@ -5,6 +5,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alicloud.ans.migrate.MigrateEndpointAutoConfiguration,\ org.springframework.cloud.alicloud.ans.migrate.MigrationAutoconfiguration org.springframework.cloud.client.discovery.EnableDiscoveryClient=\ - org.springframework.cloud.alicloud.ans.AnsDiscoveryClientAutoConfiguration -org.springframework.context.ApplicationListener=\ - org.springframework.cloud.alicloud.ans.migrate.MigrateRefreshEventListener \ No newline at end of file + org.springframework.cloud.alicloud.ans.AnsDiscoveryClientAutoConfiguration \ No newline at end of file