在當前採用微服務的架構下想要對特定服務 debug 除了在本機將服務啟起來然後仿照其他服務打 API 請求過來外,也可以採用將本機的 debugger 連接至遠端服務進行遠端 debug 下斷點。
在 dev 環境與其他人串接流程找問題時我自己滿常用這招的,畢竟如果要在本地 debug 不太可能將整套微服務都啟一遍。
首先要允許 dev 遠端環境的服務被 debugger 連接的話,我們需要調整一下服務的啟動指令加入以下參數。
agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:55001
agentlib:jdwp
: 告訴 JVM 我們要載入 jdwp (Java Debug Wire Protocol) 這個本地 debug 用的 library。-
transport=dt_socket
: 與 dev 遠端環境溝通是透過網路連線,所以這邊指定使用 socket 模式。 -
server=y
: 設定為 debugger server。 -
suspend=n
: 設定當沒有 debugger 連接時不用將程式暫停,程式會繼續運行就如同以往一樣。 -
address=0.0.0.0:55001
: 設定給 debugger 連接的 port 為55001
,並且允許所有來源連接。
完整服務啟動的指令會長這樣:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:55001 -jar thirdparty-service-1.0.0.jar
重新佈署一次 dev 服務後,服務就會進入允許 debugger 連接的狀態,我們可以使用 netstat
指令確認一下剛剛的55001
port 是否正在 listen。
root@dev-dockerhost-srv01(02:58:13)[~]# netstat -anop | grep 55001
tcp 0 0 0.0.0.0:55001 0.0.0.0:* LISTEN 32580/java off (0.00/0/0)
root@dev-dockerhost-srv01(02:59:03)[~]#
接下來我們要來設定怎麼從 VSCode 去連接遠端服務。打開服務的專案中的 VSCode 啟動設定檔 (在 .vscode
/launch.json
,沒有看到的話就自己創一個),然後在 configurations
底下多補上一項使用 attach
模式啟動的方式,dev 的 host 及 port 可以自行調整。
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ // 略... { "type": "java", "name": "SpringBoot App Debug", "request": "attach", "projectName": "thirdparty-service", "hostName": "192.168.101.191", "port": 55001 }, // 略... ] }
保存後下拉選單就會出現剛剛新增的啟動方式,按下綠色三角形將本地 debugger 連接至遠端服務。
可以看到遠端服務目前正在運行的 thread 已經出現在 call stack 中了。
這時就可以仿照本地 debug 的方式對程式碼下斷點,然後在 dev 環境正常走一遍流程,讓程式碼執行到斷點處。
可以看到 debugger 如我們預期的去中斷了程式碼,讓我們預覽當下的變數及物件的值,是不是很方便呢。