劉林
(北京大學(xué),北京100871)
近些年,微服務(wù)架構(gòu)[1]一詞在軟件領(lǐng)域廣泛傳播,它是一種新的軟件架構(gòu)風(fēng)格,越來越多的項(xiàng)目采用了這種軟件風(fēng)格。它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間相互協(xié)調(diào)、互相配合,為用戶提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)和服務(wù)之間采用輕量級(jí)的通信機(jī)制相互溝通(通常是基于HTTP 的Restful API)。每個(gè)服務(wù)都圍繞著具體的業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立的部署到生產(chǎn)環(huán)境中。
微服務(wù)架構(gòu)將整個(gè)應(yīng)用拆分成多個(gè)分散的服務(wù),一次API 請求往往需要涉及多個(gè)服務(wù),服務(wù)之間的調(diào)用關(guān)系越來越復(fù)雜,發(fā)生故障時(shí)定位問題越來越困難。此時(shí),亟需一款合適的分布式鏈路監(jiān)控系統(tǒng)來解決這些問題。通過對(duì)目前各個(gè)APM(Application Performance Management)[2]功能對(duì)比[3],確定采用適合Java語言的Pinpoint[4]分布式鏈路監(jiān)控系統(tǒng)。
在對(duì)Pinpoint 深入了解中,發(fā)現(xiàn)它的報(bào)警機(jī)制偏弱,在應(yīng)用出現(xiàn)異常時(shí)不能及時(shí)的通知相關(guān)人員。在本文中,對(duì)Pinpoint 報(bào)警機(jī)制進(jìn)行重新設(shè)計(jì),采用微信公眾號(hào)報(bào)警通知。
Pinpoint 分布式鏈路監(jiān)控系統(tǒng)由三個(gè)主要組件構(gòu)成。
(1)Pinpoint Agent 端,依附在Java 應(yīng)用程序上,負(fù)責(zé)從應(yīng)用上采集各種指標(biāo)數(shù)據(jù)并傳輸給Collector 端。它利用Java Agent 機(jī)制,采用修改應(yīng)用字節(jié)碼的方式將邏輯植入到相關(guān)的類中,對(duì)原有的代碼無任何侵入。
(2)Pinpoint Collector 端,接受agent 端傳輸過來的采集數(shù)據(jù),將這些數(shù)據(jù)分析、整理和加工,把處理好的數(shù)據(jù)存儲(chǔ)到HBase 數(shù)據(jù)庫中,通過Web 界面來查看各種監(jiān)控?cái)?shù)據(jù)。
(3)Pinpoint Web,部署在Web 容器中,屬于展示端,在Web 頁面上顯示各種統(tǒng)計(jì)數(shù)據(jù),方便相關(guān)人員進(jìn)行查看和排查問題。
目前Pinpoint 監(jiān)控系統(tǒng)中報(bào)警通知機(jī)制比較簡單,以應(yīng)用為基本單位,統(tǒng)計(jì)該應(yīng)用下接口的各種監(jiān)控指標(biāo),如接口超時(shí)數(shù)量、接口報(bào)錯(cuò)數(shù)量等。定時(shí)程序按固定時(shí)間段去統(tǒng)計(jì)這些指標(biāo),觸發(fā)閾值后發(fā)送郵件給指定人。以應(yīng)用為統(tǒng)計(jì)維度,范圍太大,粒度不夠細(xì)。定時(shí)統(tǒng)計(jì)時(shí)效性也不夠,延遲厲害。
通常,應(yīng)用程序?qū)ν馓峁┙y(tǒng)一的API 接口來為其他應(yīng)用服務(wù)。本文中采用以API 接口為維度來統(tǒng)計(jì)該接口的異常數(shù)量、超時(shí)數(shù)量等指標(biāo),實(shí)時(shí)地把異常信息發(fā)送到相關(guān)人員的微信上,該優(yōu)化方案涉及三個(gè)部分。
(1)在Collector 端,對(duì)各個(gè)應(yīng)用整理完成的接口指標(biāo)數(shù)據(jù)以JSON 數(shù)據(jù)格式存入RabbitMQ[5]中,各個(gè)字段意義和格式如下:
(2)由于監(jiān)控系統(tǒng)接入的應(yīng)用數(shù)量眾多,接口調(diào)用的請求量很高,需要分析的接口數(shù)據(jù)量非常巨大,所以這里采用RabbitMQ 消息隊(duì)列來傳遞數(shù)據(jù),主要起到異步、解耦的作用。
(3)日志分析平臺(tái),從系統(tǒng)中讀取配置文件,配置文件里定義了各個(gè)接口的超時(shí)時(shí)間,異常數(shù)量,發(fā)送微信聯(lián)系人等項(xiàng),子配置項(xiàng)覆蓋默認(rèn)配置項(xiàng),如接口沒有定義配置項(xiàng)的按默認(rèn)配置計(jì)算,系統(tǒng)配置和說明如下:
日志分析平臺(tái)從RabbitMQ 中消費(fèi)數(shù)據(jù),以接口為維度進(jìn)行分組,結(jié)合配置文件分析在單位時(shí)間內(nèi)是否接口觸發(fā)報(bào)警閾值,如符合條件發(fā)送報(bào)警信息。整體架構(gòu)如圖1 所示。
圖1
在開源分布式鏈路追蹤Pinpoint 的基礎(chǔ)上,Collector端把處理完成的接口數(shù)據(jù)發(fā)送到RabbitMQ 中,日志報(bào)警平臺(tái)從RabbitMQ 中消費(fèi)數(shù)據(jù),根據(jù)系統(tǒng)的配置項(xiàng)對(duì)接口數(shù)據(jù)進(jìn)行分析,在單位時(shí)間內(nèi)符合報(bào)警閾值的,把接口相關(guān)信息發(fā)送給相關(guān)人的微信公眾號(hào)上,相關(guān)人員能及時(shí)了解接口的信息,第一時(shí)間處理有異常的接口,大大提高了解決問題的效率,減少不必要的業(yè)務(wù)損失。