jdwp+rinetd 进行java 容器应用的远程调试

时间:2022-12-08 14:00:09

实际上就是一个玩法,实际上因为jdwp 是基于tcp 协议的,我们可以使用任何合适的tcp lb 工具解决(iptables 也是可以的)只是rinetd
使用起来还是比较简单的,同时包含了一些简单的访问控制还是不错的

jdwp 使用玩法

jdwp+rinetd 进行java 容器应用的远程调试

 

 

集成参考图

jdwp+rinetd 进行java 容器应用的远程调试

 

 

环境&测试

一个spring boot 应用,启动的时候开启了jdwp 协议

  • docker-compose

 

version: '3'
services:
app:
build: ./
ports:
- 8080:8080
- 9090:9090
networks:
app:
ipv4_address: 172.16.238.10
proxy:
build:
context: .
dockerfile: ./proxy-Dockerfile
ports:
- 19090:19090
networks:
app:
ipv4_address: 172.16.238.11
networks:
app:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
spring boot app dockerfile

FROM eclipse-temurin:8-jdk-alpine
WORKDIR /app
COPY app.jar /app/
COPY app.sh /app/app.sh
RUN chmod +x /app/app.sh
ENTRYPOINT [ "/app/app.sh" ]
app.sh

#!/bin/sh
java -agentlib:jdwp=transport=dt_socket,address=9090,server=y,suspend=n -jar /app/app.jar
proxy dockerfile (基于centos 镜像)

FROM centos:centos7.9.2009
COPY rinetd /app/rinetd
COPY rinetd.conf /app/rinetd.conf
RUN chmod +x /app/rinetd
ENTRYPOINT [ "/app/rinetd","-c","/app/rinetd.conf","-f" ]
rinetd.conf 转发配置,添加如下就可以了

0.0.0.0 19090 172.16.238.10 9090

调试

idea 配置

jdwp+rinetd 进行java 容器应用的远程调试

 

 

效果

jdwp+rinetd 进行java 容器应用的远程调试

 

 

说明

完整代码在github 中,大家可以参考,实际上以上是一个玩法,基于haproxy,nginx (4层proxy),k8s 的nodeport 转发。。。。都是不多的选择

参考资料

​https://dzone.com/articles/remote-debugging-java-applications-with-jdwp​​​
​​​https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/jdwp-spec.html​​​
​​​https://blog.aquasec.com/jdwp-misconfiguration-container-images​​​
​​​https://github.com/rongfengliang/rinetd-rpm​​​
​​​https://github.com/rongfengliang/rinetd-java-debug-learning​