Spring boot性能优化 - Go语言中文社区

Spring boot性能优化


1 Spring boot性能优化

1.1 扫包优化

@SpringBootApplication注解自动获取应用的配置信息,会给应用带来一些副作用。由自动配置( auto-configuration )和 组件扫描 ( component scanning )组成,这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。这样做给开发带来方便的同时,也会有三方面的影响:

1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。

2、会加载一些不需要的多余的实例(beans)。

3、会增加 CPU 消耗。

针对以上三个情况,我们可以移除 @SpringBootApplication 然后使用 @ComponentScan注解来扫描特定的包

//// 移除 @SpringBootApplication and @ComponentScan, @EnableAutoConfiguration 来替代

//@SpringBootApplication

@Configuration

@EnableAutoConfiguration

@ComponentScan(basePackages = {"com.itboy.adminuiclient"})

public class App01 {

 

      public static void main(String[] args) {

            SpringApplication.run(App01.class, args);

      }

 

}

 

1.2 JVM参数调优

具体的详细介绍请看我的另一片jvm参数调优。下面直接实战

内部使用:

根据服务器的内存大小,来设置堆参数。

-Xms :设置Java堆栈的初始化大小

-Xmx :设置最大的java堆大小

实例参数-XX:+PrintGCDetails -Xmx32M -Xms1M

本地项目调优

外部:java -server  -Xms32m -Xmx32m  -jar spboot-0.0.1-SNAPSHOT.war

通过jconsole工具可以查看详细信息。

1.3 替换Tomcat服务器为undertow

默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器

可以将 Web 服务器切换到 Undertow 来提高应用性能。Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。首先,从依赖信息里移除 Tomcat 配置:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

然后添加 Undertow:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

参考这一届https://blog.csdn.net/qq_37049496/article/details/81446140压力测试进行吞度量测试。

2 手写一个spring boot框架

2.1 SpringBoot核心原理

基于SpringMVC无配置文件、(纯Java)完全注解化+内置tomcat实现SpringBoot框架、Main函数启动。

SpringBoot核心快速整合第三方框架原理:Maven继承依赖关系

SpringBoot内嵌入tomcat

SpringBoot采用SpringMVC注解版本实现无配置效果(spring3.0之后SpringMVC就可以通过注解然后自动配置咯)

2.2 内置Tomcat容器(直接利用Java语言创建Tomcat服务器运行)

添加依赖:

    <dependencies>
        <!--java操作tomcat-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>8.5.31</version>
        </dependency>

        <!--tomcat对jsp支持-->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jasper</artifactId>
            <version>8.5.31</version>
        </dependency>
    </dependencies>

创建servlet:

public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("it is my first index Page");
    }
}

创建tomcat启动程序:

public class Test1 {
    //端口号
    private static int PORT=8080;
    //上下文路径(项目路径)
    private static String CONTEXT_PATH="/itboy";
    public static void main(String[] args) throws LifecycleException {
        //创建tomcat服务器
        Tomcat tomcat=new Tomcat();
        //设置tomcat端口号
        tomcat.setPort(PORT);
        tomcat.getHost().setAutoDeploy(false);

        //创建上下文
        StandardContext standardContext=new StandardContext();
        standardContext.setPath(CONTEXT_PATH);
        standardContext.addLifecycleListener(new Tomcat.FixContextListener());
        //将上下文添加到tomcat容器
        tomcat.getHost().addChild(standardContext);
        /**
         * 其实下面两件事不就是web.xml中配置的吗?就是利用这种方式加到tomcat容器中的,SpringMV也是类似,做的事也就下面两件事
         */
        //创建servlet
        tomcat.addServlet(CONTEXT_PATH,"IndexServlet",new IndexServlet());
        //添加servlet映射
        standardContext.addServletMappingDecoded("/index","IndexServlet");
        tomcat.start();
        System.out.println("启动tomcat服务器。。。。");
        tomcat.getServer().await();
    }
}

启动程序后访问http://localhost:8080/itboy/index看是否成功。

2.3 springMVC无配置启动

SpringMVC原理

https://upload-images.jianshu.io/upload_images/7964614-85f89a14164e5be0.png?imageMogr2/auto-orient/

  •  用户发送请求至前端控制器DispatcherServlet

⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。

⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

⑸ 执行处理器(Controller,也叫后端控制器)。

⑹ Controller执行完成返回ModelAndView

⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器

⑼ ViewReslover解析后返回具体View

⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

⑾ DispatcherServlet响应用户。

DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件。

在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置,该文件一般会打包进最后的war包种;但是Spring 3引入了注解,在2.2的基础上,下面展示基于注解配置Spring MVC

添加依赖:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>

2.3.1 加载SpringMVCDispatcherServlet

AbstractAnnotationConfigDispatcherServletInitializer这个类负责配置DispatcherServlet、初始化Spring MVC容器和Spring容器。getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.classgetServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.classgetServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。

RootConfig.java,Spring应用容器的配置

@Configuration
@ComponentScan(basePackages = "com.itboy")
public class RootConfig {
}

WebConfig.java,Spring MVC的配置

@Configuration
@EnableWebMvc
@ComponentScan("com.itboy.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
}

启动类:

public class App {
    public static void main(String[] args) throws ServletException, LifecycleException, IOException {
        start();
    }

    private static void start() throws ServletException, LifecycleException, IOException {
        Tomcat tomcat=new Tomcat();
        tomcat.setPort(8080);
        StandardContext standardContext= (StandardContext) tomcat.addWebapp("/",new File("selfspboot/src/main").getAbsolutePath());
        //禁止重新载入
        standardContext.setReloadable(false);
        File additionWebInfClasses=new File("target/classes");
        //创建webroot
        WebResourceRoot resourceRoot=new StandardRoot(standardContext);
        resourceRoot.addPreResources(
                new DirResourceSet(resourceRoot,"/WEB-INF/classes",additionWebInfClasses.getAbsolutePath(),"/")
        );
        tomcat.start();
        System.out.println("服务启动。。。");
        tomcat.getServer().await();
    }
}

controller:

@RestController
public class IndexController {
    @RequestMapping(value = "/index",produces = "text/html;charset=utf-8")
    public String index(){
        return "开始了,这就搞定啦???????";
    }
}

启动后访问http://localhost:8080/index看看神器的效果发生了?

2.4 添加jsp支持,不就是整合jsp?

在2.3的WebConfig.java中添加以下内容

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        //可通过${}访问beans
        viewResolver.setExposeContextBeansAsAttributes(true);
        return viewResolver;
    }

设置好相应的配置好相应的controller以及jsp文件,比如访问http://localhost:8080/index2是否成功。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_37049496/article/details/81839458
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 02:04:26
  • 阅读 ( 784 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢