欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本文是《Java扩展Nginx》系列的第四篇,一起来体验个实用的功能,此能力定会让爱学习的您大呼过瘾,它就是广大java程序员在日常开发和定位问题过程中常用的神技:远程调试;
- 看变量、看堆栈,不论阅读代码还是定位问题,打断点都是我们最值得信赖的手段,当您的代码运行在nginx-clojure模块中的时候,如果能像tomcat那样远程打断点,单步调试,会大幅度提高工作效率
远程断点的效果如下图所示,通过IDEA的<font color="blue">Remote JVM Debug</font>功能远程连接到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是<font color="blue">/java</font>:
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";
- 上述配置中,<font color="blue">address=840#{pno}</font>的含义要注意:
- 如果worker_processes配置的值等于1,<font color="blue">address=840#{pno}</font>表示远程调试的端口是<font color="red">8401</font>
- 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程,每个进程都有一个端口被用于远程调试,这三个端口分别是<font color="blue">address=840#{pno}</font>表示远程调试的端口是<font color="red">8401</font>、<font color="red">8402</font>、<font color="red">8403</font>
- 要注意的是,请确保这些端口没有被占用
- 今天的实战为了简单省事儿,worker_processes的值等于1,所以只有一个java进程,它的远程调试端口是<font color="red">8401</font>
- 配置完成后,启动nginx
用postman访问<font color="blue">/java</font>,确认可以响应成功,证明nginx和nginx-clojure是正常的:
IDEA上的远程调试操作
- 用IDEA打开工程,点击下图红框中的按钮:
- 操作如下图,新增一个<font color="blue">Remote JVM Debug</font>配置:
- <font color="blue">Remote JVM Debug</font>的设置如下,红框1是nginx的ip地址,我这里IDEA和nginx在同一台电脑上,所以用localhost即可,红框2是端口号,对应nginx配置的jvm_options中的<font color="red">address=840#{pno}</font>:
- 配置完成后,按照下图红框数字的顺序操作,先在代码上打断点,然后执行远程连接,顺利的话会看到红框3中的连接成功提示:
至此,远程调试功能已经准备好,可以使用了
验证
- 在postman上再发一次请求,IDEA上立即进入断点状态,如下图:
- 如果想看堆栈中的代码,可以操作如下图:
- 此刻,NginxClojureRT.java已经被下载下来,可以更仔细的阅读和研究nginx-clojure了:
- 至此,nginx-clojure的远程调试功能演示完毕,各位java同僚们,如虎添翼的感觉有没有?学习和使用nginx-clojure的信心是否更强了呢?
欢迎关注思否:程序员欣宸
学习路上,你不孤单,欣宸原创一路相伴...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。