⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_48721706/article/details/126092702 「hmb↑」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

一、简介

用于对 Spring Boot 应用的管理和监控。可以用来监控服务是否健康、是否在线、以及一些jvm数据等等。

Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client),服务端和客户端之间采用 http 通讯方式实现数据交互;单体项目中需要整合 spring-boot-admin-client 才能让应用被监控。

在 SpringCloud 项目中,spring-boot-admin-server 是直接从注册中心抓取应用信息,不需要每个微服务应用整合 spring-boot-admin-client 就可以实现应用的管理和监控。

主要的功能点有:

  • 显示应用程序的监控状态
  • 应用程序上下线监控
  • 查看 JVM,线程信息
  • 可视化的查看日志以及下载日志文件
  • 动态切换日志级别
  • Http 请求信息跟踪

二、搭建

1、服务端

需先搭建服务端,监控服务,被监控的服务连接过来即可,开箱即用。

1、新建一个项目做为服务端

2、引入spring-boot-admin服务端依赖

 <!--用于检查系统的监控情况-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Spring Boot Admin Server监控服务端-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.1</version>
</dependency>
<!--增加安全防护,防止别人随便进-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

3、启动类上开启admin@EnableAdminServer

4、security安全防护配置

import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

private final String adminContextPath;

public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}


@Override
protected void configure(HttpSecurity http) throws Exception {
// 登录成功处理类
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");

http.authorizeRequests()
//静态文件允许访问
.antMatchers(adminContextPath + "/assets/**").permitAll()
//登录页面允许访问
.antMatchers(adminContextPath + "/login", "/css/**", "/js/**", "/image/*").permitAll()
//其他所有请求需要登录
.anyRequest().authenticated()
.and()
//登录页面配置,用于替换security默认页面
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
//登出页面配置,用于替换security默认页面
.logout().logoutUrl(adminContextPath + "/logout").and()
.httpBasic().and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers(
"/instances",
"/actuator/**"
);
}
}

5、yml配置

server:
port: 9111
spring:
boot:
admin:
ui:
title: HMB服务监控中心
client:
instance:
metadata:
tags:
environment: local
#要获取的client的端点信息
probed-endpoints: health,env,metrics,httptrace:trace,threaddump:dump,jolokia,info,logfile,refresh,flyway,liquibase,heapdump,loggers,auditevents
monitor: # 监控发送请求的超时时间
default-timeout: 20000
security: # 设置账号密码
user:
name: admin
password: admin
# 服务端点详细监控信息
management:
trace:
http:
enabled: true
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always

6、启动项目

访问 http://ip:端口,如我的http://localhost:9111,账号密码都是admin(上面的security配的)

7、自定义服务状态变化后,提醒功能

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.notify.AbstractStatusChangeNotifier;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@Component
public class WarnNotifier extends AbstractStatusChangeNotifier {
public WarnNotifier(InstanceRepository repository) {
super(repository);
}

@Override
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
// 服务名
String serviceName = instance.getRegistration().getName();
// 服务url
String serviceUrl = instance.getRegistration().getServiceUrl();
// 服务状态
String status = instance.getStatusInfo().getStatus();
// 详情
Map<String, Object> details = instance.getStatusInfo().getDetails();
// 当前服务掉线时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
// 拼接短信内容
StringBuilder str = new StringBuilder();
str.append("服务名:【" + serviceName + "】 \r\n");
str.append("服务状态:【"+ status +"】 \r\n");
str.append("地址:【" + serviceUrl + "】\r\n");
str.append("时间:" + format +"\r\n");

return Mono.fromRunnable(()->{
// 这里写你服务发生改变时,要提醒的方法
// 如服务掉线了,就发送短信告知
});
}
}

8、服务端配置

配置 默认参数 解释
spring.boot.admin.context-path / server端的访问路径
spring.boot.admin.monitor.status-interval 10,000ms 检查实例状态的时间间隔。
spring.boot.admin.monitor.status-lifetime 10,000ms client端状态的生命周期,该生命周期内不会更新client状态。单位是毫秒
spring.boot.admin.monitor.info-interval 1m 查询实例信息的时间间隔。
spring.boot.admin.monitor.info-lifetime 1m info的生命周期,该生命周期内不会更新info状态。
spring.boot.admin.monitor.default-timeout 10,000 发出请求时的默认超时。可以使用spring.boot.admin.monitor.timeout.*重写特定端点的单独值。
spring.boot.admin.monitor.timeout.* 每个endpointId超时的键值对。默认default-timeout
spring.boot.admin.monitor.default-retries 0 失败请求的默认重试次数。修改请求(PUT, POST, PATCH, DELETE)永远不会重试。可以使用spring.boot.admin.monitor.retries.*重写特定端点的单个值。
spring.boot.admin.monitor.retries.* 键值对,包含每个endpointId的重试次数。默认为default-retries。修改请求(PUT, POST, PATCH, DELETE)永远不会重试。
spring.boot.admin.metadata-keys-to-sanitize “.password " , " . ∗ s e c r e t ", ".*secret ",".∗secret”, “.*key " , " . ∗ t o k e n ", ".*token ",".∗token”, “.*credentials.”, “.*vcap_services$” 匹配这些regex模式的键的元数据值将在所有json输出中被清除。
spring.boot.admin.probed-endpoints “health”, “env”, “metrics”, “httptrace:trace”, “threaddump:dump”, “jolokia”, “info”, “logfile”, “refresh”, “flyway”, “liquibase”, “heapdump”, “loggers”, “auditevents” 要获取的client的端点信息
spring.boot.admin.instance-auth.enabled true 启用从Spring配置属性中提取凭证
spring.boot.admin.instance-auth.default-user-name null 用于验证注册服务的默认用户名。该spring.boot.admin.instance-auth.enabled属性必须为true。
spring.boot.admin.instance-auth.default-user-password null 用于验证注册服务的默认用户密码。该spring.boot.admin.instance-auth.enabled属性必须为true。
spring.boot.admin.instance-auth.service-map.*.user-name 用于使用指定名称对注册的服务进行身份验证的用户名。该spring.boot.admin.instance-auth.enabled属性必须为true。
spring.boot.admin.instance-auth.service-map.*.user-password 用户密码,用于使用指定名称对注册的服务进行身份验证。该spring.boot.admin.instance-auth.enabled属性必须为。
spring.boot.admin.instance-proxy.ignored-headers “Cookie”, “Set-Cookie”, “Authorization” 向客户提出请求时,不转发标题。
spring.boot.admin.ui.public-url <img src=“assets/img/icon-spring-boot-admin.svg”><\span>Spring Boot Admin </span > 用于在ui中构建基本href的基本URL。 如果在反向代理后面运行(使用路径重写),则可以用来进行正确的自我引用。如果省略主机/端口,将从请求中推断出来。
spring.boot.admin.ui.brand 要在导航栏中显示的品牌。
spring.boot.admin.ui.title “Spring Boot Admin” 要显示的页面标题。
spring.boot.admin.ui.login-icon “assets/img/icon-spring-boot-admin.svg” 在登录页面上用作图像的图标。
spring.boot.admin.ui.favicon “assets/img/favicon.png” 用作默认图标的图标,用于桌面通知的图标。
spring.boot.admin.ui.favicon-danger “assets/img/favicon-danger.png” 当一项或多项服务关闭并用作桌面通知时,用作收藏夹图标。
启用spring.boot.admin.ui.remember-me true 切换为在登录页面上显示/隐藏“记住我”复选框。
spring.boot.admin.ui.poll-timer.cache 2500 以毫秒为单位的轮询持续时间,以获取新的缓存数据。
spring.boot.admin.ui.poll-timer.datasource 2500 以毫秒为单位的轮询持续时间,以获取新的数据源数据。
spring.boot.admin.ui.poll-timer.gc 2500 以毫秒为单位的轮询持续时间,以获取新的gc数据。
spring.boot.admin.ui.poll-timer.process 2500 以毫秒为单位的轮询持续时间,以获取新的过程数据。
spring.boot.admin.ui.poll-timer.memory 2500 以毫秒为单位的轮询持续时间,以获取新的内存数据。
spring.boot.admin.ui.poll-timer.threads 2500 以毫秒为单位的轮询持续时间,以获取新的线程数据。

2、客户端

被监控的服务,需要连接服务端

1、依赖

<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、yml配置

server:
port: 9222

spring:
application:
name: client
boot:
admin:
client: # spring-boot-admin 客户端配置
url: http://localhost:9111 #服务端连接地址
username: admin # 服务端账号
password: admin # 服务端密码
instance:
prefer-ip: true # 使用ip注册

# 服务端点详细监控信息
management:
# health: # 检测服务状态是通过http://localhost:9111/actuator/health接口,可去掉不用检测项
# mail: # 健康检测时,不要检测邮件
# enabled: false
trace:
http:
enabled: true
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
logfile: # 日志(想在线看日志才配)
external-file: ./logs/client-info.log # 日志所在路径

3、启动项目

此时客户端就已经注册进来了。

点击可查看更多信息

点击日志也可在线查看日志

此时,如果我们服务掉线了,就会触发服务端的预警功能,告知我们。

4、客户端配置

配置 默认值 解释
spring.boot.admin.client.enabled true 是否启用springbootAdmin客户端
spring.boot.admin.client.url 要注册的server端的url地址。如果要同时在多个server端口注册,则用逗号分隔各个server端的url地址
spring.boot.admin.client.api-path “instances” 管理服务器上注册端点的http路径。
spring.boot.admin.client.username, spring.boot.admin.client.password SBA Server api使用HTTP基本认证保护时使用的用户名和密码。
spring.boot.admin.client.period 10,000 重复注册的时间间隔(ms)。(client通过持续不断地向server端进行注册来保持client端与server端的连接)
spring.boot.admin.client.connect-timeout 5,000 连接注册超时时间(毫秒)。
spring.boot.admin.client.read-timeout 5,000 注册读取超时,单位是毫秒
spring.boot.admin.client.auto-registration true 若设置为true,则在应用就绪后自动调度注册应用的定时任务。
spring.boot.admin.client.auto-deregistration null 是否开启自动注销,如果服务端运行在云平台,默认值是true
spring.boot.admin.client.register-once true 如果设置为true,客户端将只注册一个管理服务器(按照spring.boot.admin.instance.url定义的顺序);如果该管理服务器宕机,将自动向下一个管理服务器注册。如果为false,将在所有管理服务器上注册。
spring.boot.admin.client.instance.health-url 根据management-url和endpoint .health.id 要注册的Health-url。在可达URL不同的情况下可以被重写(例如Docker)。在注册表中必须唯一。
spring.boot.admin.client.instance.management-base-url 根据management-base-url和management.context-path 要注册的Management-url。可被覆盖的情况下可达的url是不同的(例如Docker)。
spring.boot.admin.client.instance.service-base-url 根据主机名、server.port 用于计算service-url 的基本URL。该路径值在运行时进行获取并赋值给 base url。
spring.boot.admin.client.instance.service-url 根据service-base-url和server.context-path 要注册的Service-url。可被覆盖的情况下可达的url是不同的(例如Docker)。
spring.boot.admin.client.instance.service-path / 要注册的服务路径。在可达路径不同的情况下可以被重写(例如,以编程方式设置的上下文路径)。
spring.boot.admin.client.instance.name ${spring.application.name} 注册的服务名称,覆盖spring.application.name
spring.boot.admin.client.instance.prefer-ip false 在注册的url中使用ip地址而不是主机名。如果true,将使用ip:port。否则将使用InetAddress.getLocalHost()返回的IP地址。
spring.boot.admin.client.instance.metadata.* 与此实例关联的元数据键-值对。
spring.boot.admin.client.instance.metadata.tags.* 标记为与此实例关联的键-值对。

3、微服务

除特别说明外,都是在上面的基础上添加

3.1、服务端

1、添加依赖

<!--  nacos注册中心配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>

2、yml添加配置

spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# namespace: # 要和你的服务同一命名空间

3.2、客户端

客户端不用引spring-boot-admin-starter-clien依赖,springbootadmin会去服务列表里找

如果服务有配置context-path路径,则需添加yml配置

spring:
cloud:
nacos:
discovery:
metadata: # minitor监控的context-path配置
management:
context-path: ${server.servlet.context-path}/actuator

4、我的微服务预警发送其他服务状态信息思路

问题:由于该组件重写状态发生变化时的接口,没有提供其他服务的状态信息,只有本服务,但是如果是集群、多实例,我又想知道,该服务其他实例或者其他的服务状态信息,是否存活。

思路:我在发送预警之前,访问其他服务的检测健康接口,如:http://localhost:7050/attendance/actuator/nacos-discovery,有返回值,就可提取里面的信息,报错了说明没有该服务没有启动

结果展示:如我的预警内容,发送当前服务状态、当前服务剩余健康实例、其他健康服务数等等

文章目录
  1. 1. 一、简介
  2. 2. 二、搭建
    1. 2.1. 1、服务端
    2. 2.2. 2、客户端
      1. 2.2.0.1. 1、依赖
      2. 2.2.0.2. 2、yml配置
      3. 2.2.0.3. 3、启动项目
      4. 2.2.0.4. 4、客户端配置
  3. 2.3. 3、微服务
    1. 2.3.0.1. 3.1、服务端
    2. 2.3.0.2. 3.2、客户端
  • 2.4. 4、我的微服务预警发送其他服务状态信息思路