欢迎访问我的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的信心是否更强了呢?

欢迎关注思否:程序员欣宸

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

程序员欣宸
147 声望24 粉丝

热爱Java和Docker