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
posted @ 2020-12-15 13:55  景小布  阅读(616)  评论(0)    收藏  举报