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

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

jdwp 使用玩法

 

 

集成参考图

 

 

环境&测试

一个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 配置

 

 


效果

 

 

说明

完整代码在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

posted on 2022-11-26 20:26  荣锋亮  阅读(86)  评论(0编辑  收藏  举报

导航