原文地址:大数据管理平台DataSophon开源动态&进行远程Debug方法
DataSophon版本以及开源情况
大数据管理平台DataSophon近来发布了1.1.0版本,除了修复了一些bug外,还带来众多的新特性,如下所示:
新增集成Kerberos安全认证。
新增支持YARN,HDFS,ZK,Hive,Kafka,HBase组件集成Kerberos,支持友好的开启和关闭集成Kerberos。
新增机架管理功能。
服务安装命令状态增加取消状态。
新增租户管理功能,便于创建操作系统用户和用户组。
新增指定用户启动功能,例如Hdfs将使用hdfs用户启动管理。
新增Worker停止时,同时停止Node Exporter。
此外,DataSophon的前端代码也已经完全开源,开源地址为:
https://github.com/datasophon/datasophon/tree/dev/datasophon-ui
前端使用了后台管理平台框架vue-antd-admin进行开发,具有功能强大、易于开发、操作流畅等特点,希望更多的朋友可以为DataSophon贡献自己的力量。
普通开发者如果想要快速掌握DataSophon的代码,可以参考之前的文章:国产自研开源大数据管理平台DataSophon Manager安装教程部署最新版本,步骤都是一样的,同时下载v1.1.0 release代码导入IDEA,进行远程Debug,一步步跟踪代码执行。
Java远程调试(Remote Debugging)是一种调试技术,允许开发人员在运行中的远程Java应用程序中设置断点并观察代码的执行情况,从而可以更好地理解和解决应用程序中的错误和问题。Java远程调试的基本原理是,将Java应用程序的调试信息通过网络传输到调试器,并使用调试器与应用程序交互。
Java远程调试的主要用途是诊断和解决运行中的Java应用程序的错误和问题。它使开发人员可以远程访问应用程序,并对其进行实时调试和故障排除,从而显著减少了开发人员的调试和故障排除时间。Java远程调试技术通常与Java IDE(集成开发环境)一起使用,例如Eclipse、IntelliJ IDEA等。
Java远程Debug的底层原理涉及到JVM的调试架构。JVM提供了Java Debug Wire Protocol(JDWP),它是一种协议,用于在JVM和调试器之间进行通信。JDWP使调试器能够与JVM中正在运行的Java程序进行通信,并可以控制程序的执行,以便进行调试。在远程调试中,调试器通过TCP/IP协议与正在运行的Java程序中的JVM通信。
当开启远程Debug后,JVM会启动一个JDWP代理端口,监听来自调试器的连接请求。调试器会连接到该端口,并向JVM发送一系列的命令,例如获取调试信息、更改程序状态等。JVM在接收到命令后,会执行相应的操作,并返回结果给调试器。
为了实现JDWP的通信,JVM中内置了一些特殊的线程和数据结构。其中最重要的是JVM TI线程(Java Virtual Machine Tool Interface Thread)和EventQueue(事件队列)。JVM TI线程负责处理调试器发送过来的命令,EventQueue则负责缓存来自JVM的事件通知,例如线程启动、线程挂起等。
在远程Debug过程中,调试器可以向JVM发送命令来获取程序的状态,例如当前的线程状态、线程堆栈、变量值等等。调试器还可以控制程序的执行,例如设置断点、单步执行、恢复执行等等。
总体来说,Java远程Debug的底层原理是基于JVM提供的调试架构,并通过TCP/IP协议实现JVM和调试器之间的通信。
在IDEA中进行远程Debug的步骤如下:
在远程主机上启动调试代理程序(启动命令中加上以下参数),例如在 Linux 上可以通过如下命令启动调试代理程序(默认监听端口为 5005):
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
其中 -agentlib:jdwp 表示使用 JDWP 调试代理;transport=dt_socket 表示使用 Socket 传输协议;server=y 表示使用调试器端作为服务端,等待调试客户端的连接;suspend=n 表示在连接调试客户端之前不要挂起JVM的执行;address=5005 表示调试代理监听的端口号为 5005。
在 IDEA 中打开需要调试的 Java 项目,然后点击顶部菜单中的 Run -> Edit Configurations。在弹出的对话框中点击 +,选择 Remote。在 Name 字段中输入一个任意的名称,然后在 Debugger mode 字段选择 Attach。
在 Host 字段中输入远程主机的 IP 地址或域名,例如 192.168.1.60。在 Port 字段中输入调试代理程序监听的端口号,例如 5005。其他选项可以使用默认值。
点击 Apply 和 OK 按钮保存配置。
在 IDEA 中点击 Debug 按钮,或者使用快捷键 Shift + F9,然后选择刚刚创建的 Remote Debug 配置。如果一切正常,IDEA 就会连接到远程主机上运行的 Java 进程,并开始远程调试。
以上是在 IDEA 中对 Java 项目进行远程Debug的详细步骤。实际应用时还需要注意以下几点问题:
确保本地代码与远程代码版本一致,如果本地代码与远程代码版本不同,可能会导致一些问题,例如本地代码中已解决的问题在远程代码中仍存在,从而导致调试结果不一致。因此,在进行远程Debug前,需要确保本地代码与远程代码版本一致。
确保防火墙不会阻止远程调试端口的连接。默认情况下,远程调试使用的是端口 5005。如果你使用的是不同的端口,请在上述步骤中进行相应的更改。
确保运行远程应用程序的主机具有公共 IP 地址或公共 DNS 名称。这是远程调试器可以使用的地址。
远程应用程序和运行远程调试器的机器之间的网络连接必须是可靠的,并且具有足够的带宽。否则,调试器和应用程序之间的通信可能会因网络问题而断开连接。
如果使用的是 Java 9 或更高版本,请记住开启模块化环境的远程调试功能。
最后,当完成调试会话时,应该停止远程调试,以确保不会产生任何性能或安全问题。
远程Debug技术通常用于以下场景:
生产环境问题定位:在生产环境中,一些问题是只在生产环境才会出现,需要在生产环境中进行调试和定位,但是直接在生产环境中修改和调试会对系统的稳定性造成影响,所以使用远程Debug技术可以在保证系统稳定的前提下进行调试和定位。
分布式系统问题调试:在分布式系统中,不同节点之间的调用和交互较为复杂,如果出现问题需要追踪和定位,使用远程Debug技术可以方便地定位问题所在的节点和代码位置。
多线程问题调试:在多线程的程序中,由于线程之间的并发性和异步性,很难手动定位到具体的问题代码,使用远程Debug技术可以方便地追踪线程的执行过程,定位到具体的问题代码。
跨平台调试:开发人员在不同的操作系统平台进行开发和测试,可能会出现一些平台相关的问题,使用远程Debug技术可以在一种平台上进行调试,定位问题后在相应的平台上进行修复。
大型项目调试:在大型项目中,代码数量庞大,出现问题时需要逐步排查,使用远程Debug技术可以快速地定位到问题所在的代码位置。
总之,使用远程Debug技术可以在不影响系统稳定性的前提下,方便地定位和修复问题,提高开发效率和代码质量。
由于DataSophon采用Master-Workers架构,也就是主从架构,主从角色均采用Java语言编写,因此在对DataSophon进行远程Debug时就需要同时考虑Master和Workers节点。
DataSophon Master远程Debug
根据以上"如何在IDEA中进行远程Debug"章节的步骤,开始对DataSophon进行远程Debug。
首先修改DataSophon Master端的启动脚本,加上远程Debug参数:
# 进入datasophon-manager安装根目录(这里安装在/usr/local/datasophon-manager-1.1.0/目录下)
cd /usr/local/datasophon-manager-1.1.0/
# 打开bin目录下的datasophon-api.sh脚本,并加入以下参数
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
加上参数后效果如下:
然后重启DataSophon Master:
sh bin/datasophon-api.sh restart api
可以看到返回的启动参数中带上了远程Debug参数,说明我们的配置已经生效:
下载v1.1.0 release代码,地址如下:
https://github.com/datasophon/datasophon/archive/refs/tags/v1.1.0.zip
将下载好的代码导入IDEA,项目代码结构如下:
按照步骤中的第二步进行操作,完成后的配置如下所示:
点击以下按钮启动远程Debug:
看到以下输出就说明启动成功了:
下面验证远程Debug是否生效,在LoginController的login方法中打断点:
在页面输入用户名和密码,点击登录,可以发现程序在断点处停住了:
这样我们就可以对通过断点对DataSophon Master后台代码进行一步步跟踪阅读。
DataSophon Worker远程Debug
DataSophon Worker端的代码的远程Debug配置过程也和Master一样,为了方便Debug,建议只启动一个Worker实例即可。
首先修改Worker的启动脚本,Worker安装路径如下所示:
/opt/datasophon/datasophon-worker
进入Worker安装根目录,打开datasophon-worker.sh脚本,加上Debug参数:(这里的Debug端口改为5006)
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
配置完成后如下所示:
然后重启DataSophon Worker:
cd /opt/datasophon/datasophon-worker
sh bin/datasophon-worker.sh stop worker
sh bin/datasophon-worker.sh start worker
可以看到返回的启动参数中带上了远程Debug参数,说明我们的配置已经生效:
接着配置IDEA,步骤也和DataSophon Master一样,配置完成效果如下:
点击Debug启动:
下面验证远程Debug是否生效,在StopServiceActor的onReceive方法中打断点:
在页面选择Grafana,将其停止:
然后程序会在我们打断点的地方停住:
这样我们就可以对通过断点对DataSophon Worker代码进行一步步跟踪阅读,从而掌握其内部运行原理。
- THE END -