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