Skywalking 支持 HTTP 1.1 的 PR 折騰了我很久,E2E 端到端測試是真的把我搞「怕」了···java
OpenResty 是什麼?
OpenResty是一個基於 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用於方便地搭建可以處理超高併發、擴展性極高的動態 Web 應用、Web 服務和動態網關。nginx
所以,不少公司都會使用 OpenResty 開發出適合本身業務的高性能 web Server 模塊。git
那麼它和 Skywalking 有什麼關心呢?咱們得先知道Skywalking是什麼,Skywalking 是由Java 語言開發的一套APM系統,主要監控服務與服務之間的調用鏈路以及服務應用指標。官方的介紹是:分佈式系統的應用程序性能監視工具,專爲微服務、雲原生架構和基於容器(Docker、K8s、Mesos)架構而設計。具體能夠移步 Github: https://github.com/apache/skywalkinggithub
假設,當咱們的使用Nginx/OpenResty 爲咱們的微服務作負載均衡的時候,怎樣才能將整條鏈路經過請求串起來,以及怎樣保證整個鏈路的拓撲圖正確呢?目前的解決方案是在 Nginx 中支持鏈路信息的上報,同時可以將請求鏈路關鍵信息傳遞給上游應用。web
Apache Skywalking Nginx Lua 項目
Githu項目地址:https://github.com/apache/skywalking-nginx-lua,該項目是吳晟採用 Lua 實現的 Nginx/OpenResty SDK。主要就是實現將 Nginx 做爲一個節點註冊至Skywalking,同時將鏈路 TraceId 傳遞給上游服務,並將鏈路上報給 Skywalking。apache
Skywalking 7.x 開始支持 HTTP 1.1
具體PR請參考: https://github.com/apache/skywalking/pull/4399後端
Skywalking 監控 Java、Golang、Node、.NET 語言的鏈路都是採用了 SDK 或者 Agent 的方式將數據上報到 Skyalking 後端。不過都是採用 gRPC 的方式和後端交互,Apache Nginx Lua 考慮到 Nginx 足以勝任 10K 以上併發鏈接響應,並無採用 Nginx gRPC的方式,所以須要 Skywalking 支持 HTTP 1.1 的通訊接口。微信
怎麼玩起來?
這裏先畫一個怎麼玩的邏輯圖:架構

怎麼搭建Skywalkng 的流程就再也不贅述了,不是本文的重點,着重介紹怎麼跑Skywalking Nginx Lua。 能夠查看發佈在嗶哩嗶哩上面的教程:https://www.bilibili.com/video/av35990012/
-
首先安裝 Openresty 參照官網:https://openresty.org/cn/download.html
Macos 系統採用 Homebrew 安裝:
> brew install openresty/brew/openresty
==> Summary
🍺 /usr/local/Cellar/openresty/1.15.8.2: 303 files, 6.5MB, built in 1 minute
==> Caveats
==> openresty-openssl
openresty-openssl is keg-only, which means it was not symlinked into /usr/local,
because only for use with OpenResty.
If you need to have openresty-openssl first in your PATH run:
echo 'export PATH="/usr/local/opt/openresty-openssl/bin:$PATH"' >> ~/.zshrc
For compilers to find openresty-openssl you may need to set:
export LDFLAGS="-L/usr/local/opt/openresty-openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openresty-openssl/include"
==> openresty
To have launchd start openresty/brew/openresty now and restart at login:
brew services start openresty/brew/openresty
Or, if you don't want/need a background service you can just run:
openresty
-
克隆或者下載 Apache Nginx Lua庫
git clone https://github.com/apache/skywalking-nginx-lua.git
cd skywalking-nginx-lua/examples/
該目錄存放了關於Nginx的樣例配置,以下是部份內容:
-
nginx.conf:
http {
# 這裏指向剛剛克隆下來的 skywalking nginx lua項目
lua_package_path "path/to/skywalking-nginx-lua/lib/skywalking/?.lua;;";
# Buffer represents the register inform and the queue of the finished segment
lua_shared_dict tracing_buffer 100m;
init_worker_by_lua_block {
local metadata_buffer = ngx.shared.tracing_buffer
metadata_buffer:set('serviceName', 'User Service Name')
-- Instance means the number of Nginx deloyment, does not mean the worker instances
metadata_buffer:set('serviceInstanceName', 'User Service Instance Name')
# 這裏須要指定上報Skywalking 的後端地址。端口默認是12800
require("client"):startBackendTimer("http://127.0.0.1:12800")
}
server {
listen 8080;
location /test {
default_type text/html;
rewrite_by_lua_block {
require("tracer"):start("upstream service")
}
# 這裏則是 上圖中 nginx 上游服務的地址
proxy_pass http://127.0.0.1:8080/upstream/test;
body_filter_by_lua_block {
if ngx.arg[2] then
require("tracer"):finish()
end
}
log_by_lua_block {
require("tracer"):prepareForReport()
}
}
}
}
-
直接啓動 OpenResty 便可,並指定配置文件,例如:
openresty -c /Users/tanjian/gitprojects/skywalking-nginx-lua/examples/nginx.conf
疑問?
私信聯繫我吧 :)
最後,分享一些比較系統的學習資料,更多資料持續更新中···:
獲取方式:點擊右下角 「在看」 後臺回覆關鍵詞:【kubernetes】、【人工智能】、【java】、【java畢設】、【Elasticsearch】或者 【打包】一鍵帶走領取網盤連接。


本文分享自微信公衆號 - 一萬小時極客(coding-Hub)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。