diff --git a/lab-41/lab-41-demo01/pom.xml b/lab-41/lab-41-demo01/pom.xml
index bcba84da..3437bcba 100644
--- a/lab-41/lab-41-demo01/pom.xml
+++ b/lab-41/lab-41-demo01/pom.xml
@@ -20,9 +20,18 @@
org.springframework.boot
spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ ${artifactId}
+
org.springframework.boot
diff --git a/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java b/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java
index 135766fa..0e9c53a0 100644
--- a/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java
+++ b/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java
@@ -2,6 +2,11 @@ package cn.iocoder.springboot.lab40.jenkinsdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.stereotype.Component;
@SpringBootApplication
public class Application {
@@ -10,4 +15,26 @@ public class Application {
SpringApplication.run(Application.class, args);
}
+ @Component
+ public class Listener implements ApplicationListener {
+
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ if (event instanceof ApplicationReadyEvent) {
+ this.sleep(5);
+ // 用于模拟关闭比较慢。
+ } else if (event instanceof ContextClosedEvent) {
+ this.sleep(10);
+ }
+ }
+
+ private void sleep(int seconds) {
+ try {
+ Thread.sleep(seconds * 1000L);
+ } catch (InterruptedException ignore) {
+ }
+ }
+
+ }
+
}
diff --git a/lab-41/lab-41-demo01/src/main/resources/application-dev.yaml b/lab-41/lab-41-demo01/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo01/src/main/resources/application-dev.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo01/src/main/resources/application-local.yaml b/lab-41/lab-41-demo01/src/main/resources/application-local.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo01/src/main/resources/application-local.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo01/src/main/resources/application-pre.yaml b/lab-41/lab-41-demo01/src/main/resources/application-pre.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo01/src/main/resources/application-pre.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo01/src/main/resources/application-prod.yaml b/lab-41/lab-41-demo01/src/main/resources/application-prod.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo01/src/main/resources/application-prod.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo01/src/main/resources/application-uat.yaml b/lab-41/lab-41-demo01/src/main/resources/application-uat.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo01/src/main/resources/application-uat.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo01/src/main/resources/application.yaml b/lab-41/lab-41-demo01/src/main/resources/application.yaml
deleted file mode 100644
index 396333f0..00000000
--- a/lab-41/lab-41-demo01/src/main/resources/application.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-server:
- port: 8079
diff --git a/lab-41/lab-41-demo02/pom.xml b/lab-41/lab-41-demo02/pom.xml
new file mode 100644
index 00000000..28a7d507
--- /dev/null
+++ b/lab-41/lab-41-demo02/pom.xml
@@ -0,0 +1,43 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-41-demo02
+ 1.0.0
+ jar
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+
+ ${artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Demo02Application.java b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Demo02Application.java
new file mode 100644
index 00000000..e4c9f197
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Demo02Application.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab40.jenkinsdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Demo02Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Demo02Application.class, args);
+ }
+
+}
diff --git a/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/actuate/ServerHealthIndicator.java b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/actuate/ServerHealthIndicator.java
new file mode 100644
index 00000000..bdb6a10c
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/actuate/ServerHealthIndicator.java
@@ -0,0 +1,69 @@
+package cn.iocoder.springboot.lab40.jenkinsdemo.actuate;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.actuate.health.AbstractHealthIndicator;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.context.event.ApplicationFailedEvent;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ServerHealthIndicator extends AbstractHealthIndicator implements ApplicationListener {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ /**
+ * 是否在服务中
+ */
+ private volatile boolean inService = false;
+
+ @Override
+ protected void doHealthCheck(Health.Builder builder) {
+ if (inService) {
+ builder.up();
+ } else {
+ builder.down();
+ }
+ }
+
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ if (event instanceof ApplicationReadyEvent) {
+ this.handleApplicationReadyEvent((ApplicationReadyEvent) event);
+ } else if (event instanceof ApplicationFailedEvent) {
+ this.handleApplicationFailedEvent((ApplicationFailedEvent) event);
+ } else if (event instanceof ContextClosedEvent) {
+ this.handleContextClosedEvent((ContextClosedEvent) event);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void handleApplicationReadyEvent(ApplicationReadyEvent event) {
+ this.inService = true;
+ }
+
+ @SuppressWarnings("unused")
+ private void handleApplicationFailedEvent(ApplicationFailedEvent event) {
+ this.inService = false;
+ }
+
+ @SuppressWarnings("unused")
+ private void handleContextClosedEvent(ContextClosedEvent event) {
+ // 标记不提供服务
+ this.inService = false;
+
+ // sleep 等待负载均衡完成健康检查
+ for (int i = 0; i < 5; i++) { // TODO 20 需要配置
+ logger.info("[handleContextClosedEvent][优雅关闭,第 {} sleep 等待负载均衡完成健康检查]", i);
+ try {
+ Thread.sleep(1000L);
+ } catch (InterruptedException ignore) {
+ }
+ }
+ }
+
+}
diff --git a/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java
new file mode 100644
index 00000000..d10b18d0
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab40.jenkinsdemo.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @GetMapping("/echo")
+ public String echo() {
+ return "echo";
+ }
+
+}
diff --git a/lab-41/lab-41-demo02/src/main/resources/application-dev.yaml b/lab-41/lab-41-demo02/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/resources/application-dev.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/src/main/resources/application-local.yaml b/lab-41/lab-41-demo02/src/main/resources/application-local.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/resources/application-local.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/src/main/resources/application-pre.yaml b/lab-41/lab-41-demo02/src/main/resources/application-pre.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/resources/application-pre.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/src/main/resources/application-prod.yaml b/lab-41/lab-41-demo02/src/main/resources/application-prod.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/resources/application-prod.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/src/main/resources/application-uat.yaml b/lab-41/lab-41-demo02/src/main/resources/application-uat.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/resources/application-uat.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/src/main/resources/application.yaml b/lab-41/lab-41-demo02/src/main/resources/application.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/src/main/resources/application.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/target/classes/application-dev.yaml b/lab-41/lab-41-demo02/target/classes/application-dev.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/target/classes/application-dev.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/target/classes/application-local.yaml b/lab-41/lab-41-demo02/target/classes/application-local.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/target/classes/application-local.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/target/classes/application-pre.yaml b/lab-41/lab-41-demo02/target/classes/application-pre.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/target/classes/application-pre.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/lab-41-demo02/target/classes/application-uat.yaml b/lab-41/lab-41-demo02/target/classes/application-uat.yaml
new file mode 100644
index 00000000..5475f936
--- /dev/null
+++ b/lab-41/lab-41-demo02/target/classes/application-uat.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 8079
+
+management:
+ server:
+ port: 8078 # 自定义端口,避免 Nginx 暴露出去
+
+ endpoint:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
diff --git a/lab-41/pom.xml b/lab-41/pom.xml
index 46e616bb..2dbcc59a 100644
--- a/lab-41/pom.xml
+++ b/lab-41/pom.xml
@@ -13,6 +13,7 @@
pom
lab-41-demo01
+ lab-41-demo02