本文是 Spring Cloud 专栏的第十三篇文章, 了解前十二篇文章内容有助于更好的理解本文:
Spring Cloud 第一篇 | Spring Cloud 前言及其常用组件介绍概览
Spring Cloud 第二篇 | 使用并认识 Eureka 注册中心
Spring Cloud 第三篇 | 搭建高可用 Eureka 注册中心
Spring Cloud 第四篇 | 客户端负载均衡 Ribbon
Spring Cloud 第五篇 | 服务熔断 Hystrix
Spring Cloud 第六篇 | Hystrix 仪表盘监控 Hystrix Dashboard
Spring Cloud 第七篇 | 声明式服务调用 Feign
Spring Cloud 第八篇 | Hystrix 集群监控 Turbin
Spring Cloud 第九篇 | 分布式服务跟踪 Sleuth
Spring Cloud 第十篇 | 分布式配置中心 Config
Spring Cloud 第十一篇 | 分布式配置中心高可用
Spring Cloud 第十二篇 | 消息总线 Bus
一, 前言
Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序. 这些应用程序通过 Spring Boot Admin Client(通过 HTTP)注册或者使用 Spring Cloud(例如 Eureka)发现. UI 只是 Spring Boot Actuator 端点上的一个 AngularJS 应用程序.
原理: Spring Boot Actuator 模块为监控 Spring Boot 应用程序暴露的大量的管理端点[ENDPOINT], 在 Spring Boot Actuator 的基础上提供简洁的可视化 web UI, 是用来管理 Spring Boot 应用程序的一个简单的界面.
二, 使用 Spring Boot Admin 监控服务
Spring Boot Admin 也分为 server 和 client(普通应用程序)
1, 搭建 Admin 服务端
1-1, 创键 springboot admin 服务端模块(springboot-admin-server)
1-2, 添加 springboot admin 服务端依赖
- <dependency>
- <groupId>de.codecentric</groupId>
- <artifactId>spring-boot-admin-starter-server</artifactId>
- <version>2.1.0</version>
- </dependency>
1-3, 在主类上添加注解 @EnableAdminServer
1-4, 在 application.YAML 文件中添加配置, 然后启动
- server:
- port: 8788
- spring:
- application:
- name: springboot-admin-server
2, 搭建 Admin 客户端
2-1, 创建 springboot admin 客户端模块(springcloud-admin-client)
2-2, 添加 springboot admin 客户端依赖
- <dependency>
- <groupId>de.codecentric</groupId>
- <artifactId>spring-boot-admin-starter-client</artifactId>
- <version>2.1.0</version>
- </dependency>
2-3, 在 application.YAML 文件中添加配置, 然后启动
- server:
- port: 8080
- spring:
- application:
- name: springcloud-admin-client
- boot:
- admin:
- client:
- #springboot admin client 连接 spring boot admin server 端点地址 springboot admin client 连接 spring boot admin server 端点地址
- url: http://localhost:8788
- instance:
- #默认使用的是主机名注册, 改为使用 ip 注册
- prefer-ip: true
- management:
- endpoints:
- Web:
- exposure:
- #开放所有页面节点 默认只开启了 health,info 两个节点
- include: '*'
- endpoint:
- health:
- #显示健康具体信息 默认不会显示详细信息
- show-details: always
- # 利用 info 端点, 加入版本等信息
- info:
- versin: @project.version@
- name: @project.artifactId@
- group: @project.groupId@
- description: @project.description@
- #还可以自定义信息
- author: Coding Farmer
- blog: http://www.coding-farmer.cn
2-4, 启动访问 spring boot admin 服务端页面 http://localhost:8788, 显示如下
3, 给 Sring Boot Admin 添加认证
i, 修改 admin 服务端 (springboot-admin-server) 模块
3-i-1, 在生产环境中, 为了数据的安全, 还是需要加上安全认证的, 具体的可以查看官方文档: https://codecentric.github.io/spring-boot-admin/2.1.0/#_securing_spring_boot_admin_server, 相对比较简单, 简单来说就是加入 spring-boot-starter-security 进行安全认证.
3-i-2, 在 admin 服务端 (springboot-admin-server) 模块添加依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
3-i-3, 在 application.YAML 中添加用户名, 密码
- spring:
- security:
- user:
- name: coding-farmer
- password: 123456
3-i-4, 编辑 SpringbootAdminServerApplication.java 文件, 修改为
- package com.springcloudlearn;
- import de.codecentric.boot.admin.server.config.AdminServerProperties;
- import de.codecentric.boot.admin.server.config.EnableAdminServer;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
- 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;
- @EnableAdminServer
- @SpringBootApplication
- public class SpringbootAdminServerApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootAdminServerApplication.class, args);
- }
- @Configuration
- public static class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
- private final String adminContextPath;
- public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
- this.adminContextPath = adminServerProperties.getContextPath();
- }
- @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()
- .httpBasic().and()
- .csrf()
- .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
- .ignoringAntMatchers(
- adminContextPath + "/instances",
- adminContextPath + "/actuator/**"
- );
- // @formatter:on
- }
- }
- }
3-i-5, 访问 http://localhost:8788
ii, 修改 admin 客户端 (springboot-admin-client) 模块
3-ii-1, 由于服务端配置了密码, 客户端访问的时候需要密码, 这是基于 SBA 访问模式, 也就是所谓的直接连接 springboot admin 服务端模式, 在 application.YAML 文件中添加 username,password
- spring:
- application:
- name: springcloud-admin-client
- boot:
- admin:
- client:
- #springboot admin client 连接 spring boot admin server 端点地址 springboot admin client 连接 spring boot admin server 端点地址
- url: http://localhost:8788
- instance:
- #默认使用的是主机名注册, 改为使用 ip 注册
- prefer-ip: true
- username: coding-farmer
- password: 123456
3-ii-2, 然后启动客户端 (springboot-admin-client) 模块, 访问 http://localhost:8788, 查看客户端服务注册到了 admin 服务端上
三, 使用 Spring Boot Admin 监控 Spring Cloud 服务结合 Eureka 注册中心
当我们监控微服务的时候, 服务数量众多, 我们肯定想统一管理微服务, 我可以将服务全部注册到注册中心上, admin 会自己拉取 Eureka 上注册的应用信息, 主动去注册. 这也是唯一区别之前手动注册 (SBA 连接方式) 的地方, 就是 client 端不需要 admin-client 的依赖, 也不需要配置 admin 地址了, 一切全部由 admin-server 自己实现. 这样的设计对环境变化很友好, 不用改了 admin-server 后去改所有应用的配置了.
1, 在上面基础上继续修改 Admin 服务端
1-1, 添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
1-2, 在启动类上添加 Eureka 的注解 @EnableEurekaClient
1-3, 修改后 application.YAML 配置文件如下, 然后启动
- server:
- port: 8788
- spring:
- application:
- name: springboot-admin-server
- security:
- user:
- name: coding-farmer
- password: 123456
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8700/eureka
- #客户端每隔 30 秒从 Eureka 服务上更新一次服务信息
- registry-fetch-interval-seconds: 30
- #需要将我的服务注册到 eureka 上
- register-with-eureka: true
- #需要检索服务
- fetch-registry: true
- #心跳检测检测与续约时间
- instance:
- #告诉服务端, 如果我 10s 之内没有给你发心跳, 就代表我故障了, 将我剔除掉, 默认 90s
- #Eureka 服务端在收到最后一次心跳之后等待的时间上限, 单位为秒, 超过则剔除(客户端告诉服务端按照此规则等待自己)
- lease-expiration-duration-in-seconds: 10
- #每隔 2s 向服务端发送一次心跳, 证明自已依然活着, 默认 30s
- #Eureka 客户端向服务端发送心跳的时间间隔, 单位为秒(客户端告诉服务端自己会按照该规则)
- lease-renewal-interval-in-seconds: 2
- # 启用 ip 配置 这样在注册中心列表中看见的是以 ip + 端口呈现的
- prefer-ip-address: true
- # 实例名称 最后呈现地址: ip:2002
- instance-id: ${spring.cloud.client.ip-address}:${server.port}
- health-check-url-path: /actuator/health
- #Eureka 中的 metadataMap 是专门用来存放一些自定义的数据,
- # 当注册中心或者其他服务需要此服务的某些配置时可以在 metadataMap 里取.
- # 实际上, 每个 instance 都有各自的 metadataMap,map 中存放着需要用到的属性.
- # 例如, 上面配置中的 eureka.instance.metadata-map.username, 当这个服务成功注册到 Eureka 上,
- # Spring Boot Admin 就会取拿到这个 instance, 进而拿到 metadataMap 里的属性,
- # 然后放入请求头, 向此服务发送请求, 访问此服务的 Actuator 开放的端点.
- #说白了, 这个为了连接到自己, 把密码告诉 eureka,spring boot admin server 拿着密码去连接客户端应用, 监控信息
- metadata-map:
- user.name: ${spring.security.user.name}
- user.password: ${spring.security.user.password}
- # 使用注册中心后, 他 admin 也可以监控自身服务状况
- management:
- endpoints:
- Web:
- exposure:
- #开放所有页面节点 默认只开启了 health,info 两个节点
- include: '*'
- endpoint:
- health:
- #显示健康具体信息 默认不会显示详细信息
- show-details: always
- # 利用 info 端点, 加入版本等信息
- info:
- versin: @project.version@
- name: @project.artifactId@
- group: @project.groupId@
- description: @project.description@
- #还可以自定义信息
- author: Coding Farmer
- blog: http://www.coding-farmer.cn
1-4, 访问如下 http://localhost:8788, 使用注册中心之后他也可以监控自身服务的状况
2, 在上面基础上继续修改 Admin 客户端
2-1, 添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
2-2, 在启动类上添加注解 @EnableEurekaClient
2-3, 启动 Admin 客户端, 然后访问 Admin 服务端 http://localhost:8788, 你会看到还有 Admin 服务端已被监控了
详细参考案例源码: https://gitee.com/coding-farmer/spirngcloud-learn
来源: https://www.cnblogs.com/coding-farmer/p/12309272.html