作者:小傅哥 博客:https://
?沉淀、分享、成長,讓自己和他人都能有所收獲!?? ? 大家好,我是技術(shù)UP主小傅哥。 我遇到過一種bug場景,本地沒什么問題,部署到服務器上就不行了。往往遇到這樣的問題,要花費大量的時間檢查程序邏輯,一個個方法 mock 測試驗證。那有人會問了,你怎么不在本地 debug 調(diào)試下呢? 你的代碼本地沒法啟動! 其實并不是所有的工程代碼,都能本地啟動運行的。尤其復雜的工程,與外部對接非常多,甚至還有一些是風險控制的問題,本地是不能啟動直接調(diào)用的。也就是控制研發(fā)人員,不允許本地程序調(diào)用其他程序的接口。那么對于這樣的工程,研發(fā)的自測就要通過編寫 mock 方式進行單元化測試。 不過這里會有一個問題,單元化的測試,mock 的數(shù)據(jù)是不會隨著外部所有程序的調(diào)整動態(tài)的變更的,而是隨著研發(fā)編寫需求,一次寫好后,后續(xù)如果這個功能沒有被調(diào)整,那么 mock 測試也不會在調(diào)整了。同時還因為 mock 覆蓋的場景不全,不知道引入的外部那么多接口都有哪些新增的邏輯。因而,你可能本地運行沒問題,但部署到測試環(huán)境,就會有一些不缺性的報錯。 對于這里的報錯,當你沒有 debug 手段的時候,就要把前后的報錯數(shù)據(jù),都要復制到本地,通過 mock 的方式驗證程序邏輯,一點點排查。不過,這個過程也要花費好長時間,尤其是一些復雜的邏輯與外部交互又非常多的時候,調(diào)試起來很耗費時間。 所以,程序員???????對于實在難以調(diào)試的代碼,還有一種方式就是遠程調(diào)試。把代碼部署到服務器,通過請求服務器的接口,本地的 IntelliJ IDEA 打開的工程,就可以調(diào)試對應的運行數(shù)據(jù)??梢苑浅8咝У慕鉀Q bug! 接下來,小傅哥就帶著大家做一個這樣的案例。如果你是一個新手小白,就更有必要學習一下這樣的手段了。 ?? 文末還提供了17個實戰(zhàn)項目,全套的文檔、視頻、代碼,都可以獲取。還有非常清晰的學習路線!嘎嘎沖!
一、測試工程這里小傅哥為你準備好了一個測試工程,你可以直接下載驗證。 - 地址:https://github.com/fuzhengwei/xfg-dev-tech-remote-jvm-debug
- 環(huán)境:JDK 1.8、SpringBoot 2.7
- 如圖,工程提供了簡單的 TestApiController 一個 http 測試入口。之后通過 Dockerfie 方式構(gòu)建鏡像,以及提供了 docker-compose-app.yml 啟動工程。重要的是 JAVA_REMOTE_DEBUG 的配置。這是一種 JavaAgent 技術(shù),如果感興趣可以進入小傅哥的博客,https:/// 字節(jié)碼編程中學習。
1. 測試接口@Slf4j @RestController() @CrossOrigin("*") @RequestMapping("/api/v1/test/") publicclass TestApiController {
/** * curl --request POST \ * --url 'http://127.0.01:8091/xfg/api/v1/test/group_buy_notify?requestDTO=1111' * * 注意,yml 里配置了應用根目錄;server.servlet.context-path: /xfg */ @RequestMapping(value = "group_buy_notify", method = RequestMethod.POST) public String groupBuyNotify(@RequestParam String requestDTO) { log.info("請求參數(shù) {}", JSON.toJSONString(requestDTO));
return"success"; }
}
- 一個簡單的測試接口,訪問接口地址為;
http://127.0.01:8091/xfg/api/v1/test/group_buy_notify?requestDTO=1111 - 你可以復制 curl 部分,導入到 apipost/apifox 等工具里使用。
2. Dockerfile# 基礎(chǔ)鏡像 FROM openjdk:8-jre-slim
# 作者 MAINTAINER xiaofuge
# 配置 ENV PARAMS=""
# 時區(qū) ENV TZ=PRC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加應用 ADD target/xfg-dev-tech-remote-jvm-debug-app.jar /xfg-dev-tech-remote-jvm-debug-app.jar EXPOSE 80915005
ENTRYPOINT ["sh","-c","java $JAVA_REMOTE_DEBUG -jar $JAVA_OPTS /xfg-dev-tech-remote-jvm-debug-app.jar $PARAMS"]
- ENTRYPOINT,添加了一個 $JAVA_REMOTE_DEBUG 的動態(tài)入?yún)?,其實這個位置要填入的就是
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 但并不是上線的所有程序都要做這樣的事情,一般只有測試環(huán)境才需要。 - EXPOSE 8091 5005 對外暴漏應用程序所需的 8091 5005 端口。
3. DockerCompose 部署腳本# /usr/local/bin/docker-compose -f /docs/dev-ops/environment/environment-docker-compose-2.4.yml up -d version: '3.8' # docker-compose -f docker-compose-app.yml up -d services: xfg-dev-tech-remote-jvm-debug-app: image: fuzhengwei/xfg-dev-tech-remote-jvm-debug-app:1.0 container_name: xfg-dev-tech-remote-jvm-debug-app restart: on-failure ports: - "5005:5005" - "8091:8091" environment: - TZ=PRC - SERVER_PORT=8091 # 2c4g 配置,4c8g 翻倍,-Xms4096m -Xmx4096m | -Xmx –Xms:指定java堆最大值(默認值是物理內(nèi)存的1/4(<1GB))和初始java堆最小值(默認值是物理內(nèi)存的1/64(<1GB)) - JAVA_OPTS=-Xms2048m -Xmx2048m - JAVA_REMOTE_DEBUG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 volumes: - ./log:/data/log logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: - my-network
networks: my-network: driver: bridge
- 部署服務注意,要對外提供 5005、8091 兩個映射端口。對于這種端口的暴漏說明,我已經(jīng)提供好了基礎(chǔ)教程,可以在這里擴展學習;https:///md/road-map/docker-what.html
- 另外在 environment 環(huán)境中,配置
- JAVA_REMOTE_DEBUG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 這樣就可以把遠側(cè)調(diào)試的服務給啟動起來了。相當于你在自己的電腦的 IntelliJ IDEA 與服務器上的應用,通過 5005 端口進行通信完成測試debug驗證。
二、部署程序確保你自己本地已經(jīng)安裝好了 Docker Mac、Windows 電腦都可以安裝。 1. 打包程序- 通過 IntelliJ Install 打包程序。其實就是 Maven 命令,mvn clean install 的操作。
2. 構(gòu)建鏡像- windows 電腦,可以通過 powershell 執(zhí)行 ./build.sh
3. 發(fā)布項目- windows 打開 powershell 執(zhí)行腳本
docker-compose -f docker-compose-app.yml up -d
三、調(diào)試程序1. IntelliJ IDEA 配置- 首先,在運行調(diào)試按鈕那,點擊下拉框。增加一個新的調(diào)試配置。
- 之后,點擊+號,添加
Remote JVM Debug - 最后,填寫 IP 地址和端口,點擊 Apply OK 即可。
2. 導入接口- 導入接口到 ApiPost 中調(diào)用。其他的工具也可以,這樣接口可以保存起來,方便以后調(diào)試。
3. 遠程調(diào)試3.1 啟動程序3.2 添加斷點- 添加斷點。注意,這會的程序部署的要一致,不能動代碼。否則和遠程部署的不一致,是不能調(diào)試的。
3.3 調(diào)用接口首先,在 ApiPost 中點擊【發(fā)送】按鈕。 - 這會,你可以在打了斷點的程序中,查看到請求的調(diào)用會進來。最終執(zhí)行完,遠程的部署的程序也會執(zhí)行完。?? 好啦,到這你就已經(jīng)學會了遠程調(diào)試了。以后自己的簡歷中,對于項目的描述,此類問題,你也可以講自己是如何做的遠程調(diào)試。 關(guān)注公眾號「bugstack蟲洞棧」回復「星球」獲得限量優(yōu)惠券??!
|