Java扩展Nginx之四:远程调试
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本文是《Java扩展Nginx》系列的第四篇,一起来体验个实用的功能,此能力定会让爱学习的您大呼过瘾,它就是广大java程序员在日常开发和定位问题过程中常用的神技:远程调试;
- 看变量、看堆栈,不论阅读代码还是定位问题,打断点都是我们最值得信赖的手段,当您的代码运行在nginx-clojure模块中的时候,如果能像tomcat那样远程打断点,单步调试,会大幅度提高工作效率
- 远程断点的效果如下图所示,通过IDEA的Remote JVM Debug功能远程连接到nginx-clojure监听的远程debug端口,当浏览器请求触发了java代码的执行时,就会进入断点状态,停留在断点位置,可以看到堆栈和内存中的变量情况,以及单步执行:
关于工具
- 本篇使用的编码工具是IntelliJ IDEA 2021.3.2 (Ultimate Edition)
关于代码
- 本篇直接使用《Java扩展Nginx之一:你好,nginx-clojure》中的工程和代码,这里简单回顾如下,只有一个类:
package com.bolingcavalry.simplehello;
import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.NginxJavaRingHandler;
import java.time.LocalDateTime;
import java.util.Map;
import static nginx.clojure.MiniConstants.CONTENT_TYPE;
import static nginx.clojure.MiniConstants.NGX_HTTP_OK;
public class HelloHandler implements NginxJavaRingHandler {
@Override
public Object[] invoke(Map<String, Object> request) {
return new Object[] {
NGX_HTTP_OK, //http status 200
ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
"Hello, Nginx clojure! " + LocalDateTime.now() //response body can be string, File or Array/Collection of them
};
}
}
- 在nginx.conf中,配置了一个location,path是/java:
location /java {
content_handler_type 'java';
content_handler_name 'com.bolingcavalry.simplehello.HelloHandler';
}
- 以上就是今天要打断点调试的代码和配置了
nginx-clojure的远程调试配置
- 打开nginx.conf文件,在http的配置中增加以下两行,即可开启nginx-clojure的远程调试:
jvm_options "-Xdebug";
jvm_options "-Xrunjdwp:server=y,transport=dt_socket,address=840#{pno},suspend=n";
- 上述配置中,address=840#{pno}的含义要注意:
- 如果worker_processes配置的值等于1,address=840#{pno}表示远程调试的端口是8401
- 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程,每个进程都有一个端口被用于远程调试,这三个端口分别是address=840#{pno}表示远程调试的端口是8401、8402、8403
- 要注意的是,请确保这些端口没有被占用
- 今天的实战为了简单省事儿,worker_processes的值等于1,所以只有一个java进程,它的远程调试端口是8401
- 配置完成后,启动nginx
- 用postman访问/java,确认可以响应成功,证明nginx和nginx-clojure是正常的:
IDEA上的远程调试操作
- 用IDEA打开工程,点击下图红框中的按钮:
- 操作如下图,新增一个Remote JVM Debug配置:
- Remote JVM Debug的设置如下,红框1是nginx的ip地址,我这里IDEA和nginx在同一台电脑上,所以用localhost即可,红框2是端口号,对应nginx配置的jvm_options中的address=840#{pno}:
- 配置完成后,按照下图红框数字的顺序操作,先在代码上打断点,然后执行远程连接,顺利的话会看到红框3中的连接成功提示:
- 至此,远程调试功能已经准备好,可以使用了
验证
- 在postman上再发一次请求,IDEA上立即进入断点状态,如下图:
- 如果想看堆栈中的代码,可以操作如下图:
- 此刻,NginxClojureRT.java已经被下载下来,可以更仔细的阅读和研究nginx-clojure了:
- 至此,nginx-clojure的远程调试功能演示完毕,各位java同僚们,如虎添翼的感觉有没有?学习和使用nginx-clojure的信心是否更强了呢?