SpringBoot热部署原理

spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。

Devtools依赖

在这里插入图片描述
Devtools原理

  1. devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。
  2. devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现(这里注意不同的模板配置不一样)

监控管理

Actuator监控应用
Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。可以使用HTTP的各种请求来监管,审计,收集应用的运行情况.特别对于微服务管理十分有意义.缺点:没有可视化界面。

Maven依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>

</dependencies>

YML配置
###通过下面的配置启用所有的监控端点,默认情况下,这些端点是禁用的;

management:
 endpoints:
  web:
	  exposure:
 	   include: "*"
spring:
 profiles:
  active: prod
datasource:
  driver-class-name: com.mysql.jdbc.Driver
	url: jdbc:mysql://127.0.0.1:3306/test
	username: root
  password: root
test: 
 name: test

Actuator访问路径
通过actuator/+端点名就可以获取相应的信息。

路径 作用
/actuator/beans 显示应用程序中所有Spring bean的完整列表。
/actuator/configprops 显示所有配置信息。
/actuator/env 陈列所有的环境变量。
/actuator/mappings 显示所有@RequestMapping的url整理列表。
/actuator/health 显示应用程序运行状况信息 up表示成功 down失败
/actuator/info 查看应用信息

演示案例:
/actuator/info 配置文件新增
info:
test: test
addres: www.test.com

Admin-UI分布式微服务监控中心
Admin-UI基于actuator实现能够返回界面展示监控信息
Admin-UI-Server
Maven依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
	<dependency>
		<groupId>de.codecentric</groupId>
		<artifactId>spring-boot-admin-starter-server</artifactId>
		<version>2.0.0</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-webflux</artifactId>
	</dependency>
	<!-- Spring Boot Actuator对外暴露应用的监控信息,Jolokia提供使用HTTP接口获取JSON格式 的数据 -->
	<dependency>
		<groupId>org.jolokia</groupId>
		<artifactId>jolokia-core</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
	<dependency>
		<groupId>com.googlecode.json-simple</groupId>
		<artifactId>json-simple</artifactId>
		<version>1.1</version>
	</dependency>
</dependencies>

application.yml配置文件

spring:
application:
	name: spring-boot-admin-server

启动方式

@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class AdminServerApplication {

public static void main(String[] args) {
	SpringApplication.run(AdminServerApplication.class, args);
}
}

Admin-UI-Client
Maven依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
	<dependency>
		<groupId>de.codecentric</groupId>
		<artifactId>spring-boot-admin-starter-client</artifactId>
		<version>2.0.0</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
	<dependency>
		<groupId>org.jolokia</groupId>
		<artifactId>jolokia-core</artifactId>
	</dependency>
	<dependency>
		<groupId>com.googlecode.json-simple</groupId>
		<artifactId>json-simple</artifactId>
		<version>1.1</version>
	</dependency>

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


</dependencies>

YML配置

spring:
boot:
	admin:
  	client:
    	url: http://localhost:8080
server:
port: 8081

management:
endpoints:
	web:
  	exposure:
    	include: "*"
endpoint:
	health:
  	show-details: ALWAYS

启动类、

@SpringBootApplication
public class AppClinet {

public static void main(String[] args) {
	SpringApplication.run(AppClinet.class, args);
}

}

在这里插入图片描述
性能优化

组件自动扫描带来的问题
默认情况下,我们会使用 @SpringBootApplication 注解来自动获取应用的配置信息,但这样也会给应用带来一些副作用。使用这个注解后,会触发自动配置( auto-configuration )和 组件扫描 ( component scanning ),这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。这样做给开发带来方便的同时,也会有三方面的影响:
1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。
2、会加载一些不需要的多余的实例(beans)。
3、会增加 CPU 消耗。
针对以上三个情况,我们可以移除 @SpringBootApplication 和 @ComponentScan 两个注解来禁用组件自动扫描,然后在我们需要的 bean 上进行显式配置:
//// 移除 @SpringBootApplication and @ComponentScan, 用

@EnableAutoConfiguration 来替代
//@SpringBootApplication
@Configuration
@EnableAutoConfiguration
public class App01 {

public static void main(String[] args) {
	SpringApplication.run(App01.class, args);
}

}

以@SpringBootApplication 启动时间8.56秒
将Servlet容器变成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>

SpringBoot JVM参数调优
这个根据服务器的内存大小,来设置堆参数。
-Xms :设置Java堆栈的初始化大小
-Xmx :设置最大的java堆大小
实例参数-XX:+PrintGCDetails -Xmx32M -Xms1M
本地项目调优
在这里插入图片描述
外部运行调优

java -server -Xms32m -Xmx32m  -jar springboot_v2.jar

服务器名称 第一次运行 第二次运行 第三次运行 平均值

Tomcat 4773 5194 5334.7 5100
Undertow 6666 6373 6451 6496

2.0版本新特性

以Java 8 为基准
Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持。
内嵌容器包结构调整
为了支持reactive使用场景,内嵌的容器包结构被重构了的幅度有点大。EmbeddedServletContainer被重命名为WebServer,并且org.springframework.boot.context.embedded 包被重定向到了org.springframework.boot.web.embedded包下。举个例子,如果你要使用TomcatEmbeddedServletContainerFactory回调接口来自定义内嵌Tomcat容器,你现在应该使用TomcatServletWebServerFactory。
Servlet-specific 的server properties调整
大量的Servlet专属的server.* properties被移到了server.servlet下:
在这里插入图片描述
使用@Scheduled创建定时任务

在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

@Component
public class ScheduledTasks {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
    System.out.println("现在时间:" + dateFormat.format(new Date()));
  }
}

使用@Async实现异步调用

启动加上@EnableAsync ,需要执行异步方法上加入 @Async
在方法上加上@Async之后 底层使用多线程技术

Maven依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</dependency>
</dependencies>

演示代码

@RestController
@Slf4j
public class IndexController {

@Autowired
private UserService userService;

@RequestMapping("/index")
public String index() {
	log.info("##01##");
	userService.userThread();
	log.info("##04##");
	return "success";
	}

}

@Service
@Slf4j
public class UserService {

@Async // 类似与开启线程执行..
public void userThread() {
	log.info("##02##");
	try {
		Thread.sleep(5 * 1000);
	} catch (Exception e) {
		// TODO: handle exception
	}
	log.info("##03##");

	// new Thread(new Runnable() {
	// public void run() {
	// log.info("##02##");
	// try {
	// Thread.sleep(5 * 1000);
	// } catch (Exception e) {
	// // TODO: handle exception
	// }
	// log.info("##03##");
	// }
	// }).start();
	}

}


@EnableAsync // 开启异步注解
@SpringBootApplication
public class App {

public static void main(String[] args) {
	SpringApplication.run(App.class, args);
}

}

自定义参数

配置文件值
name=test.com
配置文件值

@Value("${name}")
private String name;
@ResponseBody
@RequestMapping("/getValue")
public String getValue() {
	return name;
}

多环境配置

spring.profiles.active=pre
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境

修改端口号

server.port=8888 
server.context-path=/test
SpringBoot yml 使用
SpringBoot 默认读取 application.yml|properties
YML 比properties配置文件更加节约 简约(结构)

创建application.yml

server:
port:  8090
context-path: /test

发布打包
Jar类型打包方式
1.使用mvn celan package 打包
2.使用java –jar 包名
war类型打包方式
1.使用mvn celan package 打包
2.使用java –jar 包名
外部Tomcat运行
1.使用mvn celan package 打包
2.2.0将war包 放入到tomcat webapps下运行即可。

注意:springboot2.0内置tomcat8.5.25,建议使用外部Tomcat9.0版本运行即可,否则报错版本不兼容。

打包常见错误
如果报错没有主清单,在pom文件中新增

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<maimClass>com.test.app.App</maimClass>
			</configuration>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>

		</plugin>
	</plugins>
</build>

Java jar 执行的时候报错 ’ 不是内部或外部命令 说明 jdk环境没有安装

发布了60 篇原创文章 · 获赞 4 · 访问量 7619

猜你喜欢

转载自blog.csdn.net/selt791/article/details/104620320