SpringBoot项目优化配置!


前言


今天博主将为大家分享SpringBoot项目优化配置!不喜勿喷,如有异议欢迎讨论


项目调优

作为一名工程师,项目调优这事,是必须得熟练掌握的事情。

在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。在这边有一篇比较好的文章,推荐给大家!

https://zhuanlan.zhihu.com/p/31803182


修改配置文件

我的yml文件大家看tomcat就可以了

server:
  #项目端口号
  port: 8066
  servlet:
    context-path: /Jmccms
  tomcat:# 在这里配置tomcat的参数达到优化效果
    #最大连接数
    max-connections: 200
    #post提交数据最大大小,设置为0不限制
    max-http-post-size: 0
    #最大线程数
    max-threads: 300
    min-spare-threads: 0
    #编码方式
    uri-encoding: UTF-8

eureka:
  instance:
    # 每隔10s发送一次心跳
    lease-renewal-interval-in-seconds: 10
    # 告知服务端30秒还未收到心跳的话,就将该服务移除列表
    lease-expiration-duration-in-seconds: 30
  client:
    serviceUrl:
      #eureka注册中心地址固定就这样写
      defaultZone: http://localhost:8888/eureka/

logging:
  pattern:
    console: "%d - %msg%n"
  #path: D:\Logback-Test\             #日志输出到指定文件夹下默认名为spring.log
  file: D:\Logback-Test\wordimg.log  #日志输出到指定文件
  #level: debug   #指定级别
  level:         #指定输出某个类的日志
    com.cnooc.wordimg.LoggerTest2: debug

spring:
  application:
    #服务名称,写组长名称谢谢!!!
    name: serve-jmccms
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    #数据库意思是:机构权限文件
    url: jdbc:mysql://127.0.0.1:3306/jmccms?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    dbcp2:                                          # 进行数据库连接池的配置
      min-idle: 5                                   # 数据库连接池的最小维持连接数
      initial-size: 5                               # 初始化提供的连接数
      max-total: 5                                  # 最大的连接数
      max-wait-millis: 200                          # 等待连接获取的最大超时时间
    # SpringDateJpa 配置自动建表:updata:没有表新建,有表更新操作,控制台显示建表语句
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect  #不加这句则默认为myisam引擎
    ##运行时输出jpa执行的sql语句
    show-sql: true
    ## spring-boot-starter-data-jpa自动映射创建表动作 配置: 有表更新,无表创建
    hibernate:
      ddl-auto: update
  #集中解决各种编码问题
  banner:
    charset: UTF-8
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  messages:
    encoding: UTF-8
  #     spring mvc 视图解析器
  mvc:
    view:
      prefix: /
      suffix: .html
  # 时间格式化
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    # 时区设置
    time-zone: GMT+8

# security:
    # oauth2:
    # resource:
    #   ####从认证授权中心上验证token
    #  tokenInfoUri: http://localhost:3011/chenyongjia-oauth/oauth/check_token
    #  preferTokenInfo: true
    # client:
    #  accessTokenUri: http://localhost:3011/chenyongjia-oauth/oauth/token
    #  userAuthorizationUri: http://localhost:3011/chenyongjia-oauth/oauth/authorize
    #  client-id: client_1
  # client-secret: 123456

使用application.yml配置文件有一些参数无法设置,也可以创建一个类文件来配置,如下:(记得引入tomcat的maven哦)

package com.qipai.springbean;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.stereotype.Component;

/**
 * Created by weiqingming on 2017/12/7.
 */
@Component
public class TomcatConfig extends TomcatEmbeddedServletContainerFactory
{
    public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers)
    {
        //设置端口
        this.setPort(8081);
        return super.getEmbeddedServletContainer(initializers);
    }

    protected void customizeConnector(Connector connector)
    {
        super.customizeConnector(connector);
        Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();
        //设置最大连接数
        protocol.setMaxConnections(200);
        //设置最大线程数
        protocol.setMaxThreads(300);
        //连接超时时间
        protocol.setConnectionTimeout(10000);
    }
}

Jvm调优

关于Jvm调优Oracle官网有一份指导说明:https://docs.oracle.com/middleware/11119/wls/PERFM/jvm_tuning.htm#i1146060

一.设置下Jvm参数

-XX:MetaspaceSize=128m 
 -XX:MaxMetaspaceSize=128m 
 -Xms1024m -Xmx1024m -Xmn256m 
 -Xss256k -XX:SurvivorRatio=8
 -XX:+UseConcMarkSweepGC

配置方式:

如果你用的是IDEA等开发工具,来启动运行项目,那么要调试JDK就方便太多了。

首先打开idea,按照截图操作:(当然这里要注意你要先选择你要设置jvm参数的application)

springboot boot 优化mongdb 链接 springboot项目优化_spring


好了现在打开如下界面选择你要设置的springboot的application,添加jvm的vm配置。(这里自行百度设置或者按照经验来即可)

springboot boot 优化mongdb 链接 springboot项目优化_spring_02

-XX:MetaspaceSize=128m   
-XX:MaxMetaspaceSize=128m   
-Xms1024m 
-Xmx1024m 
-Xmn256m   
-Xss256k 
-XX:SurvivorRatio=8  
-XX:+UseConcMarkSweepGC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2l5amw1a-1571643735067)(B5DB66EB21E3495694C11DABBF1A5B88)]

关于这些设置的JVM参数是什么意思,请参考第二步中的oracle官方给出的调优文档。

-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆默认大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails (打印详细的GC日志)

要注意:

JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)

JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。

使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。

不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。