Skip to content

Commit 17d8492

Browse files
committed
优化代码
1 parent 353ee0d commit 17d8492

15 files changed

+253
-48
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package cn.springcloud.gray.client.netflix;
2+
3+
import cn.springcloud.gray.GrayClientHolder;
4+
import cn.springcloud.gray.GrayManager;
5+
import cn.springcloud.gray.RequestInterceptor;
6+
import cn.springcloud.gray.UpdateableGrayManager;
7+
import cn.springcloud.gray.client.switcher.GraySwitcher;
8+
import cn.springcloud.gray.request.LocalStorageLifeCycle;
9+
import cn.springcloud.gray.request.RequestLocalStorage;
10+
import cn.springcloud.gray.servernode.ServerExplainer;
11+
import cn.springcloud.gray.servernode.ServerListProcessor;
12+
import lombok.extern.slf4j.Slf4j;
13+
import org.springframework.beans.BeansException;
14+
import org.springframework.beans.factory.InitializingBean;
15+
import org.springframework.context.ApplicationContext;
16+
import org.springframework.context.ApplicationContextAware;
17+
18+
import java.util.Map;
19+
20+
@Slf4j
21+
public class GrayNetflixClientInitializer implements ApplicationContextAware, InitializingBean {
22+
private ApplicationContext cxt;
23+
24+
@Override
25+
public void afterPropertiesSet() throws Exception {
26+
GrayClientHolder.setGrayManager(getBean("grayManager", GrayManager.class));
27+
GrayClientHolder.setRequestLocalStorage(getBean("requestLocalStorage", RequestLocalStorage.class));
28+
GrayClientHolder.setLocalStorageLifeCycle(getBean("localStorageLifeCycle", LocalStorageLifeCycle.class));
29+
GrayClientHolder.setServerExplainer(getBean("serverExplainer", ServerExplainer.class));
30+
GrayClientHolder.setServerListProcessor(
31+
getBean("serverListProcessor", ServerListProcessor.class, new ServerListProcessor.Default()));
32+
GrayClientHolder.setGraySwitcher(
33+
getBean("graySwitcher", GraySwitcher.class, new GraySwitcher.DefaultGraySwitcher()));
34+
35+
initGrayManagerRequestInterceptors();
36+
37+
}
38+
39+
40+
@Override
41+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
42+
this.cxt = applicationContext;
43+
}
44+
45+
46+
private <T> T getBean(String beanName, Class<T> cls) {
47+
T t = null;
48+
try {
49+
t = cxt.getBean(beanName, cls);
50+
} catch (BeansException e) {
51+
log.warn("没有从spring容器中找到name为'{}', class为'{}'的Bean", beanName, cls);
52+
}
53+
if (t == null) {
54+
t = cxt.getBean(cls);
55+
}
56+
return t;
57+
}
58+
59+
private <T> T getBean(String beanName, Class<T> cls, T defaultBean) {
60+
try {
61+
return getBean(beanName, cls);
62+
} catch (BeansException e) {
63+
log.warn("没有从spring容器中找到name为'{}', class为'{}'的Bean, 返回默认的bean:{}", beanName, cls, defaultBean);
64+
return defaultBean;
65+
}
66+
}
67+
68+
private <T> T getBeanNullable(String beanName, Class<T> cls) {
69+
try {
70+
return getBean(beanName, cls);
71+
} catch (BeansException e) {
72+
log.warn("没有从spring容器中找到name为'{}', class为'{}'的Bean", beanName, cls);
73+
return null;
74+
}
75+
}
76+
77+
78+
/**
79+
* 为了解耦合,特别将GrayManger加载Sping容器中的RequestInterceptor的逻辑独立出来
80+
*/
81+
private void initGrayManagerRequestInterceptors() {
82+
Map<String, RequestInterceptor> requestInterceptors = cxt.getBeansOfType(RequestInterceptor.class);
83+
GrayManager grayManager = GrayClientHolder.getGrayManager();
84+
if (grayManager instanceof UpdateableGrayManager) {
85+
((UpdateableGrayManager) grayManager).setRequestInterceptors(requestInterceptors.values());
86+
}
87+
grayManager.setup();
88+
}
89+
}

spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/GrayClientEurekaAutoConfiguration.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package cn.springcloud.gray.client.netflix.configuration;
22

3-
import cn.springcloud.gray.InstanceLocalInfo;
43
import cn.springcloud.gray.client.config.properties.GrayHoldoutServerProperties;
54
import cn.springcloud.gray.client.netflix.eureka.EurekaInstanceDiscoveryClient;
5+
import cn.springcloud.gray.client.netflix.eureka.EurekaInstanceLocalInfoInitiralizer;
66
import cn.springcloud.gray.client.netflix.eureka.EurekaServerExplainer;
77
import cn.springcloud.gray.client.netflix.eureka.EurekaServerListProcessor;
88
import cn.springcloud.gray.servernode.InstanceDiscoveryClient;
@@ -12,8 +12,6 @@
1212
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1313
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1414
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
15-
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
16-
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry;
1715
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
1816
import org.springframework.context.annotation.Bean;
1917
import org.springframework.context.annotation.Configuration;
@@ -29,17 +27,9 @@ public class GrayClientEurekaAutoConfiguration {
2927
private SpringClientFactory springClientFactory;
3028

3129
@Bean
32-
@ConditionalOnBean({EurekaRegistration.class})
3330
@ConditionalOnMissingBean
34-
public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaRegistration registration) {
35-
String instanceId = registration.getInstanceConfig().getInstanceId();
36-
37-
return InstanceLocalInfo.builder()
38-
.instanceId(instanceId)
39-
.serviceId(registration.getServiceId())
40-
.host(registration.getHost())
41-
.port(registration.getPort())
42-
.build();
31+
public EurekaInstanceLocalInfoInitiralizer eurekaInstanceLocalInfoInitiralizer() {
32+
return new EurekaInstanceLocalInfoInitiralizer();
4333
}
4434

4535
@Bean
@@ -50,10 +40,8 @@ public EurekaServerExplainer eurekaServerExplainer() {
5040

5141

5242
@Bean
53-
@ConditionalOnBean({EurekaServiceRegistry.class, EurekaRegistration.class})
54-
public InstanceDiscoveryClient instanceDiscoveryClient(
55-
EurekaServiceRegistry eurekaServiceRegistry, EurekaRegistration eurekaRegistration) {
56-
return new EurekaInstanceDiscoveryClient(eurekaServiceRegistry, eurekaRegistration);
43+
public InstanceDiscoveryClient instanceDiscoveryClient() {
44+
return new EurekaInstanceDiscoveryClient();
5745
}
5846

5947

spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/eureka/EurekaInstanceDiscoveryClient.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,35 @@
33
import cn.springcloud.gray.model.InstanceStatus;
44
import cn.springcloud.gray.servernode.InstanceDiscoveryClient;
55
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.BeansException;
7+
import org.springframework.beans.factory.InitializingBean;
68
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
79
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry;
10+
import org.springframework.context.ApplicationContext;
11+
import org.springframework.context.ApplicationContextAware;
812

913
@Slf4j
10-
public class EurekaInstanceDiscoveryClient implements InstanceDiscoveryClient {
14+
public class EurekaInstanceDiscoveryClient implements ApplicationContextAware, InitializingBean, InstanceDiscoveryClient {
1115

1216
private EurekaServiceRegistry eurekaServiceRegistry;
1317
private EurekaRegistration eurekaRegistration;
18+
private ApplicationContext applicationContext;
1419

1520

16-
public EurekaInstanceDiscoveryClient(EurekaServiceRegistry eurekaServiceRegistry, EurekaRegistration eurekaRegistration) {
17-
this.eurekaServiceRegistry = eurekaServiceRegistry;
18-
this.eurekaRegistration = eurekaRegistration;
19-
}
2021

2122
@Override
2223
public void setStatus(InstanceStatus status) {
2324
eurekaServiceRegistry.setStatus(eurekaRegistration, EurekaInstatnceTransformer.toEurekaInstanceStatus(status).name());
2425
}
2526

27+
@Override
28+
public void afterPropertiesSet() throws Exception {
29+
eurekaServiceRegistry = applicationContext.getBean(EurekaServiceRegistry.class);
30+
eurekaRegistration = applicationContext.getBean(EurekaRegistration.class);
31+
}
32+
33+
@Override
34+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
35+
this.applicationContext = applicationContext;
36+
}
2637
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package cn.springcloud.gray.client.netflix.eureka;
2+
3+
import cn.springcloud.gray.local.InstanceLocalInfo;
4+
import cn.springcloud.gray.local.InstanceLocalInfoInitiralizer;
5+
import com.netflix.appinfo.EurekaInstanceConfig;
6+
import org.springframework.beans.BeansException;
7+
import org.springframework.context.ApplicationContext;
8+
import org.springframework.context.ApplicationContextAware;
9+
10+
public class EurekaInstanceLocalInfoInitiralizer implements InstanceLocalInfoInitiralizer, ApplicationContextAware {
11+
12+
private ApplicationContext applicationContext;
13+
private InstanceLocalInfo instanceLocalInfo;
14+
15+
16+
17+
@Override
18+
public InstanceLocalInfo getInstanceLocalInfo() {
19+
if(instanceLocalInfo==null){
20+
EurekaInstanceConfig eurekaInstanceConfig = applicationContext.getBean(EurekaInstanceConfig.class);
21+
String instanceId = eurekaInstanceConfig.getInstanceId();
22+
23+
int port = eurekaInstanceConfig.getNonSecurePort();
24+
if(eurekaInstanceConfig.getSecurePortEnabled()){
25+
port = eurekaInstanceConfig.getSecurePort();
26+
}
27+
instanceLocalInfo = InstanceLocalInfo.builder()
28+
.instanceId(instanceId)
29+
.serviceId(eurekaInstanceConfig.getAppname())
30+
.host(eurekaInstanceConfig.getHostName(false))
31+
.port(port)
32+
.build();
33+
}
34+
return instanceLocalInfo;
35+
}
36+
37+
@Override
38+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
39+
this.applicationContext = applicationContext;
40+
}
41+
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientHolder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.springcloud.gray;
22

33
import cn.springcloud.gray.client.switcher.GraySwitcher;
4+
import cn.springcloud.gray.local.InstanceLocalInfo;
45
import cn.springcloud.gray.request.LocalStorageLifeCycle;
56
import cn.springcloud.gray.request.RequestLocalStorage;
67
import cn.springcloud.gray.servernode.ServerExplainer;
@@ -14,6 +15,7 @@ public class GrayClientHolder {
1415
private static ServerExplainer<?> serverExplainer;
1516
private static ServerListProcessor<?> serverListProcessor;
1617
private static GraySwitcher graySwitcher = new GraySwitcher.DefaultGraySwitcher();
18+
private static InstanceLocalInfo instanceLocalInfo;
1719

1820
public static GrayManager getGrayManager() {
1921
return grayManager;
@@ -62,4 +64,12 @@ public static GraySwitcher getGraySwitcher() {
6264
public static void setGraySwitcher(GraySwitcher graySwitcher) {
6365
GrayClientHolder.graySwitcher = graySwitcher;
6466
}
67+
68+
public static InstanceLocalInfo getInstanceLocalInfo() {
69+
return instanceLocalInfo;
70+
}
71+
72+
public static void setInstanceLocalInfo(InstanceLocalInfo instanceLocalInfo) {
73+
GrayClientHolder.instanceLocalInfo = instanceLocalInfo;
74+
}
6575
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientInitializer.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.springcloud.gray;
22

33
import cn.springcloud.gray.client.switcher.GraySwitcher;
4+
import cn.springcloud.gray.local.InstanceLocalInfoInitiralizer;
45
import cn.springcloud.gray.request.LocalStorageLifeCycle;
56
import cn.springcloud.gray.request.RequestLocalStorage;
67
import cn.springcloud.gray.servernode.ServerExplainer;
@@ -30,14 +31,24 @@ public void afterPropertiesSet() throws Exception {
3031

3132
initGrayManagerRequestInterceptors();
3233

34+
loadInstanceLocalInfo();
3335
}
3436

3537

38+
3639
@Override
3740
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
3841
this.cxt = applicationContext;
3942
}
4043

44+
private void loadInstanceLocalInfo(){
45+
InstanceLocalInfoInitiralizer instanceLocalInfoInitiralizer = getBean("instanceLocalInfoInitiralizer", InstanceLocalInfoInitiralizer.class);
46+
if(instanceLocalInfoInitiralizer==null){
47+
return;
48+
}
49+
GrayClientHolder.setInstanceLocalInfo(instanceLocalInfoInitiralizer.getInstanceLocalInfo());
50+
}
51+
4152

4253
private <T> T getBean(String beanName, Class<T> cls) {
4354
T t = null;

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientEnrollInitializingDestroyBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import cn.springcloud.gray.CommunicableGrayManager;
44
import cn.springcloud.gray.GrayClientConfig;
5-
import cn.springcloud.gray.InstanceLocalInfo;
5+
import cn.springcloud.gray.local.InstanceLocalInfo;
66
import cn.springcloud.gray.model.GrayInstance;
77
import cn.springcloud.gray.model.GrayStatus;
88
import lombok.extern.slf4j.Slf4j;

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientAutoConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import cn.springcloud.gray.communication.InformationClient;
1010
import cn.springcloud.gray.decision.GrayDecision;
1111
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
12+
import cn.springcloud.gray.local.InstanceLocalInfo;
1213
import cn.springcloud.gray.request.LocalStorageLifeCycle;
1314
import cn.springcloud.gray.request.RequestLocalStorage;
1415
import cn.springcloud.gray.request.ThreadLocalRequestStorage;
Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,29 @@
11
package cn.springcloud.gray.client.config;
22

33
import cn.springcloud.gray.GrayManager;
4-
import cn.springcloud.gray.InstanceLocalInfo;
5-
import cn.springcloud.gray.InstanceLocalInfoAware;
4+
import cn.springcloud.gray.local.InstanceLocalInfo;
5+
import cn.springcloud.gray.local.InstanceLocalInfoAware;
6+
import cn.springcloud.gray.local.InstanceLocalInfoAwareProcessor;
7+
import cn.springcloud.gray.local.InstanceLocalInfoInitiralizer;
68
import org.springframework.beans.BeansException;
9+
import org.springframework.beans.factory.annotation.Autowired;
710
import org.springframework.beans.factory.config.BeanPostProcessor;
811
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
913
import org.springframework.context.annotation.Bean;
1014
import org.springframework.context.annotation.Configuration;
1115

1216
@Configuration
1317
@ConditionalOnBean(GrayManager.class)
1418
public class GrayClientBeanPostProcessorConfiguration {
1519

16-
1720
@Bean
18-
// @ConditionalOnBean(InstanceLocalInfo.class)
19-
public BeanPostProcessor beanPostProcessor(InstanceLocalInfo instanceLocalInfo) {
20-
return new BeanPostProcessor() {
21-
@Override
22-
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
23-
if (bean instanceof InstanceLocalInfoAware) {
24-
((InstanceLocalInfoAware) bean).setInstanceLocalInfo(instanceLocalInfo);
25-
}
26-
return bean;
27-
}
28-
29-
@Override
30-
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
31-
return bean;
32-
}
33-
};
21+
@ConditionalOnProperty(value = "gray.aware.instanceLocalInfo.enabled", matchIfMissing = true)
22+
public InstanceLocalInfoAwareProcessor instanceLocalInfoAwareProcessor(
23+
InstanceLocalInfoInitiralizer instanceLocalInfoInitiralizer) {
24+
return new InstanceLocalInfoAwareProcessor(instanceLocalInfoInitiralizer.getInstanceLocalInfo());
3425
}
3526

27+
28+
3629
}

0 commit comments

Comments
 (0)