关于java:Java扩展Nginx之四远程调试

6次阅读

共计 2587 个字符,预计需要花费 7 分钟才能阅读完成。

欢送拜访我的 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 的信念是否更强了呢?

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

学习路上,你不孤独,欣宸原创一路相伴 …

正文完
 0