Skip to content

Commit 40ad2fd

Browse files
committed
灰度发布增加对zookeeper的支持
1 parent 1cdda8d commit 40ad2fd

File tree

54 files changed

+1460
-176
lines changed

Some content is hidden

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

54 files changed

+1460
-176
lines changed

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-SNAPSHOT</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-SNAPSHOT</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-SNAPSHOT</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: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
import cn.springcloud.gray.core.GrayManager;
1414
import cn.springcloud.gray.core.InformationClient;
1515
import cn.springcloud.gray.decision.DefaultGrayDecisionFactory;
16-
import com.netflix.appinfo.EurekaInstanceConfig;
17-
import com.netflix.discovery.EurekaClient;
16+
import cn.springcloud.gray.utils.ServiceUtil;
1817
import org.springframework.beans.factory.annotation.Autowired;
1918
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2019
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2120
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2221
import org.springframework.boot.context.properties.EnableConfigurationProperties;
22+
import org.springframework.cloud.client.serviceregistry.Registration;
2323
import org.springframework.cloud.netflix.ribbon.RibbonClients;
24+
import org.springframework.context.ApplicationContext;
2425
import org.springframework.context.annotation.Bean;
2526
import org.springframework.context.annotation.Configuration;
2627
import org.springframework.core.annotation.Order;
@@ -54,16 +55,21 @@ public GrayClientInitializingBean grayClientInitializingBean() {
5455

5556

5657
@Bean
57-
public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaClient eurekaClient) {
58-
EurekaInstanceConfig instanceConfig = eurekaClient.getApplicationInfoManager().getEurekaInstanceConfig();
58+
@ConditionalOnMissingBean
59+
public InstanceLocalInfo instanceLocalInfo(@Autowired ApplicationContext context,
60+
@Autowired Registration registration) {
61+
String instanceId = ServiceUtil.getInstanceId(registration);
62+
if(null == instanceId){
63+
context.getId();
64+
}
65+
5966
InstanceLocalInfo localInfo = new InstanceLocalInfo();
60-
localInfo.setInstanceId(instanceConfig.getInstanceId());
61-
localInfo.setServiceId(instanceConfig.getAppname());
67+
localInfo.setInstanceId(instanceId);
68+
localInfo.setServiceId(registration.getServiceId());
6269
localInfo.setGray(false);
6370
return localInfo;
6471
}
6572

66-
6773
@Bean
6874
@ConditionalOnMissingBean
6975
public GrayDecisionFactory grayDecisionFactory() {
@@ -72,14 +78,16 @@ public GrayDecisionFactory grayDecisionFactory() {
7278

7379

7480
@Configuration
75-
@ConditionalOnProperty(prefix = "gray.client", value = "information-client", havingValue = "http", matchIfMissing = true)
81+
@ConditionalOnProperty(prefix = "gray.client", value = "information-client", havingValue = "http", matchIfMissing
82+
= true)
7683
public static class HttpGrayManagerClientConfiguration {
7784
@Autowired
7885
private GrayClientProperties grayClientProperties;
7986

8087
@Bean
8188
public InformationClient informationClient() {
82-
InformationClient client = new HttpInformationClient(grayClientProperties.getServerUrl(), new RestTemplate());
89+
InformationClient client = new HttpInformationClient(grayClientProperties.getServerUrl(), new
90+
RestTemplate());
8391
if (!grayClientProperties.isRetryable()) {
8492
return client;
8593
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import cn.springcloud.bamboo.BambooRequest;
44
import cn.springcloud.bamboo.BambooRequestContext;
55
import cn.springcloud.gray.core.GrayDecision;
6+
import cn.springcloud.gray.utils.ServiceUtil;
67
import com.netflix.loadbalancer.AbstractServerPredicate;
78
import com.netflix.loadbalancer.PredicateKey;
8-
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
9+
import com.netflix.loadbalancer.Server;
910

1011
import java.util.List;
1112

@@ -21,10 +22,12 @@ public boolean apply(PredicateKey input) {
2122
if (bambooRequestContext == null || bambooRequestContext.getBambooRequest() == null) {
2223
return false;
2324
}
24-
DiscoveryEnabledServer server = (DiscoveryEnabledServer) input.getServer();
25+
Server server = input.getServer();
26+
String instanceId = ServiceUtil.getInstanceId(server);
27+
2528
BambooRequest bambooRequest = bambooRequestContext.getBambooRequest();
2629
List<GrayDecision> grayDecisions =
27-
getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), server.getInstanceInfo().getInstanceId());
30+
getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), instanceId);
2831
for (GrayDecision grayDecision : grayDecisions) {
2932
if (grayDecision.test(bambooRequest)) {
3033
return true;

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,14 @@
66
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
77
import cn.springcloud.gray.core.GrayManager;
88
import cn.springcloud.gray.core.GrayService;
9+
import cn.springcloud.gray.utils.ServiceUtil;
910
import com.google.common.base.Optional;
1011
import com.netflix.client.config.IClientConfig;
1112
import com.netflix.loadbalancer.*;
12-
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
1313

1414
import java.util.ArrayList;
1515
import java.util.List;
1616

17-
import static cn.springcloud.gray.client.GrayClientAppContext.getGrayClientProperties;
18-
19-
2017
/**
2118
* 灰度发布的负载规则
2219
*/
@@ -55,8 +52,8 @@ public Server choose(Object key) {
5552
List<Server> grayServers = new ArrayList<>(grayService.getGrayInstances().size());
5653
List<Server> normalServers = new ArrayList<>(servers.size() - grayService.getGrayInstances().size());
5754
for (Server server : servers) {
58-
DiscoveryEnabledServer disServer = (DiscoveryEnabledServer) server;
59-
if (grayService.getGrayInstance(disServer.getInstanceInfo().getInstanceId()) != null) {
55+
String instanceId = ServiceUtil.getInstanceId(server);
56+
if (grayService.getGrayInstance(instanceId) != null) {
6057
grayServers.add(server);
6158
} else {
6259
normalServers.add(server);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package cn.springcloud.gray.utils;
2+
3+
import com.netflix.loadbalancer.Server;
4+
import org.apache.curator.x.discovery.ServiceInstance;
5+
import org.springframework.cloud.client.serviceregistry.Registration;
6+
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
7+
import org.springframework.cloud.zookeeper.discovery.ZookeeperInstance;
8+
import org.springframework.cloud.zookeeper.discovery.ZookeeperServer;
9+
import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
10+
11+
/**
12+
* @Author: duozl
13+
* @Date: 2018/6/5 15:56
14+
*/
15+
public class ServiceUtil {
16+
17+
public static String getInstanceId(Server server) {
18+
String instanceId;
19+
try {
20+
if (server instanceof ZookeeperServer) {
21+
return server.getHostPort();
22+
}
23+
} catch (Exception e) {
24+
// do nothing,可能是类找不到等原因,如果引入了zookeeper的依赖,这个不会找不到
25+
}
26+
instanceId = server.getMetaInfo().getInstanceId();
27+
return instanceId;
28+
}
29+
30+
public static String getInstanceId(Registration registration) {
31+
String instanceId = null;
32+
try {
33+
if (registration instanceof ZookeeperRegistration) {
34+
ServiceInstance<ZookeeperInstance> instance = ((ZookeeperRegistration) registration)
35+
.getServiceInstance();
36+
instanceId = instance.getAddress() + ":" + instance.getPort();
37+
}
38+
} catch (Throwable e) {
39+
// do nothing,可能是类找不到等原因,如果引入了zookeeper的依赖,这个不会找不到
40+
}
41+
42+
try {
43+
if (registration instanceof EurekaRegistration) {
44+
instanceId = ((EurekaRegistration) registration).getInstanceConfig().getInstanceId();
45+
}
46+
} catch (Throwable e) {
47+
// do nothing,可能是类找不到等原因,如果引入了eureka的依赖,这个不会找不到
48+
}
49+
50+
return instanceId;
51+
}
52+
}

spring-cloud-gray-core/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-SNAPSHOT</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

spring-cloud-gray-dependencies/pom.xml

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

1818
<groupId>cn.springcloud.gray</groupId>
1919
<artifactId>spring-cloud-gray-dependencies</artifactId>
20-
<version>1.0.2</version>
20+
<version>1.1.0-SNAPSHOT</version>
2121
<packaging>pom</packaging>
2222

2323
<licenses>

spring-cloud-gray-samples/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-SNAPSHOT</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

0 commit comments

Comments
 (0)