介绍快速到底
在 SpringBoot 的 Web 项目中,默认采用的是内置 Tomcat,当然也可以配置支持内置的 jetty,内置有什么好处呢?
-
方便微服务部署。
-
方便项目启动,不需要下载 Tomcat 或者 Jetty
针对目前的容器优化,目前来说没有太多地方,目前主要考虑如下几个点差不多就够了
-
线程数
-
超时时间
-
jvm优化
针对上述的优化点来说,首先线程数是一个重点,线程主要分为初始线程数和最大线程数。
1、初始线程数保障启动的时候,如果有大量用户访问,能够很稳定的接受请求。
2、而最大线程数量用来保证系统在访问高峰期的稳定性,而超时时间用来保障连接数不容易被压垮,如果大批量的请求过来,延迟比较高,不容易把线程打满。这种情况在生产中是比较常见的 ,一旦网络不稳定,宁愿丢包也不愿意把机器压垮。
3、jvm 优化一般来说没有太多场景,最常用的无非就是加大初始的堆,和最大限制堆,当然也不是无限增大,根据具体情况而定(下面有备注)。
在 spring boot 配置文件中 application.yml,添加以下配置
server:
tomcat:
min-spare-threads: 20
max-threads: 100
connection-timeout: 5000
这块对 tomcat 进行了一个优化配置,最大线程数是100,初始化线程是20,超时时间是 5000ms
而 springboot 对 tomcat 有赋默认值:
/** * Maximum amount of worker threads. */ private int maxThreads = 200; /** * Minimum amount of worker threads. */ private int minSpareThreads = 10; /** * Time that connectors wait for another HTTP request before closing the connection. * When not set, the connector's container-specific default is used. Use a value of -1 * to indicate no (that is, an infinite) timeout. */ private Duration connectionTimeout;
connectionTimeout 参数介绍:连接器(tomcat 的 Connector)在关闭连接之前等待另一个HTTP请求的时间(可以理解为如果超过了这个时间还没等到 http 请求,那么就关闭该连接,引申出来就是连接复用的意思)。未设置时,使用连接器的特定容器的默认值(这里springboot 框架并没有对其设置默认值,应该是 tomcat 内置会有一个默认值)。 使用值 -1 表示没有(即无限)超时(意思是该连接可能一直存在,可能会导致阻塞,慎用)。
这个 connectionTimeout 参数配置对应 tomcat 里的 keepAliveTimeout 而不是 connectionTimeout 参数。
对应服务器的配置类:
Jvm优化
这块主要不是谈如何优化,jvm优化是一个需要场景化的(因为不同的项目对于内存的需求是不一样的,比如之前的 openfire 是 3g,但是通常的一个web 项目可能 512M 就可以了)。一般来说在 server 端运行都会指定如下参数
初始内存和最大内存基本会设置成一样的(为什么一样,见这篇博客),具体大小根据场景设置,-server是一个必须要用的参数,至于收集器这些使用默认的就可以了,除非有特定需求。
1.使用-server模式
设置JVM使用server模式。64位JDK默认启动该模式
java -server -jar springboot-1.0.jar
2.指定堆参数
这个根据服务器的内存大小,来设置堆参数。
-
-Xms :设置Java堆栈的初始化大小
-
-Xmx :设置最大的java堆大小
java -server -Xms512m -Xmx512m -jar springboot-1.0.jar
设置初始化堆内存为512MB,最大为768MB。
3.远程Debug
在服务器上将启动参数修改为:
java -Djavax.net.debug= ssl -Xdebug -Xnoagent -Djava.compiler= NONE -Xrunjdwp:transport= dt_socket,server=y,suspend= n,address=8000 -jar springboot-1.0.jar
这个时候服务端远程 Debug 模式开启,端口号为 8000
在IDEA中,新增一个 Debug
在【1】中填入Remote项目名称,在【2】中填IP地址和端口号,在【3】选择远程调试的项目module,配置完成后点击OK即可
如果碰到连接超时的情况,很有可能服务器的防火墙的问题,关闭防火墙
JVM工具远程连接
jconsole与Jvisualvm远程连接
通常我们的web服务都输部署在服务器上的,在window使用jconsole是很方便的,相对于Linux就有一些麻烦了,需要进行一些设置。
1.查看hostname,首先使用
hostname -i
查看,服务器的 hostname 为127.0.0.1,这个是不对的,需要进行修改
2.修改hostname
修改/etc/hosts文件,将其第一行的“127.0.0.1 localhost.localdomain localhost”,修改为:“192.168.44.128 localhost.localdomain localhost”.“192.168.44.128”为实际的服务器的IP地
3.重启Linux,在服务器上输入hostname -i,查看实际设置的IP地址是否为你设置的
4.启动服务,参数为:
java -jar -Djava.rmi.server.hostname=192.168.44.128 - Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=911 - Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=false jantent-1.0-SNAPSHOT.jar
ip为192.168.44.128,端口为911 。
5.打开Jconsole,进行远程连接,输入IP和端口即可
点击连接,经过稍稍等待之后,即可完成连接,如下图所示:
同理,JvisualVm的远程连接是同样的,启动参数也是一样。
然后在本机JvisualVm输入IP:PORT,即可进行远程连接:如下图所示:
相比较Jvisualvm功能更加强大一下