2.16.Spring Boot 热加载/部署
热部署不会用在生产环境,但对于程序员开发的效率,还是有一定帮助的,所谓的热部署,就是在应用程序在不停止的情况下,实现新的部署
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间
修改pom文件,增加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
修改properties文件
如果使用的 Thymeleaf 模板,那么请直接在application.properties中添加
spring.thymeleaf.cache=false
如果使用的 FreeMarker 模板,那么请直接在application.properties中添加
spring.freemarker.cache=false
2.16.1.IDEA中使用
如果你是使用eclipse,请忽略,但如果你是使用IDEA,由于idea 没有保存修改的,也就是说在idea中并不会因为你ctrl+s 就重新编译代码。
那么就需要额外的配置
在pom文件中,增加编译插件,让代码有变动的时候也编译
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 如果不设置fork,那么不会restart,devtools热部署不会起作用-->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
1、手动:修改完代码,按快捷键Ctrl+F9,手动构建项目,或者只修改单个类文件的话,按Ctrl+Shift+F9,重新编译该类文件,即可触发重启服务。
2、自动
1)File -> Settings -> Compiler,勾选 Build Project automatically
2)按快捷键Ctrl+Shift+Alt+/,选择1.Registry…
3)勾选 compiler.automake.allow.when.app.running 即可
这个时候修改JAVA文件或者模板文件都自动会生效
2.17.编译,打包
快速入门进行到这里,其实已经差不多了,能应对绝大多数开发常见,接下来就是导包部署。
在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>
<!-- 如果不设置fork,那么不会restart,devtools热部署不会起作用-->
<fork>true</fork>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用mvn clean package 打包
java –jar 运行
2.17.1.war部署
如果并不希望使用内置的tomcat,希望部署到其他tomcat服务器,那么就需要使用war包部署了。
修改pom文件,打包方式改成war
修改在pom文件,剔除内置tomcat的支持,否则会和外面的tomcat冲突
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。
相当于compile,但是打包阶段做了exclude操作-->
<scope>provided</scope>
</dependency>
修改启动类,使其继承
org.springframework.boot.web.servlet.support.SpringBootServletInitializer,并重写configure方法
package cn.enjoy;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan("cn.enjoy.dao")
public class App extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(App.class);
}
}
使用mvn clean package 打包
把war包拷贝到tomcat webapps中
访问:http://localhost:8080/springbootvip/hello
3.进阶部分
3.1.集成Redis
修改pom文件,增加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在properties增加redis配置
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=5000
新建单元测试
package cn.enjoy.test;
import cn.enjoy.App;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@SpringBootTest(classes = {App.class})
@RunWith(SpringRunner.class)
public class SpringRedisTest {
@Resource
private RedisTemplate<String,String> redisTemplate;
@Test
public void testRedis() throws Exception {
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("name", "enjoy");
String value = ops.get("name");
System.out.println(value);
}
}
3.2.集成RabbitMQ
RabbitMq在后面讲到springcloud的时候还会用到,在这会简单的安装使用下RabbitMq,至于RabbitMQ的详细使用请参考分布式消息队列课题
3.2.1.Windows安装RabbitMQ
先安装Erlang
下载地址:
http://erlang.org/download/otp_win64_20.3.exe
RabbitMQ Server 3.7.4下载地址
https://bintray.com/rabbitmq/all/download_file?file_path=rabbitmq-server%2F3.7.4%2Frabbitmq-server-3.7.4.exe
安装好后,启动服务
开启web插件
进入rabbitmq安装目录的sbin目录,在命令行界面开启web插件
rabbitmq-plugins enable rabbitmq_management
重新启动reabbitmq服务,在地址栏输入http://localhost:15672/
使用默认用户 guest/guest登陆界面
3.2.2.新增用户,并设置权限
用新创建的enjoy用户登陆,发现新用户已经新增成功
设置权限
点击这用户,设置虚拟主机的权限(全部可读,可写,可配置)
这个时候一个enjoy新用户设置完毕
3.2.3.SpringBoot中使用RabbitMq
修改pom文件,增加rabbitmq依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
修改配置properties文件,增加rabbitmq的连接信息
## rabbitmq config
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=enjoy
spring.rabbitmq.password=123456
创建Rabbit配置类,用来配置队列,交换器,路由等高级信息
package cn.enjoy.mq;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue firstQueue() {
// 创建一个队列,名称为:enjoy
return new Queue("enjoy");
}
}
创建消息的生产者
package cn.enjoy.mq;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class Sender {
@Resource
private AmqpTemplate rabbitTemplate;
public void send() {
rabbitTemplate.convertAndSend("enjoy", "this a messages !!!");
}
}
创建消息的消费者
package cn.enjoy.mq;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
//定义该类需要监听的队列
@RabbitListener(queues = "enjoy")
public class Receiver {
@RabbitHandler //指定对消息的处理
public void process(String msg) {
System.out.println("receive msg : " + msg);
}
}
新增单元测试
package cn.enjoy.test;
import cn.enjoy.App;
import cn.enjoy.mq.Sender;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class RabbitmqTest {
@Resource
private Sender sender;
@Test
public void testRabbitmq() throws Exception {
sender.send();
}
}
3.3.Actuator监控管理
Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。可以使用HTTP的各种请求来监管,审计,收集应用的运行情况.特别对于微服务管理十分有意义
缺点:没有可视化界面(Spring cloud 还会用到这功能,就可以看到界面了)
修改pom文件,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改application.properties文件,启动监控端点
# 加载所有的端点/默认只加载了 info / health
management.endpoints.web.exposure.include=*
# 描述信息
info.blog-url=http://xiangxueketang.cn
info.author=enjoy
info.version=@project.version@
重新启动,在地址栏输入
http://localhost:8080/actuator/info
在界面看到这说明监控成功
Actuator访问路径
通过actuator/+端点名就可以获取相应的信息。
路径 作用
/actuator/beans 显示应用程序中所有Spring bean的完整列表。
/actuator/configprops 显示所有配置信息。
/actuator/env 陈列所有的环境变量。
/actuator/mappings 显示所有@RequestMapping的url整理列表。
/actuator/health 显示应用程序运行状况信息 up表示成功 down失败
/actuator/info 查看自定义应用信息