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