diff --git a/commons/common-util/src/main/java/com/schbrain/common/util/HostInfoHolder.java b/commons/common-util/src/main/java/com/schbrain/common/util/IpAddressHolder.java
similarity index 61%
rename from commons/common-util/src/main/java/com/schbrain/common/util/HostInfoHolder.java
rename to commons/common-util/src/main/java/com/schbrain/common/util/IpAddressHolder.java
index 4b97e59dad31d82ac64661cf9f2d3497c4df01a7..c989e6700a37e92b0b3afaebccac357651010b83 100644
--- a/commons/common-util/src/main/java/com/schbrain/common/util/HostInfoHolder.java
+++ b/commons/common-util/src/main/java/com/schbrain/common/util/IpAddressHolder.java
@@ -1,35 +1,24 @@
package com.schbrain.common.util;
-import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.net.*;
import java.util.Enumeration;
+import java.util.Optional;
/**
* @author liaozan
* @since 2021/11/19
*/
@Slf4j
-public class HostInfoHolder {
+public class IpAddressHolder {
- private static final HostInfo HOST_INFO = findFirstNonLoopBackHostInfo();
+ private static final String POD_IP = System.getenv("POD_IP");
+ private static final String LOCAL_IP = Optional.ofNullable(findFirstNonLoopBackAddress()).map(InetAddress::getHostAddress).orElse("127.0.0.1");
- public static HostInfo getHostInfo() {
- return HOST_INFO;
- }
-
- private static HostInfo findFirstNonLoopBackHostInfo() {
- InetAddress address = findFirstNonLoopBackAddress();
- if (address != null) {
- return convertAddress(address);
- }
- log.warn("Cannot find first non-loopBack address, fallback to localhost");
- HostInfo hostInfo = new HostInfo();
- hostInfo.setHostname("localhost");
- hostInfo.setIpAddress("127.0.0.1");
- return hostInfo;
+ public static String getIpAddress() {
+ return POD_IP == null ? LOCAL_IP : POD_IP;
}
private static InetAddress findFirstNonLoopBackAddress() {
@@ -72,21 +61,4 @@ public class HostInfoHolder {
return null;
}
- private static HostInfo convertAddress(final InetAddress address) {
- HostInfo hostInfo = new HostInfo();
- String hostname = address.getHostName();
- hostInfo.setHostname(hostname);
- hostInfo.setIpAddress(address.getHostAddress());
- return hostInfo;
- }
-
- @Data
- public static class HostInfo {
-
- private String ipAddress;
-
- private String hostname;
-
- }
-
}
diff --git a/pom.xml b/pom.xml
index 5970e8b7430c46093142cde85fd6c936469fb4a3..bd3715d193e5b67ddbe5364520694cd091233098 100644
--- a/pom.xml
+++ b/pom.xml
@@ -87,6 +87,7 @@
5.3.3
3.18.0
9.0.0
+ 2.7.11
0.10.4
2.0.2
3.9.1
@@ -422,6 +423,16 @@
apm-toolkit-logback-1.x
${skywalking-tooklit.version}
+
+ de.codecentric
+ spring-boot-admin-starter-server
+ ${spring-boot-admin.version}
+
+
+ de.codecentric
+ spring-boot-admin-starter-client
+ ${spring-boot-admin.version}
+
io.vavr
vavr
diff --git a/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/JSONLoggingInitializer.java b/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/JSONLoggingInitializer.java
index 49ec75a95ec240c8f6278748cc83c792fedb77d7..92705cbd361e4dc1e9a20dbf6b5863ae3fbfbddc 100644
--- a/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/JSONLoggingInitializer.java
+++ b/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/JSONLoggingInitializer.java
@@ -8,7 +8,6 @@ import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import cn.hutool.json.JSONObject;
import com.schbrain.common.util.*;
-import com.schbrain.common.util.HostInfoHolder.HostInfo;
import com.schbrain.framework.autoconfigure.logger.logstash.EnhancedLogstashEncoder;
import com.schbrain.framework.autoconfigure.logger.properties.LoggingProperties;
import lombok.extern.slf4j.Slf4j;
@@ -126,11 +125,9 @@ public class JSONLoggingInitializer {
}
private String getCustomFields() {
- HostInfo hostInfo = HostInfoHolder.getHostInfo();
JSONObject customFields = new JSONObject();
customFields.set("appName", applicationName);
- customFields.set("hostName", hostInfo.getHostname());
- customFields.set("podIp", hostInfo.getIpAddress());
+ customFields.set("podIp", IpAddressHolder.getIpAddress());
return customFields.toString();
}
diff --git a/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/listener/LoggingConfigLoadedEventListener.java b/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/listener/LoggingConfigLoadedEventListener.java
index b663cfcb308f3909e589ebc20871ab6c58a025aa..298a8a66d77d8ae1004f19d1234d2167ff4fa9cb 100644
--- a/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/listener/LoggingConfigLoadedEventListener.java
+++ b/starters/logger-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/logger/listener/LoggingConfigLoadedEventListener.java
@@ -5,9 +5,7 @@ import cn.hutool.system.SystemUtil;
import com.ctrip.framework.apollo.ConfigFile;
import com.ctrip.framework.apollo.ConfigService;
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
-import com.google.common.collect.Maps;
-import com.schbrain.common.util.HostInfoHolder;
-import com.schbrain.common.util.HostInfoHolder.HostInfo;
+import com.schbrain.common.util.IpAddressHolder;
import com.schbrain.framework.autoconfigure.apollo.event.ConfigLoadedEvent;
import com.schbrain.framework.autoconfigure.apollo.event.listener.ConfigLoadedEventListenerAdaptor;
import com.schbrain.framework.autoconfigure.logger.JSONLoggingInitializer;
@@ -33,7 +31,7 @@ public class LoggingConfigLoadedEventListener extends ConfigLoadedEventListenerA
@Override
protected void onConfigLoaded(ConfigLoadedEvent event, LoggingProperties properties) {
- event.getPropertySource().addProperties(buildHostInfoProperties());
+ event.getPropertySource().addProperties(buildIpAddressProperties());
configLoggingFileLocation(event.getEnvironment(), properties.getLogConfigNamespace());
}
@@ -45,12 +43,8 @@ public class LoggingConfigLoadedEventListener extends ConfigLoadedEventListenerA
/**
* hostInfo properties, for logging pattern, used in logback-spring.xml
*/
- private Map buildHostInfoProperties() {
- HostInfo hostInfo = HostInfoHolder.getHostInfo();
- Map properties = Maps.newHashMapWithExpectedSize(2);
- properties.put("application.hostname", hostInfo.getHostname());
- properties.put("application.ipAddress", hostInfo.getIpAddress());
- return properties;
+ private Map buildIpAddressProperties() {
+ return Map.of("application.ipAddress", IpAddressHolder.getIpAddress());
}
/**
diff --git a/starters/xxl-job-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/xxl/properties/XxlJobProperties.java b/starters/xxl-job-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/xxl/properties/XxlJobProperties.java
index 701a23b58240ad0fdfe80a3874b956fc01a90cac..8e2475652b1a912cf5ace1397374e5b9829ec08a 100644
--- a/starters/xxl-job-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/xxl/properties/XxlJobProperties.java
+++ b/starters/xxl-job-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/xxl/properties/XxlJobProperties.java
@@ -1,6 +1,6 @@
package com.schbrain.framework.autoconfigure.xxl.properties;
-import com.schbrain.common.util.HostInfoHolder;
+import com.schbrain.common.util.IpAddressHolder;
import com.schbrain.common.util.support.ConfigurableProperties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -15,7 +15,7 @@ public class XxlJobProperties implements ConfigurableProperties {
private String adminAddresses;
- private String ip = HostInfoHolder.getHostInfo().getIpAddress();
+ private String ip = IpAddressHolder.getIpAddress();
private int port = -1;
diff --git a/support/schbrain-spring-support/pom.xml b/support/schbrain-spring-support/pom.xml
index 5f568de1b91a7197b691dfbd8a4839849806f16c..d7de96b94d59d208adb3dd21a7680e603ba74921 100644
--- a/support/schbrain-spring-support/pom.xml
+++ b/support/schbrain-spring-support/pom.xml
@@ -20,16 +20,24 @@
org.springframework.boot
- spring-boot-starter-actuator
+ spring-boot-starter-aop
org.springframework.boot
- spring-boot-starter-aop
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
org.springframework.boot
spring-boot-configuration-processor
+
+ de.codecentric
+ spring-boot-admin-starter-client
+
org.springframework.boot
spring-boot-properties-migrator
diff --git a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/admin/AdminApplicationFactory.java b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/admin/AdminApplicationFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8d028b73647d6092f56af6a04fafead66a92479
--- /dev/null
+++ b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/admin/AdminApplicationFactory.java
@@ -0,0 +1,38 @@
+package com.schbrain.framework.support.spring.admin;
+
+import com.schbrain.common.util.IpAddressHolder;
+import de.codecentric.boot.admin.client.config.InstanceProperties;
+import de.codecentric.boot.admin.client.registration.ServletApplicationFactory;
+import de.codecentric.boot.admin.client.registration.metadata.MetadataContributor;
+import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
+import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
+import org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath;
+
+import javax.servlet.ServletContext;
+
+/**
+ * @author liaozan
+ * @since 2023/10/26
+ */
+public class AdminApplicationFactory extends ServletApplicationFactory {
+
+ public AdminApplicationFactory(InstanceProperties instance, ManagementServerProperties management,
+ ServerProperties server, ServletContext servletContext, PathMappedEndpoints pathMappedEndpoints,
+ WebEndpointProperties webEndpoint, MetadataContributor metadataContributor,
+ DispatcherServletPath dispatcherServletPath) {
+ super(instance, management, server, servletContext, pathMappedEndpoints, webEndpoint, metadataContributor, dispatcherServletPath);
+ }
+
+ @Override
+ protected String getServiceHost() {
+ return IpAddressHolder.getIpAddress();
+ }
+
+ @Override
+ protected String getManagementHost() {
+ return IpAddressHolder.getIpAddress();
+ }
+
+}
diff --git a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/admin/SpringBootAdminFeatureAutoConfiguration.java b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/admin/SpringBootAdminFeatureAutoConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..49efe240dd164e0e519262744009214ac4e50ec4
--- /dev/null
+++ b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/admin/SpringBootAdminFeatureAutoConfiguration.java
@@ -0,0 +1,35 @@
+package com.schbrain.framework.support.spring.admin;
+
+import de.codecentric.boot.admin.client.config.InstanceProperties;
+import de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration;
+import de.codecentric.boot.admin.client.registration.ApplicationFactory;
+import de.codecentric.boot.admin.client.registration.metadata.MetadataContributor;
+import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
+import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
+import org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath;
+import org.springframework.boot.cloud.CloudPlatform;
+import org.springframework.context.annotation.Bean;
+
+import javax.servlet.ServletContext;
+
+/**
+ * @author liaozan
+ * @since 2023/10/26
+ */
+@AutoConfiguration(before = SpringBootAdminClientAutoConfiguration.class)
+@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
+public class SpringBootAdminFeatureAutoConfiguration {
+
+ @Bean
+ public ApplicationFactory applicationFactory(InstanceProperties instance, ManagementServerProperties management,
+ ServerProperties server, ServletContext servletContext, PathMappedEndpoints pathMappedEndpoints,
+ WebEndpointProperties webEndpoint, MetadataContributor metadataContributor,
+ DispatcherServletPath dispatcherServletPath) {
+ return new AdminApplicationFactory(instance, management, server, servletContext, pathMappedEndpoints, webEndpoint, metadataContributor, dispatcherServletPath);
+ }
+
+}
diff --git a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/env/DefaultPropertiesEnvironmentPostProcessor.java b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/env/DefaultPropertiesEnvironmentPostProcessor.java
index 188d13d1826955912de399715d7fe7210f1b905b..cf9dbc426d774fea84ad0db0f88687fb81dbe4c1 100644
--- a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/env/DefaultPropertiesEnvironmentPostProcessor.java
+++ b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/env/DefaultPropertiesEnvironmentPostProcessor.java
@@ -32,13 +32,17 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro
private static final String SPRING_PROFILE_ACTIVE = "spring.profiles.active";
+ private final Map defaultProperties = new LinkedHashMap<>();
+
public DefaultPropertiesEnvironmentPostProcessor(DeferredLogFactory logFactory, ConfigurableBootstrapContext bootstrapContext) {
super(logFactory, bootstrapContext);
}
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
- Map defaultProperties = new LinkedHashMap<>();
+ // active profile
+ configureActiveProfileIfPresent(environment, defaultProperties);
+ environment.setDefaultProfiles(EnvUtils.DEVELOPMENT);
// management
defaultProperties.put("management.trace.http.enabled", false);
defaultProperties.put("management.endpoints.web.exposure.include", "*");
@@ -46,6 +50,7 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro
defaultProperties.put("management.endpoint.health.show-details", Show.ALWAYS.name());
defaultProperties.put("management.endpoint.health.show-components", Show.ALWAYS.name());
defaultProperties.put("management.info.git.mode", Mode.FULL.name());
+ defaultProperties.put("management.info.env.enabled", true);
defaultProperties.put("management.server.port", PortUtils.findAvailablePort(1024));
// servlet
defaultProperties.put("spring.servlet.multipart.max-file-size", DataSize.ofBytes(-1).toString());
@@ -64,9 +69,9 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro
defaultProperties.put("spring.main.allow-circular-references", true);
defaultProperties.put("spring.main.banner-mode", Banner.Mode.OFF.name());
defaultProperties.put("server.shutdown", Shutdown.GRACEFUL.name());
- // active profile
- configureActiveProfileIfPresent(environment, defaultProperties);
- environment.setDefaultProfiles(EnvUtils.DEVELOPMENT);
+ if (EnvUtils.runningOnCloudPlatform(environment)) {
+ defaultProperties.put("spring.boot.admin.client.url", "http://spring-boot-admin-server.devops:8019");
+ }
DefaultPropertiesPropertySource.addOrMerge(defaultProperties, environment.getPropertySources());
}
diff --git a/support/schbrain-spring-support/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/support/schbrain-spring-support/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 89f8c313d0cd4186ed980484f0a119edb1961ef9..31bc5acd793369d4c1ddb42ac33415e1a01049a4 100644
--- a/support/schbrain-spring-support/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/support/schbrain-spring-support/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,2 +1,3 @@
+com.schbrain.framework.support.spring.admin.SpringBootAdminFeatureAutoConfiguration
com.schbrain.framework.support.spring.elasticsearch.ElasticsearchFeatureAutoConfiguration
com.schbrain.framework.support.spring.redisson.RedissonFeatureAutoConfiguration