diff --git a/README.md b/README.md
index 8831cd78..88944446 100644
--- a/README.md
+++ b/README.md
@@ -65,8 +65,8 @@
## 监控管理
* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34) 。
-* [《芋道 Spring Boot 监控系统 Admin 入门》](http://www.iocoder.cn/Spring-Boot/Admin/?github) 对应 [lab-35](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-35) 。
-* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36) 。
+* [《芋道 Spring Boot 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Boot/Admin/?github) 对应 [lab-35](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-35) 。
+* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-and-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36) 。
## 日志管理
@@ -77,6 +77,7 @@
* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37) 。
* [《芋道 Spring Boot 链路追踪 Zipkin 入门》](http://www.iocoder.cn/Spring-Boot/Zipkin/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。
+* [《芋道 Spring Boot 链路追踪 Pinpoint 入门》](http://www.iocoder.cn/Spring-Boot/Pinpoint/?github) 对应 [lab-39](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。
## 性能测试
diff --git a/lab-35/lab-35-admin-02-adminserver/src/main/resources/application.yaml b/lab-35/lab-35-admin-02-adminserver/src/main/resources/application.yaml
index c9abd7f9..46f0dc1d 100644
--- a/lab-35/lab-35-admin-02-adminserver/src/main/resources/application.yaml
+++ b/lab-35/lab-35-admin-02-adminserver/src/main/resources/application.yaml
@@ -2,4 +2,4 @@ eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka
- register-with-eureka: false
+ register-with-eureka: false # 不注册到 Eureka 中
diff --git a/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo01Application.java b/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo01Application.java
index a06795f3..620f55ec 100644
--- a/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo01Application.java
+++ b/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo01Application.java
@@ -9,7 +9,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
public class Demo01Application {
public static void main(String[] args) {
- System.setProperty("server.port", "18081");
+ System.setProperty("server.port", "18081"); // 端口 18081
SpringApplication.run(Demo01Application.class, args);
}
diff --git a/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo02Application.java b/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo02Application.java
index 38e70956..855d0438 100644
--- a/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo02Application.java
+++ b/lab-35/lab-35-admin-02-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/Demo02Application.java
@@ -9,7 +9,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
public class Demo02Application {
public static void main(String[] args) {
- System.setProperty("server.port", "18082");
+ System.setProperty("server.port", "18082"); // 端口 18082
SpringApplication.run(Demo02Application.class, args);
}
diff --git a/lab-35/lab-35-admin-02-eurekaserver/pom.xml b/lab-35/lab-35-admin-02-eurekaserver/pom.xml
index 1385c45f..ed8af613 100644
--- a/lab-35/lab-35-admin-02-eurekaserver/pom.xml
+++ b/lab-35/lab-35-admin-02-eurekaserver/pom.xml
@@ -13,6 +13,7 @@
lab-35-admin-02-eurekaserver
+
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
diff --git a/lab-35/lab-35-admin-02-eurekaserver/src/main/resources/application.yaml b/lab-35/lab-35-admin-02-eurekaserver/src/main/resources/application.yaml
index 1092425c..0c100e4a 100644
--- a/lab-35/lab-35-admin-02-eurekaserver/src/main/resources/application.yaml
+++ b/lab-35/lab-35-admin-02-eurekaserver/src/main/resources/application.yaml
@@ -1,13 +1,11 @@
spring:
application:
- name: eureka-server
+ name: eureka-server # 应用名
server:
- port: 8761
+ port: 8761 # 自定义服务器端口,避免冲突
eureka:
client:
-# service-url:
-# defaultZone: http://127.0.0.1:8761/eureka/
- register-with-eureka: false
- fetch-registry: false
+ register-with-eureka: false # 不注册到 Eureka 中
+ fetch-registry: false # 不从 Eureka 拉取注册信息
diff --git a/lab-35/lab-35-admin-03-adminserver/pom.xml b/lab-35/lab-35-admin-03-adminserver/pom.xml
new file mode 100644
index 00000000..a9f4516c
--- /dev/null
+++ b/lab-35/lab-35-admin-03-adminserver/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-35-admin-03-adminserver
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+ 2.2.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
diff --git a/lab-35/lab-35-admin-03-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java b/lab-35/lab-35-admin-03-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java
new file mode 100644
index 00000000..4880d840
--- /dev/null
+++ b/lab-35/lab-35-admin-03-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab35.adminserver;
+
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableAdminServer
+public class AdminServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminServerApplication.class, args);
+ }
+
+}
diff --git a/lab-35/lab-35-admin-03-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/config/SecurityConfig.java b/lab-35/lab-35-admin-03-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/config/SecurityConfig.java
new file mode 100644
index 00000000..38482c12
--- /dev/null
+++ b/lab-35/lab-35-admin-03-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/config/SecurityConfig.java
@@ -0,0 +1,46 @@
+package cn.iocoder.springboot.lab35.adminserver.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+
+@Configuration
+@EnableWebFluxSecurity // 开启 Security 对 WebFlux 的安全功能
+public class SecurityConfig {
+
+ @Bean
+ public MapReactiveUserDetailsService userDetailsService() {
+ // 创建一个用户
+ UserDetails user = User.withDefaultPasswordEncoder()
+ .username("user")
+ .password("user")
+ .roles("USER")
+ .build();
+
+ // 如果胖友有更多用户的诉求,这里可以继续创建
+
+ // 创建 MapReactiveUserDetailsService
+ return new MapReactiveUserDetailsService(user);
+ }
+
+ @Bean
+ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+ http.authorizeExchange(exchanges -> // 设置权限配置
+ exchanges
+ .pathMatchers("/assets/**").permitAll() // 静态资源,允许匿名访问
+ .pathMatchers("/login").permitAll() // 登陆接口,允许匿名访问
+ .anyExchange().authenticated() //
+ )
+ .formLogin().loginPage("/login") // 登陆页面
+ .and().logout().logoutUrl("/logout") // 登出界面
+ .and().httpBasic() // HTTP Basic 认证方式
+ .and().csrf().disable(); // csrf 禁用
+ return http.build();
+ }
+
+}
diff --git a/lab-35/lab-35-admin-03-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module b/lab-35/lab-35-admin-03-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module
new file mode 100644
index 00000000..2983af70
Binary files /dev/null and b/lab-35/lab-35-admin-03-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module differ
diff --git a/lab-35/lab-35-admin-03-demo-application/pom.xml b/lab-35/lab-35-admin-03-demo-application/pom.xml
new file mode 100644
index 00000000..d6f1f124
--- /dev/null
+++ b/lab-35/lab-35-admin-03-demo-application/pom.xml
@@ -0,0 +1,43 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-35-admin-03-demo-application
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-client
+ 2.2.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+
diff --git a/lab-35/lab-35-admin-03-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/DemoApplication.java b/lab-35/lab-35-admin-03-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/DemoApplication.java
new file mode 100644
index 00000000..2ac2d631
--- /dev/null
+++ b/lab-35/lab-35-admin-03-demo-application/src/main/java/cn/iocoder/springboot/lab35/demo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab35.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-35/lab-35-admin-03-demo-application/src/main/resources/application.yaml b/lab-35/lab-35-admin-03-demo-application/src/main/resources/application.yaml
new file mode 100644
index 00000000..f8ba4980
--- /dev/null
+++ b/lab-35/lab-35-admin-03-demo-application/src/main/resources/application.yaml
@@ -0,0 +1,31 @@
+management:
+ endpoints:
+ # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+spring:
+ application:
+ name: demo-application # 应用名
+
+ # Spring Security 配置项,对应 SecurityProperties 配置类
+ security:
+ # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。
+ user:
+ name: test # 账号
+ password: test # 密码
+
+ boot:
+ admin:
+ client:
+ url: http://127.0.0.1:8080 # Spring Boot Admin Server 地址
+ username: user # Spring Boot Admin Server 的认证账号
+ password: user # Spring Boot Admin Server 的认证密码
+ instance:
+ metadata:
+ user.name: ${spring.security.user.name} # Actuator 端点的认证账号
+ user.password: ${spring.security.user.password} # Actuator 端点的认证密码
+
+server:
+ port: 18080 # 设置自定义 Server 端口,避免和 Spring Boot Admin Server 端口冲突。
diff --git a/lab-35/lab-35-admin-03-demo-application/target/classes/META-INF/lab-35-admin-01-demo-application.kotlin_module b/lab-35/lab-35-admin-03-demo-application/target/classes/META-INF/lab-35-admin-01-demo-application.kotlin_module
new file mode 100644
index 00000000..2983af70
Binary files /dev/null and b/lab-35/lab-35-admin-03-demo-application/target/classes/META-INF/lab-35-admin-01-demo-application.kotlin_module differ
diff --git a/lab-35/lab-35-admin-03-demo-application/target/classes/application.yaml b/lab-35/lab-35-admin-03-demo-application/target/classes/application.yaml
new file mode 100644
index 00000000..f8ba4980
--- /dev/null
+++ b/lab-35/lab-35-admin-03-demo-application/target/classes/application.yaml
@@ -0,0 +1,31 @@
+management:
+ endpoints:
+ # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+spring:
+ application:
+ name: demo-application # 应用名
+
+ # Spring Security 配置项,对应 SecurityProperties 配置类
+ security:
+ # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。
+ user:
+ name: test # 账号
+ password: test # 密码
+
+ boot:
+ admin:
+ client:
+ url: http://127.0.0.1:8080 # Spring Boot Admin Server 地址
+ username: user # Spring Boot Admin Server 的认证账号
+ password: user # Spring Boot Admin Server 的认证密码
+ instance:
+ metadata:
+ user.name: ${spring.security.user.name} # Actuator 端点的认证账号
+ user.password: ${spring.security.user.password} # Actuator 端点的认证密码
+
+server:
+ port: 18080 # 设置自定义 Server 端口,避免和 Spring Boot Admin Server 端口冲突。
diff --git a/lab-35/lab-35-admin-04-adminserver/pom.xml b/lab-35/lab-35-admin-04-adminserver/pom.xml
new file mode 100644
index 00000000..439ac519
--- /dev/null
+++ b/lab-35/lab-35-admin-04-adminserver/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-35-admin-04-adminserver
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+ 2.2.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+
+
+
diff --git a/lab-35/lab-35-admin-04-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java b/lab-35/lab-35-admin-04-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java
new file mode 100644
index 00000000..4880d840
--- /dev/null
+++ b/lab-35/lab-35-admin-04-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab35.adminserver;
+
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableAdminServer
+public class AdminServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminServerApplication.class, args);
+ }
+
+}
diff --git a/lab-35/lab-35-admin-04-adminserver/src/main/resources/application.yaml b/lab-35/lab-35-admin-04-adminserver/src/main/resources/application.yaml
new file mode 100644
index 00000000..a0df428f
--- /dev/null
+++ b/lab-35/lab-35-admin-04-adminserver/src/main/resources/application.yaml
@@ -0,0 +1,13 @@
+spring:
+ mail: # 配置发送告警的邮箱
+ host: smtp.126.com
+ username: wwbmlhh@126.com
+ password: '******'
+ default-encoding: UTF-8
+
+ boot:
+ admin:
+ notify:
+ mail:
+ from: ${spring.mail.username} # 告警发件人
+ to: 7685413@qq.com # 告警收件人
diff --git a/lab-35/lab-35-admin-04-adminserver/target/classes/META-INF/lab-35-admin-02-adminserver.kotlin_module b/lab-35/lab-35-admin-04-adminserver/target/classes/META-INF/lab-35-admin-02-adminserver.kotlin_module
new file mode 100644
index 00000000..2983af70
Binary files /dev/null and b/lab-35/lab-35-admin-04-adminserver/target/classes/META-INF/lab-35-admin-02-adminserver.kotlin_module differ
diff --git a/lab-35/lab-35-admin-04-adminserver/target/classes/application.yaml b/lab-35/lab-35-admin-04-adminserver/target/classes/application.yaml
new file mode 100644
index 00000000..42f4fdcf
--- /dev/null
+++ b/lab-35/lab-35-admin-04-adminserver/target/classes/application.yaml
@@ -0,0 +1,13 @@
+spring:
+ mail:
+ host: smtp.126.com
+ username: wwbmlhh@126.com
+ password: wwb3743
+ default-encoding: UTF-8
+
+ boot:
+ admin:
+ notify:
+ mail:
+ from: wwbmlhh@126.com
+ to: 7685413@qq.com
diff --git a/lab-35/lab-35-admin-05-adminserver/pom.xml b/lab-35/lab-35-admin-05-adminserver/pom.xml
new file mode 100644
index 00000000..afb618e3
--- /dev/null
+++ b/lab-35/lab-35-admin-05-adminserver/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-35-admin-05-adminserver
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+ 2.2.0
+
+
+
+
diff --git a/lab-35/lab-35-admin-05-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java b/lab-35/lab-35-admin-05-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java
new file mode 100644
index 00000000..4880d840
--- /dev/null
+++ b/lab-35/lab-35-admin-05-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/AdminServerApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab35.adminserver;
+
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableAdminServer
+public class AdminServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminServerApplication.class, args);
+ }
+
+}
diff --git a/lab-35/lab-35-admin-05-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/notify/LoggerNotifier.java b/lab-35/lab-35-admin-05-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/notify/LoggerNotifier.java
new file mode 100644
index 00000000..9a8409e4
--- /dev/null
+++ b/lab-35/lab-35-admin-05-adminserver/src/main/java/cn/iocoder/springboot/lab35/adminserver/notify/LoggerNotifier.java
@@ -0,0 +1,34 @@
+package cn.iocoder.springboot.lab35.adminserver.notify;
+
+import de.codecentric.boot.admin.server.domain.entities.Instance;
+import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
+import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
+import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
+import de.codecentric.boot.admin.server.notify.AbstractEventNotifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Mono;
+
+@Component
+public class LoggerNotifier extends AbstractEventNotifier {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ public LoggerNotifier(InstanceRepository repository) {
+ super(repository);
+ }
+
+ @Override
+ protected Mono doNotify(InstanceEvent event, Instance instance) {
+ return Mono.fromRunnable(() -> {
+ if (event instanceof InstanceStatusChangedEvent) {
+ logger.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
+ ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
+ } else {
+ logger.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(), event.getType());
+ }
+ });
+ }
+
+}
diff --git a/lab-35/lab-35-admin-05-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module b/lab-35/lab-35-admin-05-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module
new file mode 100644
index 00000000..2983af70
Binary files /dev/null and b/lab-35/lab-35-admin-05-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module differ
diff --git a/lab-35/pom.xml b/lab-35/pom.xml
index adf758a1..49df4e0b 100644
--- a/lab-35/pom.xml
+++ b/lab-35/pom.xml
@@ -18,6 +18,12 @@
lab-35-admin-02-adminserver
lab-35-admin-02-demo-application
lab-35-admin-02-eurekaserver
+
+ lab-35-admin-03-adminserver
+ lab-35-admin-03-demo-application
+
+ lab-35-admin-04-adminserver
+ lab-35-admin-05-adminserver