大家好,我是蒼何。
在脈脈上看到這條帖子,說阿里 P8 因為上面 P9 斗爭失敗走人,以超齡 35 被裁,Boss 上找工作半年,到現在還處于失業中。
看了下溝通記錄, 溝通了 1000 多次,但沒有一個邀請投遞簡歷的,大受震撼。因為早年在阿里待過,所以對阿里 P8 這個 title 的含金量還是知道的,先不說是很高 P,但能升到 P8 這個段位的,多少還是有點能力的。
當然了無論是做 PPT 的能力還是處理問題的能力,最起碼都屬于一種區別于普通人的能力嘛。按理說這個級別出來工作應該是隨便找,不至于找半年沒找到一份工作。
于是有網友認為,有點兒扯,說到了 P8 這個級別不應該會因為上級的派系斗爭被搞走,而且對其艱難找工作不大相信。
但也有人從這件事上分析原因覺得,因為這個 P8 處于 35 歲年齡高危人群,是個傳話筒,薪酬高,競爭力有待考證。
拋去別的不說,我覺得不至于沒有一個公司給他發簡歷投遞邀請,但這件事我覺得從側面反映出一個問題,那就是以前互聯網那套玩法行不通了,即使在大廠,該被裁還是得被裁,出來后,能接住這么高的工資的公司除了另外一個大廠基本沒有,小公司和國企是很難給到他們原先在大廠工資的。
我跟很多大廠的朋友經常聊天,談起裁員這個話題,雖說他們對現在的環境憤憤不平,但又無能為力。但我經常和他們分享我自己的觀點:不管在哪兒,一定要有自己的一點小生意。
在大廠可能負責的是一個大平臺里面的一小處螺絲,然后就自以為創造了很多的價值,加班加點的 coding,最后甚至連平臺到底吸引什么樣的用戶?市場在哪里?ARR 表現如何?實際帶來什么樣的價值都沒搞明白就稀里糊涂的被裁了。
建立自己的小生意,業余時間做一點點小而美的事情,不僅僅限于 coding,從市場、營銷、產品等多角度來思考這個小生意創造的價值。
我也一直在踐行這個理念,包括最近業余時間投身的開源項目,也是屬于小而美的事情。而且我也會持續做這方面的分享,build in public,一起成長。
今天分享的是微服務改造過程中,監控中心的搭建要領和流程。
什么是服務監控
服務監控概念
在說概念前,其實可以借助一下生活中的一個例子來理解:
想象你是一位餐館經理。你的餐館里有很多員工在不同崗位工作:廚師在做飯,服務員在端菜,收銀員在結賬。如果你想讓餐館順利運營,你需要知道每個員工的工作狀態。如果某個崗位出現問題,比如廚師突然生病了,你需要及時知道并做出調整,以確保餐館正常運作,不會影響顧客體驗。
服務監控就像是餐館經理對員工工作狀態的監視。它包括以下幾個方面:
- 系統應用狀態: 就像經理需要知道每個員工在做什么,服務監控需要知道每個系統應用在做什么,是否正常運行。
- 內存和線程: 就像餐館需要確保有足夠的食材和員工,系統也需要足夠的內存和線程來處理任務。監控這些可以確保系統不會因為資源不足而崩潰。
- 堆棧: 就像經理需要知道每道菜的制作流程,監控堆棧信息可以幫助了解程序的執行流程,找出哪里出了問題。
- 日志: 就像經理需要記錄每天的銷售和反饋,系統日志記錄了所有的操作和錯誤信息,方便追蹤和排查問題。
服務監控的主要目的是在問題發生或即將發生時,能準確、快速地發現問題,從而減小影響范圍。就像餐館經理能及時發現并處理員工的問題,以避免影響整個餐館的運營。
服務監控在微服務改造過程中的重要性不言而喻,沒有強大的監控能力,改造成微服務架構后,就無法掌控各個不同服務的情況,在遇到調用失敗時,如果不能快速發現系統的問題,對于業務來說就是一場災難。
服務常用技術棧
1、Spring Boot Actuator
Spring Boot Actuator 提供了一系列內置的端點,用于監控和管理 Spring Boot 應用程序。它可以暴露健康檢查、應用信息、環境變量、JVM 指標、HTTP 請求追蹤等。
適用于使用 Spring Boot 構建的微服務應用,集成簡單,功能強大。
以下是一些常見端點:
地址 | 描述 |
---|---|
/beans | 顯示所有的Spring bean列表 |
/caches | 顯示所有的緩存相關信息 |
/scheduledtasks | 顯示所有的定時任務相關信息 |
/loggers | 顯示所有的日志相關信息 |
/configprops | 顯示所有的配置信息 |
/env | 顯示所有的環境變量信息 |
/mappings | 顯示所有控制器相關信息 |
/info | 顯示自定義用戶信息配置 |
/metrics | 顯示應用指標相關信息 |
/health | 顯示健康檢查狀態信息,up表示成功 down表示失敗 |
/threaddump | 顯示程序線程的信息 |
2、Micrometer
Micrometer 是一個用于 JVM 應用程序的應用指標度量庫。它提供與多種監控系統的集成,如 Prometheus、Graphite、JMX、New Relic、Datadog 等。需要在 Spring Boot 之外的 JVM 應用中進行指標監控,或者需要集成到多種監控系統中。優勢是其有統一的 API,便于擴展和集成。
3、Dropwizard Metrics
Dropwizard Metrics 提供了一組用于度量 JVM 應用程序性能的工具,包括計數器、計時器、儀表等。它可以與多種后端系統集成,如 Graphite、Ganglia、Prometheus 等。需要在非 Spring Boot 應用中實現詳細的性能度量。優勢:輕量級,易于集成,功能全面。
如何做好監控
我本次使用的是利用 Spring Boot Actuator 配合 Admin-Ui,整合 Nacos,來做的各個微服務的系統監控。以下是具體的步驟:
新建監控中心微服務
監控中心一定是單獨部署的一個微服務,不要和其他微服務做藕和,其中建微服務系統其實就是 4 步:
- 建 Module
- 改 pom
- 加 yml
- 啟動類啟動
在 idea 中右鍵項目新建 Module 命名 monitor,建監控中心微服務:
一個微服務就建好了,接下來需要添加必要的依賴和配置。
添加依賴
因為需要整合 Nacos,以及配合 web ui 和登錄認證,故引入以下 jar:
<dependencies><!-- SpringBoot Admin --><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>${spring-boot-admin.version}</version></dependency><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud Config Client,用于配置的動態刷新 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringBoot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies>
添加配置
配置有獨立服務配置和 Nacos 共享配置以及微服務 Nacos 配置,三份配置共同作用于微服務系統,其中優先級順序是Nacos 共享配置>微服務 Nacos 配置>獨立服務配置
對于每個微服務都需要的配置放在共享配置中,本次這部分不做改動,另外是微服務的 Nacos 配置和本地配置如下:
本地配置:bootstrap.yml
# Tomcat
server:port: 端口# Spring
spring: application:# 應用名稱name: monitorprofiles:# 環境配置active: devcloud:nacos:discovery:# 服務注冊地址server-addr: 127.0.0.1:端口config:# 配置中心地址server-addr: 127.0.0.1:端口# 配置文件格式file-extension: yml# 共享配置shared-configs:- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
Nacos 配置:monitor-dev.yml
# spring
spring:security:user:name: web頁面中的用戶名password: 密碼boot:admin:ui:title: 服務狀態監控
通過以上步驟直接訪問微服務地址即可直接訪問,這里監控中心的微服務沒有直接走網關,而是直接暴露出來,因為其內部自己做了鑒權處理,就不走網關通用鑒權了。
監控有用功能
web ui 頁面
在 UI 頁面上可以清晰的看出服務系統的情況,方便直觀,而且耦合性比較低。以下是我項目的監控情況:
點進去每一個微服務可看到具體監控信息:
登錄認證
配合 admin,加上 Spring security 權限控制,我們只需要按照步驟配置一下賬戶和密碼即可。權限配置類:
/*** 監控權限配置* * @author ruoyi*/
@EnableWebSecurity
public class WebSecurityConfigurer
{private final String adminContextPath;public WebSecurityConfigurer(AdminServerProperties adminServerProperties){this.adminContextPath = adminServerProperties.getContextPath();}@Beanpublic SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception{SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();successHandler.setTargetUrlParameter("redirectTo");successHandler.setDefaultTargetUrl(adminContextPath + "/");return httpSecurity.headers().frameOptions().disable().and().authorizeRequests().antMatchers(adminContextPath + "/assets/**", adminContextPath + "/login", adminContextPath + "/actuator/**", adminContextPath + "/instances/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and().logout().logoutUrl(adminContextPath + "/logout").and().httpBasic().and().csrf().disable().build();}
}
這樣,每次登錄 UI 頁面就需要進行賬號密碼登錄鑒權,其走的不是網關統一鑒權所以需要單獨配置。
實時日志
Spring Boot Admin提供了基于Web頁面的方式實時查看服務輸出的本地日志,前提是服務中配置了logging.file.name。
需要在單個微服務的 bootstrap.yml配置logging.file.name配置:
logging:file:name: logs/${spring.application.name}/info.log
對于單獨差某個微服務信息來說,實時日志還是挺方便的。
監控通知
當微服務監控檢查沒通過,或者服務上線、離線或者服務發生未知異常,希望發送通知到制定的人,就可以直接通過如下配置即可:
/*** @author canghe* @description 通知發送配置* @create 2024-05-16-17:32*/
@Component
public class PmHubStatusChangeNotifier extends AbstractStatusChangeNotifier {public PmHubStatusChangeNotifier(InstanceRepository repository) {super(repository);}@Overrideprotected Mono<Void> doNotify(InstanceEvent event,de.codecentric.boot.admin.server.domain.entities.Instance instance) {return Mono.fromRunnable(() -> {if (event instanceof InstanceStatusChangedEvent) {String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();switch (status) {// 健康檢查沒通過case "DOWN":System.out.println("發送 健康檢查沒通過 的通知!");break;// 服務離線case "OFFLINE":System.out.println("發送 服務離線 的通知!");break;// 服務上線case "UP":System.out.println("發送 服務上線 的通知!");break;// 服務未知異常case "UNKNOWN":System.out.println("發送 服務未知異常 的通知!");break;default:break;}}});}
}
通過以上步驟,微服務系統中的服務監控就簡單集成了,對于監控中的業務邏輯,比如通知消息等就可以自己去實現他。
以上是今天的分享,感謝您的閱讀!