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

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

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

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