This commit is contained in:
徐晓伟 2024-02-20 20:35:35 +08:00
parent d39aed4086
commit e81ba055ac
5 changed files with 152 additions and 71 deletions

2
.springjavaformatconfig Normal file
View File

@ -0,0 +1,2 @@
# https://github.com/spring-io/spring-javaformat/#java-8-support
java-baseline=8

11
pom.xml
View File

@ -22,6 +22,11 @@
<!-- 2.1.2版本以上支持纯净版客户端 -->
<nacos.version>2.2.0</nacos.version>
<!-- https://mvnrepository.com/artifact/io.spring.javaformat/spring-javaformat-maven-plugin -->
<!-- https://github.com/spring-io/spring-javaformat/ -->
<!-- 高版本支持 JDK 8https://github.com/spring-io/spring-javaformat/#java-8-support -->
<spring-javaformat-maven-plugin.version>0.0.41</spring-javaformat-maven-plugin.version>
<skipTests>true</skipTests>
</properties>
@ -82,6 +87,12 @@
<build>
<plugins>
<plugin>
<groupId>io.spring.javaformat</groupId>
<artifactId>spring-javaformat-maven-plugin</artifactId>
<version>${spring-javaformat-maven-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

View File

@ -1,6 +1,7 @@
package cn.com.xuxiaowei.nacos.sentinel.listener;
import cn.com.xuxiaowei.nacos.sentinel.properties.NacosSentinelDiscoveryProperties;
import cn.com.xuxiaowei.nacos.sentinel.utils.StringUtils;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
@ -8,6 +9,7 @@ import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView;
import com.alibaba.nacos.client.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
@ -21,84 +23,113 @@ import java.util.Properties;
* Nacos 注册中心 监听程序
*
* @author xuxiaowei
* @see 0.0.1
* @since 0.0.1
*/
@Slf4j
@Component
public class NacosDiscoveryListener {
private NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties;
private NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties;
@Autowired
public void setNacosSentinelDiscoveryProperties(NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties) {
this.nacosSentinelDiscoveryProperties = nacosSentinelDiscoveryProperties;
}
@Autowired
public void setNacosSentinelDiscoveryProperties(NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties) {
this.nacosSentinelDiscoveryProperties = nacosSentinelDiscoveryProperties;
}
@EventListener(ApplicationReadyEvent.class)
public void ready() throws NacosException {
Properties properties = nacosSentinelDiscoveryProperties.getProperties();
private NamingService namingService;
log.info("{}: {}", PropertyKeyConst.SERVER_ADDR, properties.getProperty(PropertyKeyConst.SERVER_ADDR));
log.info("{}: {}", PropertyKeyConst.NAMESPACE, properties.getProperty(PropertyKeyConst.NAMESPACE));
private void createNamingService() {
if (!(namingService != null && Constants.HealthCheck.UP.equals(namingService.getServerStatus()))) {
Properties properties = nacosSentinelDiscoveryProperties.getProperties();
String serverAddr = properties.getProperty(PropertyKeyConst.SERVER_ADDR);
String namespace = properties.getProperty(PropertyKeyConst.NAMESPACE);
NamingService namingService = NamingFactory.createNamingService(properties);
log.info("");
log.info("Nacos 连接地址: {}", serverAddr);
log.info("Nacos 命名空间: {}", namespace);
log.info("");
int pageNo = nacosSentinelDiscoveryProperties.getPageNo();
int pageSize = nacosSentinelDiscoveryProperties.getPageSize();
String groupName = nacosSentinelDiscoveryProperties.getGroupName();
try {
namingService = NamingFactory.createNamingService(properties);
}
catch (NacosException e) {
throw new RuntimeException(e);
}
}
}
ListView<String> servicesOfServer = namingService.getServicesOfServer(pageNo, pageSize, groupName);
List<String> serviceNames = servicesOfServer.getData();
@EventListener(ApplicationReadyEvent.class)
public void ready() throws NacosException {
log.info("");
log.info("service size: {}", serviceNames.size());
createNamingService();
int maxLength = 0;
for (String serviceName : serviceNames) {
maxLength = Math.max(maxLength, serviceName.length());
}
int pageNo = nacosSentinelDiscoveryProperties.getPageNo();
int pageSize = nacosSentinelDiscoveryProperties.getPageSize();
String groupName = nacosSentinelDiscoveryProperties.getGroupName();
log.info("");
log.info("service instance:");
for (String serviceName : serviceNames) {
healthy(maxLength, serviceName, namingService, true);
healthy(maxLength, serviceName, namingService, false);
}
ListView<String> servicesOfServer = namingService.getServicesOfServer(pageNo, pageSize, groupName);
List<String> serviceNames = servicesOfServer.getData();
log.info("");
log.info("service healthy:");
for (String serviceName : serviceNames) {
List<Instance> instanceOnline = namingService.selectInstances(serviceName, true);
List<Instance> instanceOffline = namingService.selectInstances(serviceName, false);
log.info("{} service healthy:\ttrue: {}\tfalse: {}", String.format("%-" + maxLength + "s", serviceName), instanceOnline.size(), instanceOffline.size());
}
log.info("");
log.info("Nacos 服务总数量: {}", serviceNames.size());
for (String serviceName : serviceNames) {
namingService.subscribe(serviceName, event -> {
log.info("");
NamingEvent namingEvent = (NamingEvent) event;
List<Instance> instances = namingEvent.getInstances();
int maxLength = 0;
for (String serviceName : serviceNames) {
maxLength = Math.max(maxLength, serviceName.length());
}
log.info("{} instance subscribe {} change: \tsize: {}", serviceName, namingEvent.getGroupName(), instances.size());
log.info("");
log.info("Nacos 服务实例:");
for (String serviceName : serviceNames) {
healthy(maxLength, serviceName, namingService, true);
healthy(maxLength, serviceName, namingService, false);
}
for (Instance instance : instances) {
String ip = instance.getIp();
int port = instance.getPort();
log.info("{} instance subscribe {}: {}:{}", serviceName, namingEvent.getGroupName(), ip, port);
}
});
}
}
log.info("");
log.info("Nacos 服务健康状况:");
for (String serviceName : serviceNames) {
List<Instance> instanceOnline = namingService.selectInstances(serviceName, true);
List<Instance> instanceOffline = namingService.selectInstances(serviceName, false);
log.info("Nacos 服务名称: {},健康数量: {},不健康数量: {}", StringUtils.formatLength(serviceName, maxLength),
StringUtils.formatLength(instanceOnline.size(), 2),
StringUtils.formatLength(instanceOffline.size(), 2));
}
private void healthy(int maxLength, String serviceName, NamingService namingService, boolean healthy) throws NacosException {
List<Instance> instances = namingService.selectInstances(serviceName, healthy);
if (!instances.isEmpty()) {
for (Instance instance : instances) {
String ip = instance.getIp();
int port = instance.getPort();
log.info("{} service instance healthy {}: {}:{} {}", String.format("%-" + maxLength + "s", serviceName), healthy, ip, port, instance.getServiceName());
}
}
}
for (String serviceName : serviceNames) {
namingService.subscribe(serviceName, event -> {
NamingEvent namingEvent = (NamingEvent) event;
List<Instance> instances = namingEvent.getInstances();
log.info("");
log.info("Nacos 服务订阅: {}", serviceName);
log.info("Nacos 服务名称: {},服务数量: {},群组名称:{}", serviceName, instances.size(), namingEvent.getGroupName());
for (Instance instance : instances) {
String ip = instance.getIp();
int port = instance.getPort();
String clusterName = instance.getClusterName();
log.info("Nacos 服务名称: {}IP: {},端口: {},群组名称: {},集群名称: {}", serviceName,
StringUtils.formatLength(ip, 15), StringUtils.formatLength(port, 5),
namingEvent.getGroupName(), clusterName);
}
});
}
}
private void healthy(int maxLength, String serviceName, NamingService namingService, boolean healthy)
throws NacosException {
List<Instance> instances = namingService.selectInstances(serviceName, healthy);
if (!instances.isEmpty()) {
for (Instance instance : instances) {
String ip = instance.getIp();
int port = instance.getPort();
String clusterName = instance.getClusterName();
log.info("Nacos 服务名称: {},健康状况: {}IP: {},端口: {},群组名称: {},集群名称: {}",
StringUtils.formatLength(serviceName, maxLength), StringUtils.formatLength(healthy, 5),
StringUtils.formatLength(ip, 15), StringUtils.formatLength(port, 5),
StringUtils.extractAtLeft(instance.getServiceName()), clusterName);
}
}
}
}

View File

@ -19,21 +19,21 @@ import java.util.Properties;
@ConfigurationProperties("nacos.sentinel.discovery")
public class NacosSentinelDiscoveryProperties {
private String serverAddr = "127.0.0.1:8848";
private String serverAddr = "127.0.0.1:8848";
private String namespace = "public";
private String namespace = "public";
private int pageNo = 1;
private int pageNo = 1;
private int pageSize = Integer.MAX_VALUE;
private int pageSize = Integer.MAX_VALUE;
private String groupName = Constants.DEFAULT_GROUP;
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;
}
public Properties getProperties() {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.SERVER_ADDR, serverAddr);
properties.setProperty(PropertyKeyConst.NAMESPACE, namespace);
return properties;
}
}

View File

@ -0,0 +1,37 @@
package cn.com.xuxiaowei.nacos.sentinel.utils;
/**
* @author xuxiaowei
* @since 0.0.1
*/
public class StringUtils {
/**
* 补充字符串到指定长度不足的部分使用空格代替
* @param obj 字符串
* @param length 指定长度
* @return 返回指定长度的字符串
*/
public static String formatLength(Object obj, int length) {
return String.format("%-" + length + "s", obj);
}
/**
* 截取字符串中 @ 左侧的内容若字符串无 @ 将返回原始值
* @param str 字符串
* @return 返回 字符串中 @ 左侧的内容或者是原始值
*/
public static String extractAtLeft(String str) {
if (str == null) {
return null;
}
int atIndex = str.indexOf("@");
if (atIndex != -1) {
return str.substring(0, atIndex);
}
else {
return str;
}
}
}