开发热部署
SpringBoot模板引擎的页面默认是开启缓存的,如果修改了页面,则刷新页面是得不到修改后的页面的
在application.properties中关闭模板引擎缓存
- Thymeleaf spring.thymeleaf.cache=false
- FreeMarker spring.freemarker.cache=false
- Groovy spring.groovy.template.cache=false
- Velocity spring.velocity.cache=false
Spring Loaded实现修改类文件的热部署,下载Spring Loaded地址http://repo.spring.io/simple/libs-release-local/org/springframework/springloaded/1.2.3.ELEASE/springloaaded-1.2.3.RELEASE.jar
安装单击Run Config urations…
在Arguments标签的vm arguments填入springloaded的路径
-javaagent:E:\springloaded-1.2.3.RELEASE.jar -noverify
JRebel热部署工具(收费)
①、EclipseMarketPlace中进行检索JRebel并安装,重启即可完成安装
②、注册配置
SpringBoot增加JRebel功能:右键—JRebel—AddJRebel Nature
此时为我们添加一个rebel.xml用来配置热部署内容
JReble会对target/classes目录下的文件进行热部署
首次启动给会询问是否已JReble启动程序
Spring-boot-devtools
项目中添加spring-boot-devtools依赖,即可代码热部署
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools<artifactId>
</dependency>
常规部署
jar形式
①、新建SpringBoot项目的时候选择打包方式是jar,使用mvn package
②、运行
java -jar xx.jar
③、注册为linux服务
修改spring-boot-maven-plugin
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
然后使用mvn package打包
主流的Linux使用init.d或systemd来注册服务,linux下运行的软件通常把它注册为服务,可以通过命令开启、关闭、以及保持开机启动等功能
Ⅰ、通过SSH将jar上传到/var/apps下
Ⅱ、安装JDK,rpm -ivh jdk-8u51-linux-x64.rpm
Ⅲ、基于Linux的init.d部署(servciename为自定义的服务名)
sudo ln -s /var/apps/xxx.jar /etc/init.d/servicename
Ⅳ、通过命令操作
servic servicename start 启动服务
service servicename stop 停止服务
service servicename status 服务状态
chkconfig servicename on 开机启动
项目日志存放于/var/log/servicename.log下,用cat或tail等命令查看
Ⅴ、基于linux的Systemd部署
在/etc/systemd/system/目录下新建文件servicename.service,内容如下
[Unit]
Description=servicename
After=syslog.target
[Service]
ExecStart= /usr/bin/java -jar /var/apps/xxx.jar
[Install]
WantedBy=multi-user.target
实际使用中修改Description和ExecStart后面的内容
# 启动服务
systemctl start servicename
#或
systemctl start servicename.service
# 停止服务
systemctl stop servicename
#或
systemctl stop servicename.service
# 服务状态
systemctl status servicename
#或
systemctl status servicename.service
# 开机启动
systemctl enable servicename
#或
systemctl enable servicename.service
# 项目日志
journalctl -u servicename
#或
journalctl -u servicename.service
war形式
打包之后,放在Servlet容器上执行
打包为jar,部署想要用war形式部署
①、修改pom.xml中
<packaging>jar</packing>
<!--修改为-->
<packaging>war</packing>
②、增加下面依赖覆盖默认内嵌的Tomcat
<dependency>
<groupId>prg.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
③、增加ServletInitializer类
public class ServeltInitializer extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
return application.sources(Ch10warApplication.class);
}
}
基于docker的云部署
DockerFile主要以下指令
FROM ubutu #指明当前镜像的基础镜像
MAINTAINER wyf #指明当前镜像的作者
#在当前镜像上执行Linux命令,并形成一个新的层,RUN是编译时的动作
RUN /bin/bash -c "echo helloworld"
RUN ["/bin/bash","-c","echo hello"]
CMD echo "this is a test" #指明了启动镜像容器时的默认行为
docker run -d image_name echo "this is not a test" #可以覆盖上面的
EXPOSE 8080 #指明了镜像运行时的容器必需监听指定的端口
# 设置环境变量
ENV myName=wyf
ENV myName wyf
ADD test.txt /mydir/ #从当前工作目录复制文件到镜像目录中
# 可以向容器像一个可执行程序一样运行,这样镜像运行时可以像软件一样接收参数执行
ENTRYPOINT ["/bin/echo"] #时运行时(run)的动作
docker run -d image_name "this is not a test"
yum install docker #安装Docker
systemctl start docker
systemctl enable docker #启动Docker并保持开机自启
①、将打包好的jar放入/var/apps/ch10docker目录下,在同级目录下新建一个Dockerfile文件
FROM java:8 #基础镜像
MAINTAINER wyf #作者
ADD ch10docker.jar app.jar #将我们的jar添加到镜像中,并重命名app.jar
EXPOSE 8080 #运行镜像的容器,监听8080端口
ENTRYPOINT ["java","-jar","/app.jar"] #启动时运行java -jar app.jar
②、编译镜像
在/var/apps/ch10docker目录下执行下面命令,执行编译镜像
docker build -t wisely/ch10docker .
wisely/ch10docker为镜像名称,设置wisely为前缀(Docker镜像命名习惯)
最后的“.”指明Dockerfile路径,标识当前路径下
查看本地镜像 docker images
③、运行
docker run -d --name ch10 -p 8080:8080 wisely/ch10docker
docker ps 查看当前容器状态
访问当前ip下的8080端口即可
将微服务模块config以Docker进行部署
①、runboot.sh脚本
位于src/main/docker下,根据启动顺序调整sleep的时间
sleep 10
java -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar
②、Dockerfile编写
src/main/docker下
FROM java:8
VOLUME /tmp
RUN mkdir /app
ADD xxx.jar /app/app.jar #不同的微服务模块,只需修改此处
ADD runboot.sh /app/
RUN bash -c 'touch /app/app.jar'
WORKDIR /app
RUN chmod a+x runboot.sh
EXPOSE 8888 #不同的微服务模块,只需修改此处
CMD /app/runboot.sh
③、Docker的maven插件
在开发机器编译Docker镜像到服务器,使用docker-maven-plugin即可
在所有程序pom.xml内添加
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
④、编译镜像
使用docker-maven-plugin,默认将Docker编译到localhost
如果是远程Linux服务器,请在环境变量中配置DOCKERHOST,值为tcp://192.168.1.68:2375
在控制台CMD下:mvn clean package docker:build -DskipTests
查看Linux服务器上的镜像docker images
Docker Compose
用来定义和运行多容器应用的工具
使用docker-compose.yml来描述多容器的定义,docker-compose up 运行整个应用
①、Docker-compose.yml编写
enviromment 给容器使用的变量,在容器中使用${}来调用
links 当前容器依赖的容器,可直接使用依赖容器的已有端口
ports 将我们需要暴露的端口映射出来,不需要暴露的端口则不做映射
postgresdb:
image: busybox
volumes:
- /var/lib/postgresql/data
postgres:
name: postgres
image: postgres
hostname: postgres
volumes_from:
- postgresdb
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
discovery:
image: "discovery:1.0.0-SNAPSHOT"
hostname: discovery
name: discovery
ports:
- "8761:8761"
config:
image: "config:1.0.0-SNAPSHOT"
hostname: config
name: config
links:
- discovery
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
ports:
- "8888:8888"
person:
image: person:1.0.0-SNAPSHOT
hostname: person
links:
- discovery
- config
- postgres
environment:
EUREKA_HOST: doscovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "8082:8082"
some:
image: some:1.0.0-SNAPSHOT
hostname: some
links:
- discovery
- config
environment:
EUREKA_HOST: discovery
EUREKA_PORT :8761
SPRING_PORFILES_ACTIVE: docker
ports:
- "8083:8083"
ui:
image: ui:1.0.0-SNAPSHOT
hostname: ui
links:
- discovery
- config
- person
- some
enviromnent:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACBIVE: docker
ports:
- "80:80"
monitor:
image: monitor:1.0.0-SNAPSHOT
hostname: monitor
links:
- discovery
- config
- person
- some
- ui
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "8989:8989"
②、运行
将docker-compose.yml上传到Linux服务器上,在文件当前目录执行 docker-compose up -d
-d 表示后台运行
这样就可以在本地访问http:192.168.1.68:8761和http:192.168.1.68:8761