1. 程式人生 > 實用技巧 >SpringBoot 專案的管理與監控

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: [email protected]
    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: [email protected]
#          to: [email protected] 
  • 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