Java扩展Nginx之四:远程调试

打印 上一主题 下一主题

主题 935|帖子 935|积分 2805

欢迎访问我的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)
关于代码

  1. package com.bolingcavalry.simplehello;
  2. import nginx.clojure.java.ArrayMap;
  3. import nginx.clojure.java.NginxJavaRingHandler;
  4. import java.time.LocalDateTime;
  5. import java.util.Map;
  6. import static nginx.clojure.MiniConstants.CONTENT_TYPE;
  7. import static nginx.clojure.MiniConstants.NGX_HTTP_OK;
  8. public class HelloHandler implements NginxJavaRingHandler {
  9.     @Override
  10.     public Object[] invoke(Map<String, Object> request) {
  11.         return new Object[] {
  12.                 NGX_HTTP_OK, //http status 200
  13.                 ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
  14.                 "Hello, Nginx clojure! " + LocalDateTime.now()  //response body can be string, File or Array/Collection of them
  15.         };
  16.     }
  17. }
复制代码

  • 在nginx.conf中,配置了一个location,path是/java
  1. location /java {
  2.         content_handler_type 'java';
  3.         content_handler_name 'com.bolingcavalry.simplehello.HelloHandler';
  4. }
复制代码

  • 以上就是今天要打断点调试的代码和配置了
nginx-clojure的远程调试配置


  • 打开nginx.conf文件,在http的配置中增加以下两行,即可开启nginx-clojure的远程调试:
  1. jvm_options "-Xdebug";
  2. 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}表示远程调试的端口是840184028403


  • 要注意的是,请确保这些端口没有被占用
  • 今天的实战为了简单省事儿,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的信心是否更强了呢?
欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表