Skip to content

Commit 0a6dde8

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 9945caf + fccbb1e commit 0a6dde8

File tree

60 files changed

+1511
-192
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1511
-192
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
* spring-cloud-start-gray
2222
* spring-cloud-start-gray-server
2323
* [spring-cloud-gray-samples](spring-cloud-gray-samples/README.md)
24+
* [spring-cloud-gray-zookeeper-samples](spring-cloud-gray-zookeeper-samples/README.md)
2425

2526
#### maven 依赖
2627
jar包已经上传到maven中央库,可以通过maven直接从中央库下载

pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<groupId>cn.springcloud.gray</groupId>
88
<artifactId>spring-cloud-gray</artifactId>
99
<packaging>pom</packaging>
10-
<version>1.0.2</version>
10+
<version>1.1.0</version>
1111
<parent>
1212
<groupId>org.springframework.boot</groupId>
1313
<artifactId>spring-boot-starter-parent</artifactId>
@@ -27,6 +27,7 @@
2727
<module>spring-cloud-starter-gray</module>
2828
<module>spring-cloud-starter-gray-server</module>
2929
<module>spring-cloud-gray-samples</module>
30+
<module>spring-cloud-gray-zookeeper-samples</module>
3031
</modules>
3132

3233

spring-cloud-bamboo/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>spring-cloud-gray</artifactId>
77
<groupId>cn.springcloud.gray</groupId>
8-
<version>1.0.2</version>
8+
<version>1.1.0</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

spring-cloud-gray-client/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>spring-cloud-gray</artifactId>
77
<groupId>cn.springcloud.gray</groupId>
8-
<version>1.0.2</version>
8+
<version>1.1.0</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

@@ -37,6 +37,11 @@
3737
<artifactId>spring-cloud-starter-eureka</artifactId>
3838
<scope>provided</scope>
3939
</dependency>
40+
<dependency>
41+
<groupId>org.springframework.cloud</groupId>
42+
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
43+
<scope>provided</scope>
44+
</dependency>
4045
<dependency>
4146
<groupId>org.springframework.cloud</groupId>
4247
<artifactId>spring-cloud-starter-feign</artifactId>

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

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import cn.springcloud.bamboo.autoconfig.BambooAutoConfiguration;
55
import cn.springcloud.gray.DefaultGrayManager;
66
import cn.springcloud.gray.HttpInformationClient;
7-
import cn.springcloud.gray.InstanceLocalInfo;
87
import cn.springcloud.gray.RetryableInformationClient;
98
import cn.springcloud.gray.client.GrayClientInitializingBean;
109
import cn.springcloud.gray.client.GrayOptionalArgs;
@@ -13,8 +12,6 @@
1312
import cn.springcloud.gray.core.GrayManager;
1413
import cn.springcloud.gray.core.InformationClient;
1514
import cn.springcloud.gray.decision.DefaultGrayDecisionFactory;
16-
import com.netflix.appinfo.EurekaInstanceConfig;
17-
import com.netflix.discovery.EurekaClient;
1815
import org.springframework.beans.factory.annotation.Autowired;
1916
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2017
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -52,18 +49,6 @@ public GrayClientInitializingBean grayClientInitializingBean() {
5249
return new GrayClientInitializingBean();
5350
}
5451

55-
56-
@Bean
57-
public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaClient eurekaClient) {
58-
EurekaInstanceConfig instanceConfig = eurekaClient.getApplicationInfoManager().getEurekaInstanceConfig();
59-
InstanceLocalInfo localInfo = new InstanceLocalInfo();
60-
localInfo.setInstanceId(instanceConfig.getInstanceId());
61-
localInfo.setServiceId(instanceConfig.getAppname());
62-
localInfo.setGray(false);
63-
return localInfo;
64-
}
65-
66-
6752
@Bean
6853
@ConditionalOnMissingBean
6954
public GrayDecisionFactory grayDecisionFactory() {
@@ -72,14 +57,16 @@ public GrayDecisionFactory grayDecisionFactory() {
7257

7358

7459
@Configuration
75-
@ConditionalOnProperty(prefix = "gray.client", value = "information-client", havingValue = "http", matchIfMissing = true)
60+
@ConditionalOnProperty(prefix = "gray.client", value = "information-client", havingValue = "http", matchIfMissing
61+
= true)
7662
public static class HttpGrayManagerClientConfiguration {
7763
@Autowired
7864
private GrayClientProperties grayClientProperties;
7965

8066
@Bean
8167
public InformationClient informationClient() {
82-
InformationClient client = new HttpInformationClient(grayClientProperties.getServerUrl(), new RestTemplate());
68+
InformationClient client = new HttpInformationClient(grayClientProperties.getServerUrl(), new
69+
RestTemplate());
8370
if (!grayClientProperties.isRetryable()) {
8471
return client;
8572
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cn.springcloud.gray.client.config;
2+
3+
import cn.springcloud.gray.InstanceLocalInfo;
4+
import com.netflix.discovery.EurekaClient;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
7+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
8+
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Configuration;
11+
12+
/**
13+
* @Author: duozl
14+
* @Date: 2018/6/5 18:18
15+
*/
16+
@Configuration
17+
@ConditionalOnBean(EurekaClient.class)
18+
public class GrayClientEurekaAutoConfiguration {
19+
20+
@Bean
21+
@ConditionalOnMissingBean
22+
public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaRegistration registration) {
23+
String instanceId = registration.getInstanceConfig().getInstanceId();
24+
25+
InstanceLocalInfo localInfo = new InstanceLocalInfo();
26+
localInfo.setInstanceId(instanceId);
27+
localInfo.setServiceId(registration.getServiceId());
28+
localInfo.setGray(false);
29+
return localInfo;
30+
}
31+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package cn.springcloud.gray.client.config;
2+
3+
import cn.springcloud.gray.InstanceLocalInfo;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
7+
import org.springframework.cloud.client.serviceregistry.Registration;
8+
import org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryProperties;
9+
import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.context.annotation.Configuration;
12+
13+
import javax.naming.ConfigurationException;
14+
15+
/**
16+
* @Author: duozl
17+
* @Date: 2018/6/5 18:18
18+
*/
19+
@Configuration
20+
@ConditionalOnBean(ZookeeperRegistration.class)
21+
public class GrayClientZookeeperAutoConfiguration {
22+
private static final String METADATA_KEY_INSTANCE_ID = "instanceId";
23+
24+
@Bean
25+
@ConditionalOnMissingBean
26+
public InstanceLocalInfo instanceLocalInfo(@Autowired Registration registration,
27+
@Autowired ZookeeperDiscoveryProperties properties)
28+
throws ConfigurationException {
29+
String instanceId;
30+
if (properties.getMetadata().containsKey(METADATA_KEY_INSTANCE_ID)) {
31+
instanceId = properties.getMetadata().get(METADATA_KEY_INSTANCE_ID);
32+
} else {
33+
throw new ConfigurationException("Unable to find config spring.cloud.zookeeper.discovery.metadata" +
34+
".instanceId!");
35+
}
36+
37+
InstanceLocalInfo localInfo = new InstanceLocalInfo();
38+
localInfo.setInstanceId(instanceId);
39+
localInfo.setServiceId(registration.getServiceId());
40+
localInfo.setGray(false);
41+
return localInfo;
42+
}
43+
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,10 @@ public void setRetryNumberOfRetries(int retryNumberOfRetries) {
8686
*/
8787
public class InstanceConfig {
8888

89-
private boolean grayEnroll;
89+
private boolean grayEnroll = false;
9090
private int grayEnrollDealyTimeInMs = 40000;
9191
private boolean useMultiVersion = false;
92+
private String instanceId;
9293

9394
public boolean isGrayEnroll() {
9495
return grayEnroll;
@@ -118,5 +119,13 @@ public boolean isUseMultiVersion() {
118119
public void setUseMultiVersion(boolean useMultiVersion) {
119120
this.useMultiVersion = useMultiVersion;
120121
}
122+
123+
public String getInstanceId() {
124+
return instanceId;
125+
}
126+
127+
public void setInstanceId(String instanceId) {
128+
this.instanceId = instanceId;
129+
}
121130
}
122131
}

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package cn.springcloud.gray.ribbon;
22

3+
import cn.springcloud.bamboo.BambooAppContext;
34
import cn.springcloud.bamboo.BambooRequest;
45
import cn.springcloud.bamboo.BambooRequestContext;
56
import cn.springcloud.gray.core.GrayDecision;
7+
import cn.springcloud.gray.utils.ServiceUtil;
68
import com.netflix.loadbalancer.AbstractServerPredicate;
79
import com.netflix.loadbalancer.PredicateKey;
8-
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
10+
import com.netflix.loadbalancer.Server;
911

1012
import java.util.List;
13+
import java.util.Map;
1114

1215
public class GrayDecisionPredicate extends AbstractServerPredicate {
1316

@@ -21,10 +24,14 @@ public boolean apply(PredicateKey input) {
2124
if (bambooRequestContext == null || bambooRequestContext.getBambooRequest() == null) {
2225
return false;
2326
}
24-
DiscoveryEnabledServer server = (DiscoveryEnabledServer) input.getServer();
2527
BambooRequest bambooRequest = bambooRequestContext.getBambooRequest();
28+
Server server = input.getServer();
29+
String serviceId = bambooRequest.getServiceId();
30+
Map<String, String> serverMetadata = getServerMetadata(serviceId, server);
31+
String instanceId = ServiceUtil.getInstanceId(server, serverMetadata);
32+
2633
List<GrayDecision> grayDecisions =
27-
getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), server.getInstanceInfo().getInstanceId());
34+
getIRule().getGrayManager().grayDecision(serviceId, instanceId);
2835
for (GrayDecision grayDecision : grayDecisions) {
2936
if (grayDecision.test(bambooRequest)) {
3037
return true;
@@ -38,5 +45,7 @@ protected GrayLoadBalanceRule getIRule() {
3845
return (GrayLoadBalanceRule) this.rule;
3946
}
4047

41-
48+
public Map<String, String> getServerMetadata(String serviceId, Server server) {
49+
return BambooAppContext.getEurekaServerExtractor().getServerMetadata(serviceId, server);
50+
}
4251
}

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
package cn.springcloud.gray.ribbon;
22

3+
import cn.springcloud.bamboo.BambooAppContext;
34
import cn.springcloud.bamboo.BambooRequestContext;
45
import cn.springcloud.bamboo.ribbon.loadbalancer.BambooZoneAvoidanceRule;
56
import cn.springcloud.gray.client.GrayClientAppContext;
67
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
78
import cn.springcloud.gray.core.GrayManager;
89
import cn.springcloud.gray.core.GrayService;
10+
import cn.springcloud.gray.utils.ServiceUtil;
911
import com.google.common.base.Optional;
1012
import com.netflix.client.config.IClientConfig;
1113
import com.netflix.loadbalancer.*;
12-
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
1314

1415
import java.util.ArrayList;
1516
import java.util.List;
16-
17-
import static cn.springcloud.gray.client.GrayClientAppContext.getGrayClientProperties;
18-
17+
import java.util.Map;
1918

2019
/**
2120
* 灰度发布的负载规则
@@ -49,14 +48,16 @@ protected void init(){
4948
public Server choose(Object key) {
5049
ILoadBalancer lb = getLoadBalancer();
5150
BambooRequestContext requestContext = BambooRequestContext.currentRequestCentxt();
52-
if (requestContext != null && getGrayManager().isOpen(requestContext.getServiceId())) {
53-
GrayService grayService = getGrayManager().grayService(requestContext.getServiceId());
51+
String serviceId = requestContext.getServiceId();
52+
if (requestContext != null && getGrayManager().isOpen(serviceId)) {
53+
GrayService grayService = getGrayManager().grayService(serviceId);
5454
List<Server> servers = lb.getAllServers();
5555
List<Server> grayServers = new ArrayList<>(grayService.getGrayInstances().size());
5656
List<Server> normalServers = new ArrayList<>(servers.size() - grayService.getGrayInstances().size());
5757
for (Server server : servers) {
58-
DiscoveryEnabledServer disServer = (DiscoveryEnabledServer) server;
59-
if (grayService.getGrayInstance(disServer.getInstanceInfo().getInstanceId()) != null) {
58+
Map<String, String> serverMetadata = getServerMetadata(serviceId, server);
59+
String instanceId = ServiceUtil.getInstanceId(server, serverMetadata);
60+
if (grayService.getGrayInstance(instanceId) != null) {
6061
grayServers.add(server);
6162
} else {
6263
normalServers.add(server);
@@ -101,8 +102,11 @@ private Server choose(AbstractServerPredicate serverPredicate, List<Server> serv
101102
}
102103
}
103104

104-
105105
public GrayManager getGrayManager() {
106106
return GrayClientAppContext.getGrayManager();
107107
}
108+
109+
public static Map<String, String> getServerMetadata(String serviceId, Server server) {
110+
return BambooAppContext.getEurekaServerExtractor().getServerMetadata(serviceId, server);
111+
}
108112
}

0 commit comments

Comments
 (0)