飞道的博客

一文带你深入SpringBoot,从入门到优化,你还不了解吗?

370人阅读  评论(0)

一、SpringBoot简介

  开发团队:Pivotal团队

  主要目的:简化新Spring应用的初始搭建以及开发过程。

  秉持理念:约定优于配置。(该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置)

二、SpringBoot的特点

  1、快速创建独立的Spring应用程序。

    Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式

  2、嵌入的Tomcat,不需要部署war文件

  3、简化了Maven的配置

  4、自动装配Spring

  5、开箱即用,没有代码生成、也不需要XML的配置

  6、是微服务的入门级框架,SpringBoot是SpringCloud的基础  

  7、提供生产就绪功能:如指标、健康检查、外部配置等

三、环境创建

  Maven 3.3.9 + JDK1.8 + IDEA (Ultimate) 

四、创建首个SpringBoot项目

  新建Sring Initalizr项目

 

  然后点击next,显示为下面这张图片

  

 

  这里我就不建什么helloworld、hellospringboot之类的项目了,注意工程名字要全小写,package配置的是包名,可以根据自己的喜爱设置,然后点击next

   

这里我们选择web工程,然后next

这里是让我们选择自己的工作路径,建议不要包含中文路径,点击finish

下面,我们可以删除一些暂时用不到的文件夹和文件(一共是3个)

注意我使用的springboot版本号为2.0.1.RELEASE,尽量和我一致,不能然后面我所使用的方法你可能用不了。

  

 

如果这里显示为红色的话,是因为maven还没有把所需要的依赖下载到本地仓库。

pom.xml文件基本上是这样的

 

  
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion> 4.0.0</modelVersion>
  5. <groupId>com.zmfx</groupId>
  6. <artifactId>dog</artifactId>
  7. <version> 0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>dog</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent><!--定义了SpringBoot的版本信息-->
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version> 2.0.1.RELEASE</version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF- 8</project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF- 8</project.reporting.outputEncoding>
  20. <java.version> 1.8</java.version>
  21. </properties>
  22. <dependencies>
  23. <!--对于web的依赖-->
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. c <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <plugins>
  36. <plugin><!--SpringBoot的基本配置-->
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>

当所有的maven依赖下载完毕的时候,你项目的目录结构样子大体应该是这个样子的

  

依然是老套路,新建一个HelloController,来和SpringBoot打个招呼吧


  
  1. package com.zmfx.hello;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RequestMethod;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * 这里的@RestController 相当于@ResponseBody + @Controller
  7. */
  8. @RestController
  9. public class HelloController {
  10. @RequestMapping(value = "/hello",method = RequestMethod.GET)
  11. public String helloSpringBoot(){
  12. return "Hello SpringBoot!";
  13. }
  14. }

我们点击IDEA的运行按钮,然后在控制台会看到SpringBoot内置的Tomcat访问的默认端口号8080

  

然后在网址中输入 http://127.0.0.1:8080/hello  页面会展示 Hello SpringBoot!

说明我们成功的使用SpringBoot项目和SpringBoot打过招呼了

这里需要说明一下,SpringBoot的启动类 DogApplication


  
  1. package com.zmfx;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication //用来声明这是启动SpringBoot程序的启动类,必须有
  5. public class DogApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(DogApplication.class, args);
  8. }
  9. }

以上只是基础,接下来咱们再来看一下进阶一点的SpringBoot优化

在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢?
1. 方便微服务部署。
2. 方便项目启动,不需要下载Tomcat或者Jetty

针对目前的容器优化,目前来说没有太多地方,需要考虑如下几个点

  1. 线程数
  2. 超时时间
  3. jvm优化

针对上述的优化点来说,首先线程数是一个重点,初始线程数和最大线程数,初始线程数保障启动的时候,如果有大量用户访问,能够很稳定的接受请求,
而最大线程数量用来保证系统的稳定性,而超时时间用来保障连接数不容易被压垮,如果大批量的请求过来,延迟比较高,不容易把线程打满。这种情况在生产中是比较常见的
一旦网络不稳定,宁愿丢包也不愿意把机器压垮。
jvm优化一般来说没有太多场景,无非就是加大初始的堆,和最大限制堆,当然也不是无限增大,根据的情况进快速开始

 

在spring boot配置文件中application.yml,添加以下配置


  
  1. server:
  2. tomcat:
  3. min-spare-threads: 20
  4. max-threads: 100
  5. connection-timeout: 5000

 这块对tomcat进行了一个优化配置,最大线程数是100,初始化线程是20,超时时间是5000ms

 Jvm优化

这块主要不是谈如何优化,jvm优化是一个需要场景化的,没有什么太多特定参数,一般来说在server端运行都会指定如下参数
初始内存和最大内存基本会设置成一样的,具体大小根据场景设置,-server是一个必须要用的参数,
至于收集器这些使用默认的就可以了,除非有特定需求。

1.使用-server模式

设置JVM使用server模式。64位JDK默认启动该模式

java -server -jar springboot-1.0.jar

2.指定堆参数

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

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

java -server -Xms512m -Xmx768m  -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=8888 -jar springboot-1.0.jar

 

这个时候服务端远程Debug模式开启,端口号为8888。

在IDEA中,点击Edit Configuration按钮。

出现弹窗,点击+按钮,找到Remote选项。

 

在【1】中填入Remote项目名称,在【2】中填IP地址和端口号,在【3】选择远程调试的项目module,配置完成后点击OK即可

如果碰到连接超时的情况,很有可能服务器的防火墙的问题,举例CentOs7,关闭防火墙


  
  1. systemctl stop firewalld.service #停止firewall
  2. systemctl disable firewalld.service #禁止firewall开机启动

点击debug按钮,IDEA控制台打印信息:

说明远程调试成功。

 

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功能更加强大一下,界面也更美观

好了,今天的分享就是这些了,喜欢的话请帮小编多多点赞评论转发,关注小编,后续小编会再带来更丰富的学习内容更新,希望能更好的帮到大家学习哦~~~


转载:https://blog.csdn.net/python6_quanzhan/article/details/106845845
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场