Skip to content

Commit 807fb69

Browse files
committed
实现nacos插件
1 parent 5d6dcb8 commit 807fb69

File tree

10 files changed

+262
-1
lines changed

10 files changed

+262
-1
lines changed

spring-cloud-gray-plugins/pom.xml

Lines changed: 2 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>A.1.1.1</version>
8+
<version>B.0.0.1</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

@@ -17,6 +17,7 @@
1717
<module>spring-cloud-gray-plugin-zuul</module>
1818
<module>spring-cloud-gray-plugin-feign</module>
1919
<module>spring-cloud-gray-plugin-webmvc</module>
20+
<module>spring-cloud-gray-plugin-ribbon-nacos-discovery</module>
2021
</modules>
2122

2223
</project>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>spring-cloud-gray-plugins</artifactId>
7+
<groupId>cn.springcloud.gray</groupId>
8+
<version>B.0.0.1</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>spring-cloud-gray-plugin-ribbon-nacos-discovery</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>cn.springcloud.gray</groupId>
17+
<artifactId>spring-cloud-gray-client</artifactId>
18+
</dependency>
19+
20+
<dependency>
21+
<groupId>com.alibaba.cloud</groupId>
22+
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
23+
</dependency>
24+
25+
<dependency>
26+
<groupId>com.netflix.ribbon</groupId>
27+
<artifactId>ribbon-loadbalancer</artifactId>
28+
<optional>true</optional>
29+
</dependency>
30+
31+
<dependency>
32+
<groupId>com.netflix.ribbon</groupId>
33+
<artifactId>ribbon-core</artifactId>
34+
<optional>true</optional>
35+
</dependency>
36+
</dependencies>
37+
38+
</project>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package cn.springcloud.gray.client.plugin.ribbon.nacos;
2+
3+
import cn.springcloud.gray.client.config.properties.GrayHoldoutServerProperties;
4+
import cn.springcloud.gray.model.InstanceStatus;
5+
import cn.springcloud.gray.servernode.AbstractServerListProcessor;
6+
import com.alibaba.cloud.nacos.ribbon.NacosServer;
7+
import com.alibaba.nacos.api.exception.NacosException;
8+
import com.alibaba.nacos.api.naming.NamingService;
9+
import com.alibaba.nacos.api.naming.pojo.Instance;
10+
import com.netflix.loadbalancer.Server;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
import java.util.Collections;
15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
18+
public class NacosServerListProcessor extends AbstractServerListProcessor<Server> {
19+
private static final Logger log = LoggerFactory.getLogger(NacosServerListProcessor.class);
20+
21+
private NamingService namingService;
22+
23+
public NacosServerListProcessor(GrayHoldoutServerProperties grayHoldoutServerProperties, NamingService namingService) {
24+
super(grayHoldoutServerProperties);
25+
this.namingService = namingService;
26+
}
27+
28+
29+
@Override
30+
protected List<Server> getServers(String serviceId, List<Server> servers) {
31+
List<InstanceStatus> statusList = getHoldoutInstanceStatus(serviceId);
32+
return getInstances(serviceId).stream().filter(instance -> statusList.contains(getInstanceStatus(instance)))
33+
.map(NacosServer::new).collect(Collectors.toList());
34+
}
35+
36+
37+
private InstanceStatus getInstanceStatus(Instance instance){
38+
if(!instance.isEnabled()){
39+
return InstanceStatus.DOWN;
40+
}
41+
if(!instance.isHealthy()){
42+
return InstanceStatus.OUT_OF_SERVICE;
43+
}
44+
return InstanceStatus.UP;
45+
}
46+
47+
48+
private List<Instance> getInstances(String serviceId){
49+
try {
50+
return namingService.getAllInstances(serviceId);
51+
} catch (NacosException e) {
52+
log.error(e.getMessage(), e);
53+
return Collections.emptyList();
54+
}
55+
}
56+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cn.springcloud.gray.client.plugin.ribbon.nacos.configuration;
2+
3+
import cn.springcloud.gray.client.config.properties.GrayHoldoutServerProperties;
4+
import cn.springcloud.gray.client.plugin.ribbon.nacos.NacosServerListProcessor;
5+
import cn.springcloud.gray.servernode.ServerListProcessor;
6+
import com.alibaba.cloud.nacos.ribbon.NacosServerList;
7+
import com.alibaba.nacos.api.naming.NamingService;
8+
import com.netflix.loadbalancer.Server;
9+
import com.netflix.ribbon.Ribbon;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
12+
import org.springframework.context.annotation.Bean;
13+
import org.springframework.context.annotation.Configuration;
14+
15+
@Configuration
16+
@ConditionalOnProperty(value = "gray.enabled")
17+
@ConditionalOnClass({Ribbon.class, NacosServerList.class})
18+
public class GrayClientRibbonNacosAutoConfiguration {
19+
20+
21+
@Bean
22+
public ServerListProcessor<Server> serverListProcessor(
23+
GrayHoldoutServerProperties grayHoldoutServerProperties, NamingService namingService){
24+
return new NacosServerListProcessor(grayHoldoutServerProperties, namingService);
25+
}
26+
27+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Auto Configure
2+
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
3+
cn.springcloud.gray.client.plugin.ribbon.nacos.configuration.GrayClientRibbonNacosAutoConfiguration

spring-cloud-gray-server-plugins/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<modules>
1515
<module>spring-cloud-gray-server-plugin-eureka</module>
1616
<module>spring-cloud-gray-server-plugin-event-stream</module>
17+
<module>spring-cloud-gray-server-plugin-nacos-discovery</module>
1718
</modules>
1819

1920

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>spring-cloud-gray-server-plugins</artifactId>
7+
<groupId>cn.springcloud.gray</groupId>
8+
<version>B.0.0.1</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>spring-cloud-gray-server-plugin-nacos-discovery</artifactId>
13+
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>cn.springcloud.gray</groupId>
18+
<artifactId>spring-cloud-gray-server</artifactId>
19+
</dependency>
20+
21+
<dependency>
22+
<groupId>com.alibaba.cloud</groupId>
23+
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
24+
</dependency>
25+
</dependencies>
26+
27+
</project>
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package cn.springcloud.gray.server.plugin.discovery.nacos;
2+
3+
import cn.springcloud.gray.model.InstanceInfo;
4+
import cn.springcloud.gray.model.InstanceStatus;
5+
import cn.springcloud.gray.server.discovery.ServiceDiscovery;
6+
import cn.springcloud.gray.server.discovery.ServiceInfo;
7+
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
8+
import com.alibaba.nacos.api.exception.NacosException;
9+
import com.alibaba.nacos.api.naming.pojo.Instance;
10+
import org.apache.commons.collections.ListUtils;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
import java.util.Collections;
15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
18+
public class NacosServiceDiscovery implements ServiceDiscovery {
19+
20+
private static final Logger log = LoggerFactory.getLogger(NacosServiceDiscovery.class);
21+
22+
private NacosDiscoveryProperties discoveryProperties;
23+
24+
public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties) {
25+
this.discoveryProperties = discoveryProperties;
26+
}
27+
28+
@Override
29+
public List<ServiceInfo> listAllSerivceInfos() {
30+
return getServices().stream().map(service -> new ServiceInfo(service)).collect(Collectors.toList());
31+
32+
}
33+
34+
@Override
35+
public ServiceInfo getServiceInfo(String serviceId) {
36+
if (!getServices().contains(serviceId)) {
37+
return null;
38+
}
39+
40+
return new ServiceInfo(serviceId);
41+
}
42+
43+
@Override
44+
public List<InstanceInfo> listInstanceInfos(String serviceId) {
45+
List<Instance> instances = null;
46+
try {
47+
instances = discoveryProperties.namingServiceInstance().getAllInstances(serviceId, false);
48+
} catch (NacosException e) {
49+
log.error(e.getMessage(), e);
50+
return ListUtils.EMPTY_LIST;
51+
}
52+
return instances.stream().map(this::createInstanceInfo).collect(Collectors.toList());
53+
}
54+
55+
@Override
56+
public InstanceInfo getInstanceInfo(String serviceId, String instanceId) {
57+
return getInstanceInfos(serviceId).get(instanceId);
58+
}
59+
60+
private List<String> getServices() {
61+
try {
62+
return discoveryProperties.namingServiceInstance()
63+
.getServicesOfServer(1, Integer.MAX_VALUE).getData();
64+
} catch (NacosException e) {
65+
return Collections.emptyList();
66+
}
67+
}
68+
69+
private InstanceInfo createInstanceInfo(Instance instance) {
70+
InstanceStatus instanceStatus = InstanceStatus.DOWN;
71+
if (instance.isEnabled()) {
72+
if (instance.isHealthy()) {
73+
instanceStatus = InstanceStatus.UP;
74+
} else {
75+
instanceStatus = InstanceStatus.OUT_OF_SERVICE;
76+
}
77+
}
78+
79+
return InstanceInfo.builder()
80+
.serviceId(instance.getServiceName())
81+
.instanceId(instance.getInstanceId())
82+
.host(instance.getIp())
83+
.port(instance.getPort())
84+
.instanceStatus(instanceStatus)
85+
.build();
86+
}
87+
88+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package cn.springcloud.gray.server.plugin.discovery.nacos.configuration;
2+
3+
import cn.springcloud.gray.server.plugin.discovery.nacos.NacosServiceDiscovery;
4+
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
@ConditionalOnClass(NacosServiceDiscovery.class)
11+
public class GrayServerPluginNacosDiscoveryAutoConfiguration {
12+
13+
@Bean
14+
public NacosServiceDiscovery nacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties){
15+
return new NacosServiceDiscovery(discoveryProperties);
16+
}
17+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Auto Configure
2+
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
3+
cn.springcloud.gray.server.plugin.discovery.nacos.configuration.GrayServerPluginNacosDiscoveryAutoConfiguration

0 commit comments

Comments
 (0)