隨着微服務架構的流行,一些微服務架構下的問題也會越來越突出,比如一個請求會涉及多個服務,而服務本身可能也會依賴其他服務,整個請求路徑就構成了一個網狀的調用鏈,而在整個調用鏈中一旦某個節點發生異常,整個調用鏈的穩定性就會受到影響,所以會深深的感受到 “銀彈” 這個詞是不存在的,每種架構都有其優缺點 。
SkyWalking是一個開源監控平台,用於從服務和雲原生基礎設施收集、分析、聚合和可視化數據。
SkyWalking提供了一種簡單的方法來維護分布式系統的清晰視圖,甚至可以跨雲查看。它是一種現代APM,專門為雲原生、基於容器的分布式系統設計。
SkyWalking從三個維度對應用進行監視:service(服務), service instance(實例), endpoint(端點)
service: 一個服務
Service Instance: 服務的實例(1個服務會啟動多個節點)
Endpoint: 一個服務中的其中一個接口
服務和實例就不多說了,端點是服務中的某個路徑或者說URI
SkyWalking允許用戶了解服務和端點之間的拓撲關系,查看每個服務/服務實例/端點的度量,並設置警報規則。
1.架構
SkyWalking邏輯上分為四個部分:Probes(探針), Platform backend(平台后端), Storage(存儲), UI
可以看到主要由四部分組成:
- Agent(也叫Probe):代理或者探針,集成在被監測的應用中(SDK形式或者動態注入),采集應用的數據發送給后端(OAP)。
- UI:自帶的Web頁面。
- OAP:后端,接收Agent的數據並進行分析。Agent和OAP通信走的是gRPC,端口號默認為11800;UI和OAP通信走的是HTTP接口,端口號默認為12800。
- Storage:后端存儲,OAP處理后的數據存儲在這里。生產比較常用的是MySQL和ES。
這個結構就很清晰了,探針就是Agent負責采集數據並上報給服務端,服務端對數據進行處理和存儲,UI負責展示
SkyWalking 的核心是數據分析和度量結果的存儲平台,通過 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量數據,SkyWalking Collecter 對數據進行分析和聚合,存儲到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我們可以通過 SkyWalking UI 的可視化界面對最終的結果進行查看。Skywalking 支持從多個來源和多種格式收集數據:多種語言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘測、Envoy 度量等數據格式。
整體架構看似模塊有點多,但在實際上還是比較清晰的,主要就是通過收集各種格式的數據進行存儲,然后展示。所以搭建 Skywalking 服務我們需要關注的是 SkyWalking Collecter、SkyWalking UI 和 存儲設備,SkyWalking Collecter、SkyWalking UI 官方下載安裝包內已包含,最終我們只需考慮存儲設備即可。
Backend的gRPC相關的API可訪問0.0.0.0/11800,rest相關的API可訪問0.0.0.0/12800。
在Java,.NetCore,Node.js, Istio agents/probe中,設置gRPC服務地址為ip/host:11800。 (ip/host填寫Backend暴露的)
UI 監聽8080 端口,同時請求127.0.0.1/12800來做GraphQL查詢。
2.下載與安裝
SkyWalking有兩種版本,ES版本和非ES版。
如果我們決定采用ElasticSearch作為存儲,那么就下載es版本。(老版本區分,新版本不區分)
https://skywalking.apache.org/downloads/
https://archive.apache.org/dist/skywalking/
agent目錄將來要拷貝到各服務所在機器上用作探針
bin目錄是服務啟動腳本
config目錄是配置文件
oap-libs目錄是oap服務運行所需的jar包
webapp目錄是web服務運行所需的jar包
SkyWalking 個人建議直接下載官方編譯好的,下載地址:https://skywalking.apache.org/downloads/
然后在解壓后的目錄執行bin/startup.sh即可啟動(Windows下執行startup.bat),這樣默認啟動了兩個模塊:
- Skywalking UI,默認端口為8080。
- Skywalking OAP,即后端。默認存儲使用的是H2數據庫,對於測試和體驗來說,夠用了。
config/application.yml 的默認數據存儲開啟是的 h2,可以修改數據存儲為 Elasticsearch(在啟動 SkyWalking 之前,確保 Elasticsearch 已啟動)
SkyWalking 的啟動包括兩部分,一個是 SkyWalking Collector(oapService) ,一個是 SkyWalking UI(webappService)
可以分別啟動 oapService 和 webappService,也可以通過 startup 一次性全部啟動,從 startup 中的命令可以知道其實就是分別啟動 oapService 和 webappService。
如果一切順利,這時候就可以通過 http://localhost:8080 來查看 SkyWalking UI 了(默認全是0,截圖是測試效果),默認賬號/密碼:admin/admin。
3.后端存儲用es
修改skywalking下config/application.yml 中配置es地址即可
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch7:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.100.14:9200,192.168.100.15:9200,192.168.100.19:9200}
4.安裝Agent
將agent目錄拷貝至各服務所在的機器上
plugins是探針用到各種插件,SkyWalking插件都是即插即用的,可以把optional-plugins中的插件放到plugins中
修改 agent/config/agent.config
配置文件,也可以通過命令行參數指定
主要是配置服務名稱和后端服務地址
agent.service_name=${SW_AGENT_NAME:user-center}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.17:11800}
在服務啟動的時候用命令行參數 -javaagent 來指定探針
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar
例如:
java -javaagent:./agent/skywalking-agent.jar -Dspring.profiles.active=dev -Xms512m -Xmx1024m -jar demo-0.0.1-SNAPSHOT.jar
5.啟動服務
修改 webapp/webapp.yml
文件,更改端口號及后端服務地址
server:
port: 9000
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
listOfServers: 127.0.0.1:12800
# 啟動服務
bin/startup.sh
# 或者分別依次啟動
bin/oapService.sh
bin/webappService.sh
查看logs目錄下的日志文件,看是否啟動成功
瀏覽器訪問 http://127.0.0.1:9000
6.告警
編輯 alarm-settings.yml 設置告警規則和通知:
https://github.com/apache/skywalking/blob/v8.2.0/docs/en/setup/backend/backend-alarm.md