在J2EE开发中,通常将应用部署到Tomcat或者Jetty等Servlet容器中。而在SpringBoot中则提供了更加轻量级的方案,就是将应用打包成内嵌Servlet容器的jar包,可以直接通过 java -jar app.jar
命令运行。因为在微服务架构中,会涉及大量服务的部署,这种轻量级方案无疑会简化部署,并且极大提高微服务的部署效率。
make Jar, not War
-- Josh Long
将应用打包成*.jar包,需要使用SpringBoot的maven插件:
1<plugin> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-maven-plugin</artifactId> 4</plugin>
直接使用 mvn package
命令进行打包,此时,得到的jar包,我们可以通过 java -jar app.jar
命令运行。
在Linux系统中,我们还可以进一步打成可执行的jar包,可以直接通过 ./app.jar
命令直接运行,只要只要配置maven插件:
1<plugin> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-maven-plugin</artifactId> 4 <configuration> 5 <executable>true</executable> 6 </configuration> 7</plugin>
打包:
在每个模块的 target
目录下,生成可行执行的jar包。
对于SpringBoot应用打成的jar包,可以方便的进行部署,很多Paas平台都是支持的,这里还是用一台Linux虚拟机进行部署,Ubuntu16 64位系统,并且只要安装好JDK1.8即可。
将打包好的jar包,比如上图中的 user-service/target/user-service-1.0-SNAPSHOT.jar
,上传到服务器的 opt/app
目录,运行:
./user-service-1.0-SNAPSHOT.jar
这种运行比较简单,同时,也会缺乏对应用进程的控制。为了更好的控制应用程序的进程,方便启动,重新,停机等操作,可以使用进程的管理工具。
可以使用 supervisor
等第三方工具,不过,SpringBoot更加推荐集成到系统自带的 init.d
或者 systemd
中。Ubuntu16已经支持 systemd
,所以,我们将应用集成到 systemd
中。
创建配置 /etc/systemd/system/user.service
1[Unit] 2Description=user service 3After=syslog.target 4 5[Service] 6User=noone 7ExecStart=/opt/app/user-service-1.0-SNAPSHOT.jar 8SuccessExitStatus=143 9 10[Install] 11WantedBy=multi-user.target
使用systemd启动:
sudo systemctl daemon-reload sudo systemctl start user.service
首先刷新一下配置,然后启动服务。对于配置文件发生的更改,需要使用此命令。
启动完成后,使用命令查看服务状态:
1noone@ubuntu:/opt/app$ sudo systemctl status user.service 2● user.service - user service 3 Loaded: loaded (/etc/systemd/system/user.service; disabled; vendor preset: enabled) 4 Active: active (running) since Sat 2018-09-01 18:38:14 PDT; 6min ago 5 Main PID: 10819 (user-service-1.) 6 CGroup: /system.slice/user.service 7 ├─10819 /bin/bash /opt/app/user-service-1.0-SNAPSHOT.jar 8 └─10833 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /opt/app/user-service-1.0-SNAPSHOT.jar
停止服务:
1noone@ubuntu:/opt/app$ sudo systemctl stop user.service 2noone@ubuntu:/opt/app$ sudo systemctl status user.service 3● user.service - user service 4 Loaded: loaded (/etc/systemd/system/user.service; disabled; vendor preset: enabled) 5 Active: inactive (dead)
也可以将该服务设置开机启动,如果出现服务器重启,那应用可以自动重启。
sudo systemctl enable user.service
对于Java应用,通常都需要设置一些JVM参数,特别是堆栈空间大小等参数。SpringBoot也支持设置参数,我们只需要遵循约定进行配置即可。
在服务的同目录下,添加配置文件 user-service-1.0-SNAPSHOT.conf
,注意配置文件名要和服务保持一致,如下:
noone@ubuntu:/opt/app$ tree . ├── user-service-1.0-SNAPSHOT.conf └── user-service-1.0-SNAPSHOT.jar
配置文件内容:
1JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
5 小结
使用基于jar包的部署方式更加简单,很多Pass平台也都是支持这种方式。同时,如果在公司内部的部署平台集成,这种方式也比较简单。进一步,如果使用Docker或者K8等技术,这种部署方案也可以很容易集成。所以,在微服务架构中,轻量级的部署方案,可以让服务的发布更加高效。