关键词:
本文是Spring Cloud专栏的第十三篇文章,了解前十二篇文章内容有助于更好的理解本文:
一、前言
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.yml文件中添加配置,然后启动
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.yml文件中添加配置,然后启动
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.yml中添加用户名、密码
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.yml文件中添加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.yml配置文件如下,然后启动
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
史上最简单的springcloud教程|第十三篇:断路器聚合监控(hystrixturbine)
...要聚合所以服务的HystrixDashboard的数据了。这就需要用到SpringCloud的另一个组件了,即HystrixTurbine。看单个的HystrixDashboard的数据并没有什么多大的价值,要想看这个系统的HystrixDashboard数据就需要用到HystrixTurbine。HystrixTurbine将每个... 查看详情
第十三篇jquerymobile
1.创建Button <button>按钮</button> <inputtype="button"value="按钮"/ > <ahref="#"class="ui-btnui-shadow(阴影)">按钮</a>//一排可以放多个按钮ui-btn-inline(横向排列) <divclass="controlg 查看详情
第十三篇:html和css入门
一、HTML本质以及在WEB程序中的作用二、HTML的head内标签三、HTML的body内标签四、body内标签之lnput系列五、超链接六、图片及表格七、fieldset标签和label标签八、标签总结九、CSS选择器十、CSS之float样式十一、CSS之display样式十二、CSS... 查看详情
c++从入门到入土第十三篇:vector的模拟实现
第十三篇oc_uicollectionview的基本配置
-(UICollectionView*)categoryCollectionView{if(!_categoryCollectionView){//创建布局UICollectionViewFlowLayout*layout=[[UICollectionViewFlowLayoutalloc]init];layout.itemSize=CGSizeMake(KItemWidth,KItemHeigh 查看详情
第十三篇js操作table表格
JS操作table表格这节课难度可能高一点,因为没有提前解释if判断、for循环。这节课是直接把这两样用上了,老师先简单介绍一下:if,判断语句,判断就很简单了嘛,假如说1=1(1等于1),当然是真的了对吧,那么1=2呢,那就是假的... 查看详情
opencv入门指南第十三篇人脸检测(代码片段)
【OpenCV入门指南】第十三篇人脸检测 本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别)。人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影。甚至很多高校... 查看详情
第十三篇商城系统-商城检索服务(代码片段)
商城检索服务1.检索页面的搭建 商品检索页面我们放在search服务中处理,首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖<!--添加Thymeleaf的依赖--><dependency><groupId>org.springframework.boot</groupId><... 查看详情
第十三篇camunda系列-事件篇-结束事件(代码片段)
结束事件1.错误结束事件 当流程执行到达**错误结束事件(errorendevent)**时,结束执行的当前分支,并抛出错误。这个错误可以由匹配的错误边界中间事件捕获。如果找不到匹配的错误边界事件,将会抛出异常。通过具体案... 查看详情
第十三篇camunda系列-事件篇-结束事件(代码片段)
结束事件1.错误结束事件 当流程执行到达**错误结束事件(errorendevent)**时,结束执行的当前分支,并抛出错误。这个错误可以由匹配的错误边界中间事件捕获。如果找不到匹配的错误边界事件,将会抛出异常。通过具体案... 查看详情
#java学习之路——基础阶段二(第十三篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容。前言:此随笔主要是J... 查看详情
第十三篇flowable事件-消息事件(代码片段)
Flowable消息事件 消息事件(messageevent),是指引用具名消息的事件。消息具有名字与载荷。与信号不同,消息事件只有一个接收者1.启动事件 消息启动事件,也就是我们通过接收到某些消息后来启动流... 查看详情
第十三篇:成员函数与非成员函数的选择
前言 相信很多使用C++语言的人都有这么一种错误的观点-除了主函数,其他函数都应当声明为某个类的成员函数,以实现封装性。 这种观点错在哪里?我们又该如何在成员函数与非成员函数之... 查看详情
第十三章springcloud之gateway路由
#######gateway 路由案例#######1、pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc 查看详情
第十三篇:multimap容器和multiset容器中的find操作
前言 multimap容器是map容器的“增强版”,它允许一个键对应多个值。对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器。那么对于multimap容器来说,find函数将如何运作呢?如果要实现... 查看详情
linux篇第十三篇——多线程(线程概念+线程控制)(代码片段)
⭐️本篇博客开始要给大家介绍多线程相关的知识,多线程的内容比较多,所以我分三篇进行讲述,本篇博客主要讨论多线程的概念和多线程的控制,希望对你认识线程有所帮助。目录🌏Linux下的线程🌲... 查看详情
第十三篇:上下文无关语法context-freegrammar
目录回顾上下文无关语法基础为什么是“上下文无关”Context-Free上下文无关vs.Regular常规/正则CFG解析这意味着什么?但是大纲组成部分句法成分移动替换协调成分和短语CFGTrees算术表达式的CFG解析CYK算法转换为乔姆斯基范式CNF... 查看详情
c++从青铜到王者第十三篇:stl之list类的模拟实现(代码片段)
系列文章目录文章目录系列文章目录前言一、list的模拟实现二、list与vector之间的对比总结前言一、list的模拟实现#include<iostream>#include<assert.h>#pragmaoncenamespaceyyw template<classT> struct_list_node _list_node<T>*_n 查看详情