Skip to content

Commit 5d6dcb8

Browse files
committed
优化注册中心及ribbon server和"破窗"相关的代码
1 parent 8940906 commit 5d6dcb8

File tree

12 files changed

+219
-8
lines changed

12 files changed

+219
-8
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import cn.springcloud.gray.GrayManager;
55
import cn.springcloud.gray.choose.GrayPredicate;
66
import cn.springcloud.gray.client.netflix.RibbonServerChooser;
7+
import cn.springcloud.gray.client.netflix.ribbon.RibbonServerExplainer;
78
import cn.springcloud.gray.routing.connectionpoint.DefaultRoutingConnectionPoint;
89
import cn.springcloud.gray.routing.connectionpoint.RoutingConnectionPoint;
910
import cn.springcloud.gray.client.netflix.ribbon.configuration.GrayRibbonClientsConfiguration;
@@ -16,6 +17,7 @@
1617
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1718
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1819
import org.springframework.cloud.netflix.ribbon.RibbonClients;
20+
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
1921
import org.springframework.context.annotation.Bean;
2022
import org.springframework.context.annotation.Configuration;
2123

@@ -47,4 +49,11 @@ public RibbonServerChooser ribbonServerChooser(
4749
grayPredicate, serverExplainer, serverListProcess);
4850
}
4951

52+
53+
@Bean
54+
@ConditionalOnMissingBean
55+
public ServerExplainer<Server> ribbonServerExplainer(SpringClientFactory springClientFactory){
56+
return new RibbonServerExplainer(springClientFactory);
57+
}
58+
5059
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package cn.springcloud.gray.client.netflix.ribbon;
2+
3+
import cn.springcloud.gray.servernode.ServerExplainer;
4+
import cn.springcloud.gray.servernode.ServerSpec;
5+
import com.netflix.loadbalancer.Server;
6+
import org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector;
7+
import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
8+
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
9+
10+
import java.util.Map;
11+
12+
public class RibbonServerExplainer implements ServerExplainer<Server> {
13+
14+
private SpringClientFactory springClientFactory;
15+
16+
public RibbonServerExplainer(SpringClientFactory springClientFactory) {
17+
this.springClientFactory = springClientFactory;
18+
}
19+
20+
@Override
21+
public ServerSpec apply(Server server) {
22+
Map metadata = getServerMetadata(server.getMetaInfo().getServiceIdForDiscovery(), server);
23+
return ServerSpec.builder().instanceId(server.getMetaInfo().getInstanceId())
24+
.serviceId(server.getMetaInfo().getServiceIdForDiscovery())
25+
.metadatas(metadata).build();
26+
}
27+
28+
public ServerIntrospector serverIntrospector(String serviceId) {
29+
if (springClientFactory == null) {
30+
return new DefaultServerIntrospector();
31+
}
32+
ServerIntrospector serverIntrospector = this.springClientFactory.getInstance(serviceId,
33+
ServerIntrospector.class);
34+
if (serverIntrospector == null) {
35+
serverIntrospector = new DefaultServerIntrospector();
36+
}
37+
return serverIntrospector;
38+
}
39+
40+
/**
41+
* 获取实例的metadata信息
42+
*
43+
* @param serviceId 服务id
44+
* @param server ribbon服务器(服务实例)
45+
* @return 服务实例的metadata信息
46+
*/
47+
public Map<String, String> getServerMetadata(String serviceId, Server server) {
48+
return serverIntrospector(serviceId).getMetadata(server);
49+
}
50+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cn.springcloud.gray.client.config;
2+
3+
import cn.springcloud.gray.local.DefaultInstanceLocalInfoInitiralizer;
4+
import cn.springcloud.gray.local.InstanceLocalInfoInitiralizer;
5+
import cn.springcloud.gray.servernode.DefaultInstanceDiscoveryClient;
6+
import cn.springcloud.gray.servernode.InstanceDiscoveryClient;
7+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Configuration;
11+
12+
@Configuration
13+
@ConditionalOnProperty(value = "gray.enabled")
14+
public class GrayClientDiscoveryAutoConfiguration {
15+
16+
17+
@Bean
18+
@ConditionalOnMissingBean
19+
public InstanceDiscoveryClient instanceDiscoveryClient(){
20+
return new DefaultInstanceDiscoveryClient();
21+
}
22+
23+
24+
@Bean
25+
@ConditionalOnMissingBean
26+
public InstanceLocalInfoInitiralizer instanceLocalInfoInitiralizer(){
27+
return new DefaultInstanceLocalInfoInitiralizer();
28+
}
29+
30+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cn.springcloud.gray.local;
2+
3+
4+
public class DefaultInstanceLocalInfoInitiralizer extends LazyInstanceLocalInfoInitiralizer {
5+
6+
@Override
7+
protected String getLocalInstanceId() {
8+
return "";
9+
}
10+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cn.springcloud.gray.local;
2+
3+
import org.springframework.cloud.client.serviceregistry.Registration;
4+
import org.springframework.context.ApplicationContext;
5+
import org.springframework.context.ApplicationContextAware;
6+
7+
public abstract class LazyInstanceLocalInfoInitiralizer implements InstanceLocalInfoInitiralizer, ApplicationContextAware {
8+
9+
protected ApplicationContext applicationContext;
10+
protected InstanceLocalInfo instanceLocalInfo;
11+
12+
13+
@Override
14+
public InstanceLocalInfo getInstanceLocalInfo() {
15+
if(instanceLocalInfo==null){
16+
instanceLocalInfo = createInstanceLocalInfo();
17+
}
18+
return instanceLocalInfo;
19+
}
20+
21+
@Override
22+
public void setApplicationContext(ApplicationContext applicationContext) {
23+
this.applicationContext = applicationContext;
24+
}
25+
26+
protected InstanceLocalInfo createInstanceLocalInfo() {
27+
Registration registration = applicationContext.getBean(Registration.class);
28+
return InstanceLocalInfo.builder()
29+
.instanceId(getLocalInstanceId())
30+
.serviceId(registration.getServiceId())
31+
.host(registration.getHost())
32+
.port(registration.getPort())
33+
.build();
34+
}
35+
36+
protected abstract String getLocalInstanceId();
37+
38+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cn.springcloud.gray.servernode;
2+
3+
import cn.springcloud.gray.client.config.properties.GrayHoldoutServerProperties;
4+
import cn.springcloud.gray.model.InstanceStatus;
5+
import org.apache.commons.collections.CollectionUtils;
6+
7+
import java.util.List;
8+
9+
public abstract class AbstractServerListProcessor<S> implements ServerListProcessor<S> {
10+
11+
protected GrayHoldoutServerProperties grayHoldoutServerProperties;
12+
13+
public AbstractServerListProcessor(GrayHoldoutServerProperties grayHoldoutServerProperties) {
14+
this.grayHoldoutServerProperties = grayHoldoutServerProperties;
15+
}
16+
17+
@Override
18+
public List<S> process(String serviceId, List<S> servers) {
19+
if (!grayHoldoutServerProperties.isEnabled() || CollectionUtils.isEmpty(getHoldoutInstanceStatus(serviceId))) {
20+
return servers;
21+
}
22+
23+
return getServers(serviceId, servers);
24+
}
25+
26+
protected List<InstanceStatus> getHoldoutInstanceStatus(String serviceId){
27+
return grayHoldoutServerProperties.getServices().get(serviceId);
28+
}
29+
30+
protected abstract List<S> getServers(String serviceId, List<S> servers);
31+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package cn.springcloud.gray.servernode;
2+
3+
import cn.springcloud.gray.model.InstanceStatus;
4+
import org.springframework.beans.BeansException;
5+
import org.springframework.beans.factory.InitializingBean;
6+
import org.springframework.cloud.client.serviceregistry.Registration;
7+
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
8+
import org.springframework.context.ApplicationContext;
9+
import org.springframework.context.ApplicationContextAware;
10+
11+
public class DefaultInstanceDiscoveryClient implements InstanceDiscoveryClient, ApplicationContextAware, InitializingBean{
12+
13+
private ServiceRegistry<Registration> serviceRegistry;
14+
private Registration registration;
15+
private ApplicationContext applicationContext;
16+
17+
18+
19+
@Override
20+
public void setStatus(InstanceStatus status) {
21+
serviceRegistry.setStatus(registration, status.name());
22+
}
23+
24+
@Override
25+
public void afterPropertiesSet() throws Exception {
26+
registration = applicationContext.getBean(Registration.class);
27+
serviceRegistry = applicationContext.getBean(ServiceRegistry.class);
28+
}
29+
30+
@Override
31+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
32+
this.applicationContext = applicationContext;
33+
}
34+
}

spring-cloud-gray-plugins/spring-cloud-gray-plugin-eureka/src/main/java/cn/springcloud/gray/client/netflix/eureka/EurekaServerListProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public EurekaServerListProcessor(GrayHoldoutServerProperties grayHoldoutServerPr
4747

4848
@Override
4949
public List<Server> process(String serviceId, List<Server> servers) {
50-
if (!grayHoldoutServerProperties.isEnabled() || !grayHoldoutServerProperties.getServices().containsKey(serviceId)) {
50+
if (!grayHoldoutServerProperties.isEnabled() || CollectionUtils.isEmpty(grayHoldoutServerProperties.getServices().get(serviceId))) {
5151
return servers;
5252
}
5353

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.netflix.discovery.EurekaClient;
88
import org.springframework.beans.factory.annotation.Autowired;
99
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1011
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1112
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1213
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
@@ -16,22 +17,20 @@
1617
@Configuration
1718
//@ConditionalOnBean({GrayManager.class})
1819
@ConditionalOnProperty(value = "gray.enabled")
19-
@ConditionalOnBean({EurekaClient.class})
20+
@ConditionalOnClass({EurekaClient.class})
2021
public class GrayClientEurekaAutoConfiguration {
2122

2223

2324
@Autowired
2425
private SpringClientFactory springClientFactory;
2526

2627
@Bean
27-
@ConditionalOnMissingBean
28-
public EurekaInstanceLocalInfoInitiralizer eurekaInstanceLocalInfoInitiralizer() {
28+
public EurekaInstanceLocalInfoInitiralizer instanceLocalInfoInitiralizer() {
2929
return new EurekaInstanceLocalInfoInitiralizer();
3030
}
3131

32-
@Bean
33-
@ConditionalOnMissingBean
34-
public EurekaServerExplainer eurekaServerExplainer() {
32+
// @Bean
33+
public ServerExplainer<Server> serverExplainer() {
3534
return new EurekaServerExplainer(springClientFactory);
3635
}
3736

@@ -43,7 +42,7 @@ public InstanceDiscoveryClient instanceDiscoveryClient() {
4342

4443

4544
@Bean
46-
@ConditionalOnProperty(value = "gray.holdoutServer.enabled")
45+
@ConditionalOnProperty(value = "gray.holdout-server.enabled")
4746
@ConditionalOnMissingBean
4847
public ServerListProcessor serverListProcessor(GrayHoldoutServerProperties grayHoldoutServerProperties, EurekaClient eurekaClient) {
4948
if(grayHoldoutServerProperties.isZoneAffinity()){

spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/discovery/ServiceDiscovery.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import cn.springcloud.gray.model.InstanceInfo;
44

55
import java.util.List;
6+
import java.util.Map;
7+
import java.util.stream.Collectors;
68

79

810
/**
@@ -18,4 +20,7 @@ public interface ServiceDiscovery {
1820

1921
InstanceInfo getInstanceInfo(String serviceId, String instanceId);
2022

23+
default Map<String, InstanceInfo> getInstanceInfos(String serviceId) {
24+
return listInstanceInfos(serviceId).stream().collect(Collectors.toMap(info -> info.getInstanceId(), info -> info));
25+
}
2126
}

0 commit comments

Comments
 (0)