SpringBoot 项目的管理与监控
一. 遇到的困扰
我是做游戏后台服务的,支撑客户端,服务端,有些项目功能能够合并,有些需要分开,有些需要部署国内服务器,有些需要部署国外服务器,随着小项目越来越多,管理与监控起来越来越麻烦,有些功能自己都不知道部署在那一块了,目前运行情况怎么样了,所以就想着搭建一下监控与管理系统,目前自己也在研究阶段,各种失败,最后搭建了一个小的demo。
二. 用到的工具
- portainer中文汉化版
- Spring Boot Admin
- Sentinel
三. Docker的图形化管理工具portainer安装
由于我所有运行的工具都是基于docker的,所以先把docker的图形化界面搭建起来,管理较为方便
创建映射本地docker路径
mkdir -p /data/portainer/data /data/portainer/public cd cd /data/portainer wget https://dl.quchao.net/Soft/Portainer-CN.zip unzip Portainer-CN.zip -d public
运行Portainer
docker run -di --restart=always --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data -v /data/portainer/public:/public portainer/portainer
- /var/run/docker.sock:/var/run/docker.sock 映射本地docker路径
- /data/portainer/data:/data 实现数据持久化(portainer的数据存储在容器内部的/data目录,容易导致容器重启的时候数据丢失,作用:将portainer数据映射到本地)
- /data/portainer/public:/public 映射portainer的中文目录

四. Spring Boot Admin项目的搭建
Spring Boot Admin是一个开源社区项目,用于管理和监控Spring Boot®应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul)发现。 UI是的AngularJs应用程序,展示Spring Boot Admin Client的Actuator端点上的一些监控。主要的功能就不具体详说了。
Spring Boot Admin Server服务端的基本配置
服务端集成了:
- spring security登陆模块
- 邮箱报警功能模块
pom文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
</parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
</dependencies>
application.yml文件
server:
port: 8080
servlet:
context-path: /admin/
spring:
mail:
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
host: smtp.163.com
username: 18711111111@163.com
password: PHHSMSAFITPIGIBO
port: 25
application:
name: admin-server
security:
user:
name: jingxc
password: 123456
boot:
admin:
ui:
external-views:
- label: "Sentinel"
url: http://127.0.0.1:8858/
order: 2000
- label: "portainer"
url: http://127.0.0.1:9000/
order: 2000
# notify:
# mail:
# from: 1871111111@163.com
# to: 1050602455@qq.com
- servlet:context-path: /admin/ 配置个性化访问地址
- mail:设置链接邮箱账号信息
- security:集成登录模块配置账号和密码
- external-views:配置嵌入外部页面,本示例嵌入了
- portainer中文汉化版
- Sentinel
-
notify:配置服务状态改变发送邮箱账号
SecuritySecureConfig-security登陆配置
package com.game.server.config; 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.csrf.CookieCsrfTokenRepository; @Configuration public class SecuritySecureConfig extends WebSecurityConfigurerAdapter { private final String contextPath; public SecuritySecureConfig(AdminServerProperties adminServerProperties) { this.contextPath = adminServerProperties.getContextPath(); } @Override protected void configure(HttpSecurity http) throws Exception { // 跨域设置,SpringBootAdmin客户端通过instances注册,见InstancesController http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringAntMatchers(contextPath + "/instances"); http.authorizeRequests().antMatchers(contextPath + "/assets/**").permitAll(); // 静态资源 http.authorizeRequests().anyRequest().authenticated(); // 所有请求必须通过认证 // 整合spring-boot-admin-server-ui http.formLogin().loginPage("/login").permitAll(); http.logout().logoutUrl("/logout").logoutSuccessUrl("/login"); // 启用basic认证,SpringBootAdmin客户端使用的是basic认证 http.httpBasic(); } }
Spring Boot Admin Client客户端基本配置
客户端集成了:
-
sentinel
- log4j
pom文件
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.0.4</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> <scope>compile</scope> </dependency> </dependencies>
application.yml文件
spring:
cloud:
sentinel:
eager: true
transport:
# sentinel dashboard 地址
dashboard: 172.17.0.5:8858
# 默认为8719,如果被占用会自动+1,直到找到为止
# 本地机器ip
#client-ip: 192.168.188.137
boot:
admin:
client:
url: http://172.17.0.4:8080/admin
instance:
#设置基础访问路径,用于查看参数配置
service-base-url: Http://172.17.0.8:8082
username: jingxc
password: 123456
server:
port: 8082
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS
logging:
file: /var/log/uu_test/client.log
- dashboard:配置sentinel的访问地址,由于本文基于同一台服务器,同一个docker部署,所以IP地址直接写docker内部ip地址
-
boot:admin:client:url: http://172.17.0.4:8080/admin Spring Boot Admin服务端的访问地址,可以直接写成外部IP
- service-base-url: Http://172.17.0.8:8082 基于docker部署的话该配置比较关键否则有可能访问不到具体客户端详细数据
-
management:暴露自己的actuator的所有端口信息
- logging:日志输出配置
自定义监控内容:例
package com.uu.server.health; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class SendHealth implements HealthIndicator { @Override public Health health() { return new Health.Builder().withDetail("usercount", 10) //自定义监控内容 .withDetail("userstatus", "up").up().build(); } }
配置定时任务:例
package com.uu.server.corn; import java.time.LocalDateTime; import java.util.Random; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @Configuration // 1.主要用于标记配置类,兼备Component的效果。 @EnableScheduling // 2.开启定时任务 public class SaticScheduleTask { // 3.添加定时任务 @Scheduled(cron = "0/5 * * * * ?") // 或直接指定时间间隔,例如:5秒 // @Scheduled(fixedRate=5000) private void configureTasks() { Random r = new Random(); int ran1 = r.nextInt(10); for (int i = 1; i <= ran1; i++) { new Thread(() -> { System.out.println(ran1); System.err.println("执行静态定时任务时间: " + LocalDateTime.now()); }).start(); } } }

五. Sentinel 控制台
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。另外,鉴权在生产环境中也必不可少
Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性.
docker部署Sentinel
1.查找镜像:
docker search sentinel
2.拉取镜像:
docker pull bladex/sentinel-dashboard
3.运行镜像:
docker run --name sentinel -di -p 8858:8858 -p 8719:8719 bladex/sentinel-dashboard

六. 参考链接
- https://www.cnblogs.com/xiao987334176/p/12691686.html
- https://www.cnblogs.com/forezp/p/10242004.html
- https://codecentric.github.io/spring-boot-admin/current

浙公网安备 33010602011771号