SpringBootAdmin+SpringCloud整合[视频教程]
疯狂创客圈经典图书:⾯试必备 + ⾯试必备 + ⾯试必备【】
疯狂创客圈经典图书:⼤⼚必备 + ⼤⼚必备 + ⼤⼚必备【】
⼊⼤⼚+涨⼯资必备:⾼并发【亿级流量IM实战】实战系列【 SpringCloud Nginx秒杀】实战系列【】
此⽂的配套视频:稍后放出
使⽤SpringBoot Admin 进⾏⽇志的记录
SpringBootAdmin⽤来管理和监控SpringBoot、SpringCloud 应⽤程序,它利⽤spring-boot-starter-actuator提供的功能,将各个微服务的状态整合到⼀起,并提供良好的界⾯查看⽀持,并且能够动态的修改实例⽇志级别。SpringBootAdmin分为server端和client端,server端可查看各个微服务的状态,client端将微服务注册到server端。
1、SpringBoot Admin 简介
使⽤SpringBoot Admin进⾏⽇志的记录,可以很轻松的是实现对SpringBoot、SpringCloud项⽬运⾏状态
的监控。Spring Boot Admin本⾝也是⼀个Web应⽤,每个Spring Boot应⽤程序都被视为客户端并注册到管理服务器。
Spring Boot Admin是⼀个开源社区项⽬,⽤于管理和监控SpringBoot应⽤程序。 应⽤程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使⽤SpringCloud注册中⼼(例如
Eureka,Nacos)发现。 UI是的Vue.js应⽤程序,展⽰Spring Boot Admin Client的Actuator端点上的⼀些监控。常见的功能如下:
显⽰健康状况
显⽰详细信息,例如
JVM和内存指标
micrometer.io指标
数据源指标
缓存指标
显⽰内部信息
关注并下载⽇志⽂件
查看JVM系统和环境属性
查看Spring Boot配置属性
⽀持Spring Cloud的可发布/ env-和// refresh-endpoint
轻松的⽇志级别管理
与JMX-beans交互
查看线程转储
查看http-traces
查看审核事件
查看http端点
查看预定的任务
查看和删除活动会话(使⽤spring-session)
查看Flyway / Liquibase数据库迁移
下载heapdump
状态更改通知(通过电⼦邮件,Slack,Hipchat等)
状态更改的事件⽇志(⾮持久性)
Spring Boot Admin 背后的数据采集是由Spring Boot Actuator端点提供。actuator相关映射,启动时会⾃动加载
2、使⽤ SpringBoot Admin 监控服务
Admin-Server并注册到Nacos:创建⼀个SpringBoot项⽬,命名为provider-monitor,引⼊如下SpringCloud、Nacos、SpringBoot Admin的依赖:
1.1 导⼊依赖
<!-->spring-boot-admin-starter-server-->
<dependency>
<groupId&decentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${spring-boot-admin.version}</version>
</dependency>
<!--健康检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
版本需要配套,否则会抛出异常:
<spring-boot.version>2.0.8.RELEASE</spring-boot.version>
<spring-boot-admin.version>2.0.0</spring-boot-admin.version>
1.2 配置yml
#### 暴露端点
management:
endpoints:
web:
base-path: "/actuator" # 配置 Endpoint 的基础路径
exposure:
include: '*' #在yaml ⽂件属于关键字,所以需要加引号
endpoint:
logfile:
# spring boot admin client不配置⽇志⽂件路径(同时配置l对应的⽇志输出配置,否则⽆法输出⽇志),
# 控制台上的Logging模块下的Logfile会报错:Fetching logfile failed.Request failed with status code 404
external-file: E:/logs/service-provider-demo/logs/output.log
enabled: true
health:
show-details: always
# 未配置/注释以下内容
# boot:
# admin:
# context-path: consumer
1.3 集成spring security
官⽅说明:
由于有多种⽅法可以解决分布式Web应⽤程序中的⾝份验证和授权,因此Spring Boot Admin不会提供默认⽅法。默认情况下spring-boot-admin-server-ui提供登录页⾯和注销按钮。
我们这⾥采⽤spring security提供安全保障,在Spring Boot Admin Server中统⼀配置
Web应⽤程序中的⾝份验证和授权有多种⽅法,因此Spring Boot Admin不提供默认⽅法。默认情况下,spring-boot-admin-server-ui提供登录页⾯和注销按钮。我们结合 Spring Security 实现需要⽤户名和密码登录的安全认证。
sc-admin-server⼯程的pom⽂件需要增加以下的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
在 sc-admin-server⼯的配置⽂件 l 中配置 spring security 的⽤户名和密码,这时需要在服务注册时带上 metadata-map 的信息,如下:
spring:
security:
user:
name: "admin"
password: "admin"
eureka:
instance:
metadata-map:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
@EnableWebSecurity注解以及WebSecurityConfigurerAdapter⼀起配合提供基于web的security。继
承了WebSecurityConfigurerAdapter之后,再加上⼏⾏代码,我们就能实现要求⽤户在进⼊应⽤的任何URL之前都进⾏验证的功能,写⼀个配置类SecuritySecureConfig继承WebSecurityConfigurerAdapter,配置如下:
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = ContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
http.authorizeRequests()
//授予对所有静态资产和登录页⾯的公共访问权限。
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
//必须对每个其他请求进⾏⾝份验证
.anyRequest().authenticated()
.and()
//配置登录和注销
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
//启⽤HTTP-Basic⽀持。这是Spring Boot Admin Client注册所必需的
.httpBasic().and();
// @formatter:on
}
}
1.4 启动器类
添加 @EnableAdminServer 注解
azymaker.springcloud.adminserver;
decentric.boot.fig.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run( AdminServerApplication.class, args );
}
}
admin 会⾃⼰拉取 Eureka 上注册的 app 信息,主动去注册。这也是唯⼀区别之前⼊门中⼿动注册的地⽅,就是 client 端不需要 admin-client 的依赖,也不需要配置 admin 地址了,⼀切全部由 admin-server ⾃⼰实现。这样的设计对环境变化很友好,不⽤改了admin-server后去改所有app 的配置了。
1.5、测试
3.actuator 启⽤和暴露端点
执⾏器端点使您可以监视应⽤程序并与之交互。Spring Boot包含许多内置端点,您可以添加⾃⼰的端点。例如,health端点提供基本的应⽤程序运⾏状况信息。
每个端点都可以启⽤或禁⽤。这控制了是否创建了端点以及它的bean在应⽤程序上下⽂中是否存在。为了可以远程访问,端点还必须通过JMX或HTTP公开。⼤多数应⽤程序选择HTTP,其中终结点的ID和前缀/actuator映射到URL。例如,默认情况下,health端点映射到/actuator/health。
端点列表:
ID描述
auditevents公开当前应⽤程序的审核事件信息。需要⼀个AuditEventRepositoryBean。
beans显⽰应⽤程序中所有Spring Bean的完整列表。
caches公开可⽤的缓存。
conditions显⽰在配置和⾃动配置类上评估的条件以及它们匹配或不匹配的原因。
configprops显⽰所有的整理列表@ConfigurationProperties。
env公开Spring的属性ConfigurableEnvironment。
flyway显⽰已应⽤的所有Flyway数据库迁移。需要⼀个或多个FlywayBean。
health显⽰应⽤程序运⾏状况信息。
httptrace显⽰HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应交换)。需要⼀个HttpTraceRepositoryBean。
info显⽰任意应⽤程序信息。
integrationgraph显⽰Spring Integration图。需要对的依赖spring-integration-core。
loggers显⽰和修改应⽤程序中记录器的配置。
liquibase显⽰已应⽤的所有Liquibase数据库迁移。需要⼀个或多个LiquibaseBean。
metrics显⽰当前应⽤程序的“指标”信息。
mappings显⽰所有@RequestMapping路径的整理列表。
scheduledtasks显⽰应⽤程序中的计划任务。
sessions允许从Spring Session⽀持的会话存储中检索和删除⽤户会话。需要使⽤Spring Session的基于Servlet的Web应⽤程序。
shutdown使应⽤程序正常关闭。默认禁⽤。
threaddump执⾏线程转储。
如果您的应⽤程序是Web应⽤程序(Spring MVC,Spring WebFlux或Jersey),则可以使⽤以下附加端点:
ID描述
heapdump返回hprof堆转储⽂件。
jolokia通过HTTP公开JMX bean(当Jolokia在类路径上时,不适⽤于WebFlux)。需要对的依赖jolokia-core。
logfile返回⽇志⽂件的内容(如果已设置logging.file.name或logging.file.path属性)。⽀持使⽤HTTP Range标头来检索部分⽇志⽂件的内容。
conditions显⽰在配置和⾃动配置类上评估的条件以及它们匹配或不匹配的原因。
prometheus以Prometheus服务器可以抓取的格式公开指标。需要对的依赖micrometer-registry-prometheus。
3.1 启⽤端点
默认情况下,除了shutdown端点是关闭的,其它的都是启⽤的。
1)启⽤shutdown端点
2)关闭默认端点
spring mvc和boot区别3)启⽤info端点
禁⽤的端点将从应⽤程序上下⽂中完全删除。
如果只想更改公开端点的技术,请使⽤include和exclude属性。
3.2 暴露端点
停⽌公开所有在JMX上公开的端点,只公开info和health两个端点,使⽤如下属性:
通过HTTP公开所有的端点,除了env和beans端点,使⽤如下的属性:
[端点参考资料]:
4.微服务Provider改造
对前⾯的 service-consumer-demo、service-provider-demo 两个微服务进⾏改造, 加⼊spring-boot-admin的监控。
4.1 导⼊依赖
<!-- admin-client -->
<dependency>
<groupId&decentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
2.2 配置yml
# 服务名
spring:
application:
name: admin-client
# 指定admin监控中⼼地址
boot:
admin:
client:
url: localhost:9009
# 服务端⼝
server:
port: 9010
# 定义⽇志⽂件输出路径 [注释后不显⽰本服务的 logfile 模块]
logging:
file: E:/data/adminTest/logs/output.log
# include 暴露端点
management:
endpoints:
web:
exposure:
include: '*'
# 在访问/actuator/health时显⽰完整信息
endpoint:
health:
show-details: always
使⽤context-path
很多时候项⽬由于模块⽐较多,通常会配置servlet的context-path属性增加⼀节路径加以区分不同服务,如下
server:
port: 8005
servlet:
context-path: /activity
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.36:8848
metadata:
management:
context-path: ${t-path}/actuator
加上spring security密码
在Spring Boot Admin Server中统⼀配置采⽤spring security提供安全保障,客户端需要配置security账号密码,服务注册时带上metadata-map信息.
5 实现在线⽇志查看
具体操作:
5.1、添加jar包
org.slf4j slf4j-api 1.7.25
5.3 在l平级⽂件夹中添加l配置⽂件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="APP_Name" value="adminTest"/>
<contextName>${APP_Name}</contextName>
<!--定义⽇志⽂件的存储地址勿在 LogBack 的配置中使⽤相对路径,请根据需求配置路径-->
<property name="LOG_HOME" value="E:/data/adminTest/logs"/>
<!-- 彩⾊⽇志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩⾊⽇志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="adminTest >> ${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(LN:%L){faint} % <!-- 控制台输出 -->
<appender name="STDOUT" class="ch.ConsoleAppender">
<encoder class="ch.qos.der.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天⽣成⽇志⽂件 -->
<appender name="FILE" class="ch.olling.RollingFileAppender">
<file>${LOG_HOME}/output.log</file>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名-->
<FileNamePattern>${LOG_HOME}/output-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.der.PatternLayoutEncoder">
<!--格式化输出:%d表⽰⽇期,%thread表⽰线程名,%-5level:级别从左显⽰5个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="pe.descriptor.sql.BasicBinder" level="WARN"/>
<logger name="pe.descriptor.sql.BasicExtractor" level="WARN"/>
<logger name="org.hibernate.SQL" level="WARN"/>
<logger name="ine.QueryParameters" level="DEBUG"/>
<logger name="ine.query.HQLQueryPlan" level="WARN"/>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="WARN"/>
<logger name="java.sql.Connection" level="WARN"/>
<logger name="java.sql.Statement" level="WARN"/>
<logger name="java.sql.PreparedStatement" level="WARN"/>
<logger name="org.apache.shiro" level="WARN"/>
<logger name="springfox.documentation" level="WARN"/>
<!-- ⽇志输出级别,注意:如果不写<appender-ref ref="FILE" /> ,将导致springboot Admin不到⽂件,⽆法查看⽇志 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
log.path 如何使⽤环境变量呢?
某些情况下需要变量设置个默认值,以防出现⽐较恶⼼的 _IS_UNDEFINED 后缀( log4j不存在的变量会留空)
只要使⽤" :- " 操作符即可(冒号+减号)。
⽐如 log.path 没有定义, 使⽤该变量的地⽅就会变成** log.path_IS_UNDEFINED**, 给他⼀个默认值
${log.path:-/var/logs/myapp}
4.4 actuator的配置
#### 暴露端点
management:
endpoints:
web:
base-path: "/actuator" # 配置 Endpoint 的基础路径
exposure:
include: '*' #在yaml ⽂件属于关键字,所以需要加引号
endpoint:
logfile:
# spring boot admin client不配置⽇志⽂件路径(同时配置l对应的⽇志输出配置,否则⽆法输出⽇志),
# 控制台上的Logging模块下的Logfile会报错:Fetching logfile failed.Request failed with status code 404
external-file: E:/logs/service-provider-demo/logs/output.log
enabled: true
health:
show-details: always
# 未配置/注释以下内容
# boot:
# admin:
# context-path: consumer
四、测试结果
1.不暴露端点测试
# 未配置/注释以下内容
management:
endpoints:
web:
exposure:
include: "*"
123456
监控中⼼后台 除Detials外 所有功能失效
3.正常情况
可以通过springbootAdmin调整各个包下的⽇志等级,相当⽅便
6 与Nacos(或Eureka)结合的好处
到这⾥就结束,可以直接启动。admin会⾃⼰拉取Nacos(或Eureka)上注册的Provider信息,主动去注册。
这也是唯⼀区别之前⼿动注册的地⽅,就是Provider 端不需要配置admin地址了,⼀切全部由admin-server⾃⼰实现。这样的,不⽤在改了admin-server之后,强制去改所有Provider的配置了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论