目录
二、Spring Boot 与 Spring Cloud的关系
4.1 EnableAutoConfiguration + ComponentScan注解
一、什么是 Spring Boot
Spring Boot是一个快速开发框架,能够快速整合第三方常用框架。完全采用注解化、简化xml,最终以Java应用程序进行运行(java -jar)。
Spring Boot 不是微服务框架。
二、Spring Boot 与 Spring Cloud的关系
2.1 Spring Cloud
Spring Cloud是一套目前比较完整的微服务解决方案。
2.2 关系
Spring Boot的web组件默认集成SpringMVC,Spring Cloud依赖于Spring Boot实现微服务,使用SpringMVC编写微服务接口。
结论:Spring Boot + Spring Cloud实现微服务。
三、Spring Boot 与 SpringMVC的关系
Spring Boot的web组件集成了SpringMVC。
Spring Boot使用注解的方式来启动SpringMVC。SpringMVC在3.0的时候产生了 @EnableWebMvc 注解,可以代替web.xml来启动SpringMVC。
原理:通过Java代码创建Tomcat。
四、Spring Boot启动方式
4.1 EnableAutoConfiguration + ComponentScan注解
@EnableAutoConfiguration 注解:自动配置和启动,该注解的扫包范围是只在当前类中。
@ComponentScan注解:配置扫包范围
@EnableAutoConfiguration
@ComponentScan("com.xxx.www.controller")
public class Application {
public static void main(String[] args) {
// 整个程序的入口,启动SpringBoot项目
SpringApplication.run(Application.class, args);
}
}
4.2 @SpringBootApplication 注解
@SpringBootApplication注解:相当于@EnableAutoConfiguration + @ComponentScan,扫包范围是该类所在同级包和当前包(包括子包)。可以与 @ComponentScan 配合使用。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// 整个程序的入口,启动SpringBoot项目
SpringApplication.run(Application.class, args);
}
}
五、全局捕获异常
整个web请求项目全局捕获异常。
应用场景:在项目编写过程中,可能会出现很多的运行时异常,虽然每个异常都可以用try-catch捕获并处理,但代码会显得很臃肿难看。因此可以使用全局捕获异常技术来进行异常的通用处理。
原理:使用AOP技术,采用异常通知。
/**
* 全局捕获异常案例
* 1.捕获返回json格式
* 2.捕获返回页面
*/
@ControllerAdvice(basePackages = "com.xxx.www.controller")
public class GlobalExceptionHandler {
// 使用 @ResponseBody, 返回json格式
// 返回 modeAndView 类型, 返回页面
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> errorResult() {
// 实际开发中,应该将错误记录在日志中。
Map<String, Object> errorResultMap = new HashMap<String, Object>();
errorResultMap.put("code", "500");
errorResultMap.put("msg", "系统错误!");
return errorResultMap;
}
}
六、AOP统一处理Web请求日志
使用AOP技术进行日志记录。
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
// 切入点
@Pointcut("execution(public * com.xxx.www.controller.*.*(..))")
public void webLog() {
}
/**
* 使用AOP前置通知拦截请求参数信息
* 前置通知
*/
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
/*
* 后置通知
*/
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
}
七、异步调用
“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。
使用方式:启动类加上@EnableAsync,需要执行异步方法的地方使用@Async。
八、自定义参数
@Value注解:可以从配置文件中获取对应名称的自定义项目参数。执行时间:在初始化的时候就会读取并赋值。
application.properties文件中
name=www.xxx.com
需要用到的地方(IndexController.java)
@RestController
public class IndexController {
@Value("${name}")
private String name;
}
九、区分多环境配置文件
使用 spring.profiles.active 配置区分配置文件
application.properties文件中
spring.profiles.active=dev
表示加载application-dev.properties配置文件
十、事务管理(待补充)
Spring Boot默认集成了事务。在需要使用事务的类或方法上添加 @Transactional 注解即可。
10.1 事务分类
声明式事务
编程式事务
10.2 事务原理
使用AOP技术,利用环绕通知进行拦截。
注意:使用事务时不需要try-catch,因为需要把异常抛出给外层。
10.3事务的默认传播行为:required
十一、多数据源
应用场景:公司有两个数据库,一个数据库专门存放共同配置文件,一个数据库负责垂直业务,即一个项目中有多个数据源(多个数据库)。
垂直拆分和水平拆分:垂直是根据业务划分具体的数据库,水平是分表。
11.1 多数据源划分
划分方式:分包名(即根据业务) 或 注解方式。
分包方式参考资料:点击此处
11.2 多数据源事务管理
当项目中有多个数据源和多个事务管理器时,Spring Boot不知道该找哪个事务管理器来执行事务,此时,需要手动指定事务管理器。指定方法为在事务注解上指定:
@Transactional(transactionManager = "transactionManager01")
public int insertUser(User user) throws Exception {
return userService.insertUser(user);
}
十二、热部署
12.1 热部署原理
使用类加载器( classloader 重新读取字节码文件到 jvm 内存)
1.监听class文件是否有发生变化——通过文件版本号或修改时间。
2.如果发生改变,使用 classloader 进行重新读取。
思考:热部署是否可以用于生产环境?
答:理论上可以,但不安全,所以不推荐,一般用于本地开发。
热部署缺点:如果项目较大,会非常卡,比较占用内存。
12.2 Devtools
Spring Boot 集成的热部署框架。Devtools的热部署原理是重启项目而不是使用类加载,所以效率会极低。不推荐使用。
十三、Spring Boot 性能优化
13.1 扫包优化
注意:扫包优化指优化启动速度。
原理:@SpringBootApplication 默认会扫当前包和同级包,使用递归遍历的方式扫子包和类。可能会扫到无用的包。使用 @ComponentScan 只扫controller和service层 + @EnableAutoConfiguration 的方式启动,可以减少部分启动时间。
13.2 jvm参数调优
参数调优对启动速度影响不大,主要影响运行整体速度(比如吞吐量:默认每秒完成的请求数量)。
调优策略:初始化堆内存与最大相同(默认最大4G,但初始化不是),并给予足够的大小,可以大量减少gc回收次数。
内部调优(感觉没啥用): 在eclipse启动项目时配置:-XX:+PrintGCDetails -Xmx4096M -Xms4096M
-Xmx:最大堆内存大小
-Xms:初始化堆内存大小
外部调优:命令启动jar包时:java -server -Xmx4096M -Xms4096M -jar xxx.jar
13.3 修改Tomcat容器为Undertow容器
Undertow:也是一个web服务器,属于JBoss旗下。点击此处了解。
Spring Boot默认web容器是Tomcat,而Tomcat的吞吐量大概在5000,而Undertow的吞吐量大约在8000,明显优于Tomcat。
使用Undertow
pom.xml
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
十四、yml使用
Spring Boot默认读取application.yml 或 application.properties 文件。
yml的好处:yml比properties配置文件结构更加清晰,也更简洁。
十五、打包发布
15.1 Jar方式
1. pom.xml中需要配置指定打包方式为jar,指定入口
<packaging>jar</packaging>
<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>
<mainClass>com.itmayiedu.App</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.使用命令
mvn package:maven打包命令
mvn clean install:maven清理并重新打包
15.2 War方式
如果项目中有用到 jsp,则必须使用war类型打包。
Spring Boot 2.0 内置的Tomcat版本在8.5.25以上,所以使用外部低版本的Tomcat运行Spring Boot 2.0项目的war包可能会出现依赖jar包不兼容的情况,所以建议使用8.5.25以上版本的Tomcat。
1.pom.xml指定打包方式为war,指定入口
<packaging>war</packaging>
<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>
<mainClass>com.itmayiedu.App</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
十六、监控中心
什么是Spring Boot的监控中心(actuator)
针对微服务的服务状态、Http请求资源的监控。可以服务配置链接地址是否可用。
Spring Boot对MySQL的连接默认是懒加载的。
actuator本身没有可视化界面,AdminUI集成actuator实现可视化监控界面。
AdminUi
AdminUi底层使用Actuator监控应用,实现可视化界面
原理(类似于注册中心(比如eureka)):
1、将所有服务的监控中心管理存放在adminUi上。被监控服务内部集成Actuator监控应用,并注册到adminUi平台。
2、AdminUi平台接收到注册的服务的json数据并进行解析、展示。