项目启动完成后获取所有服务

https://nacos.io/docs/latest/guide/user/sdk/
This commit is contained in:
徐晓伟 2024-02-20 15:44:03 +08:00
parent c226e1d1c3
commit 69e5896da4
4 changed files with 148 additions and 28 deletions

29
pom.xml
View File

@ -14,8 +14,8 @@
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
<spring-boot.version>2.7.18</spring-boot.version>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<!-- 2.1.2版本以上支持纯净版客户端 -->
<nacos.version>2.2.0</nacos.version>
<skipTests>true</skipTests>
@ -23,12 +23,22 @@
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
<!-- 指定纯净版SDK -->
<classifier>pure</classifier>
</dependency>
<!-- 使用纯净版时必须要引入同版本nacos-api和nacos-common否则可能出现运行时找不到类的问题 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
@ -62,13 +72,6 @@
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -0,0 +1,88 @@
package cn.com.xuxiaowei.nacos.sentinel.listener;
import cn.com.xuxiaowei.nacos.sentinel.properties.NacosSentinelDiscoveryProperties;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Properties;
/**
* Nacos 注册中心 监听程序
*
* @author xuxiaowei
* @see 0.0.1
*/
@Slf4j
@Component
public class NacosDiscoveryListener {
private NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties;
@Autowired
public void setNacosSentinelDiscoveryProperties(NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties) {
this.nacosSentinelDiscoveryProperties = nacosSentinelDiscoveryProperties;
}
@EventListener(ApplicationReadyEvent.class)
public void ready() throws NacosException {
Properties properties = nacosSentinelDiscoveryProperties.getProperties();
log.info("{}: {}", PropertyKeyConst.SERVER_ADDR, properties.getProperty(PropertyKeyConst.SERVER_ADDR));
log.info("{}: {}", PropertyKeyConst.NAMESPACE, properties.getProperty(PropertyKeyConst.NAMESPACE));
NamingService namingService = NamingFactory.createNamingService(properties);
int pageNo = nacosSentinelDiscoveryProperties.getPageNo();
int pageSize = nacosSentinelDiscoveryProperties.getPageSize();
String groupName = nacosSentinelDiscoveryProperties.getGroupName();
ListView<String> servicesOfServer = namingService.getServicesOfServer(pageNo, pageSize, groupName);
List<String> serviceNames = servicesOfServer.getData();
log.info("service size: {}", serviceNames.size());
int maxLength = 0;
for (String serviceName : serviceNames) {
maxLength = Math.max(maxLength, serviceName.length());
}
log.info("service healthy:");
for (String serviceName : serviceNames) {
List<Instance> instanceOnline = namingService.selectInstances(serviceName, true);
List<Instance> instanceOffline = namingService.selectInstances(serviceName, false);
log.info("{}:\ttrue: {}\tfalse: {}", String.format("%-" + maxLength + "s", serviceName), instanceOnline.size(), instanceOffline.size());
}
log.info("service instance:");
for (String serviceName : serviceNames) {
List<Instance> instanceOnline = namingService.selectInstances(serviceName, true);
if (!instanceOnline.isEmpty()) {
for (Instance instance : instanceOnline) {
String ip = instance.getIp();
int port = instance.getPort();
log.info("{} instance healthy true: {}:{}", String.format("%-" + maxLength + "s", serviceName), ip, port);
}
}
List<Instance> instanceOffline = namingService.selectInstances(serviceName, false);
if (!instanceOffline.isEmpty()) {
for (Instance instance : instanceOffline) {
String ip = instance.getIp();
int port = instance.getPort();
log.info("{} instance healthy false: {}:{}", String.format("%-" + maxLength + "s", serviceName), ip, port);
}
}
}
}
}

View File

@ -0,0 +1,39 @@
package cn.com.xuxiaowei.nacos.sentinel.properties;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.common.Constants;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Properties;
/**
* Nacos 监控 注册中心 配置
*
* @author xuxiaowei
* @since 0.0.1
*/
@Data
@Component
@ConfigurationProperties("nacos.sentinel.discovery")
public class NacosSentinelDiscoveryProperties {
private String serverAddr = "127.0.0.1:8848";
private String namespace = "public";
private int pageNo = 1;
private int pageSize = Integer.MAX_VALUE;
private String groupName = Constants.DEFAULT_GROUP;
public Properties getProperties() {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.SERVER_ADDR, serverAddr);
properties.setProperty(PropertyKeyConst.NAMESPACE, namespace);
return properties;
}
}

View File

@ -2,18 +2,8 @@ spring:
application:
name: nacos-sentinel
---
spring:
config:
import: nacos:nacos-config-example.properties?refresh=true
cloud:
inetutils:
ignored-interfaces:
- VMware.*
- VirtualBox.*
nacos:
config:
server-addr: ${NACOS_SENTINEL_CONFIG_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_SENTINEL_CONFIG_NAMESPACE:public}
discovery:
server-addr: ${NACOS_SENTINEL_DISCOVERY_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_SENTINEL_DISCOVERY_NAMESPACE:public}
nacos:
sentinel:
discovery:
server-addr: ${NACOS_SENTINEL_DISCOVERY_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_SENTINEL_DISCOVERY_NAMESPACE:public}