项目构建与多环境

多环境的分类:

  1. 本地环境。可以理解为自己的电脑。
  2. 开发环境。开发人员远程开发,连接同一台机器。
  3. 测试环境:用于完成单元测试 / 性能测试 / 功能测试 / 系统集成测试,拥有独立的数据库、独立的服务器
  4. 预发布环境:和正式环境一致,正式数据库,更严谨。
  5. 正式环境:线上的,公开对外访问的项目。尽量不要改动。
  6. 沙箱环境:用于实验的环境。

通过配置环境区分多环境:

1
2
3
application.yml  # 公共配置
application-prod.yml
application-test.yml

IDEA Maven 命令面板选择并执行对应项目的:Lifecycle->package 命令进行打包。命令执行完成后将在 target 目录生成 jar 包。

SpringBoot 项目打包操作依赖

进行打包时需要引入 spring-boot-maven-plugin。不过基于官方骨架创建项目,会自动添加这个插件。

打包时可以在 IDEA 的 Maven 命令面板中选择 Skip Tests 禁掉单元测试。

本地部署

执行以下命令:

1
2
3
java -version # 确保Java可用
# 在启动时传入环境变量
java -jar .\my-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod # 指定环境为prod

这样 SpringBoot 项目就会使用 application-prod.yml 的配置。

1
2
# 观察 Springboot 启动日志可以看到
The following 1 profile is active: "prod"

Linux+Nginx 部署

1
2
3
4
5
6
# 检查java安装情况
java --version

# openjdk version "1.8.0_402"
# OpenJDK Runtime Environment (build 1.8.0_402-b06)
# OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)

把打好的 jar 包直接扔上服务器。假设我扔在这个目录中:/var/www/temp_test。必要时给予权限:

1
chmod a+x my-backend-0.0.1-SNAPSHOT.jar

也可以是:本地代码上传到仓库,然后服务器使用 Git 拉取代码,在服务器中运行 maven (服务器中需提前安装好 maven,并配置好仓库源)进行打包操作 mvn package -DskipTests

Linux 运行命令以启动项目(后台运行):

1
nohup java -jar ./my-backend-0.0.1-SNAPSHOT.jar &

查看运行的程序:

1
2
3
jobs # 查看运行程序
netstat -ntlp # 查看占用端口情况
jps # 查看运行的java程序

关于 nohup 命令详看:Linux 使用 nohup 后台运行程序

Nginx 配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
server{
server_name projects.uuanqin.top; ;
# 前端
location / {
root /var/www/temp_test/myapp;
index index.html index.htm;
}
# 后端 顺便解决跨域
location /api {
proxy_pass http://localhost:8123;
}
}

前端项目部署方式可看:Ant Design Pro 前端项目初始化到部署上线

Docker 容器部署

Docker 是容器,可以将项目的环境(比如 java、nginx)和项目的代码一起打包成镜像,所有具有权限的用户都能下载镜像,更容易分发和移植。

启动项目时不需要敲更多的命令,而是通过下载镜像、启动镜像即可。

1
docker --version # 验证Docker是否安装成功

Dockerfile 用于指定构建 Docker 镜像的方法,一般情况下不需要完全从 0 自己写,可以去 github、gitee 等托管平台参考同类项目(比如 springboot)参照写法。

Dockerfile 一般放置在项目的根目录中:

  • FROM:依赖的基础镜像
  • WORKDIR:工作目录
  • COPY:从本机复制文件
  • RUN:执行命令
  • CMD / ENTRYPOINT:指定运行容器时默认执行的命令,ENTRYPOINT 可以附加额外参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Docker 镜像构建
# 依赖于基础镜像
FROM maven:3.5-jdk-8-alpine as builder

# Copy local code to the container image.
# 指定工作目录
WORKDIR /app
# 本地把代码复制到容器中("."指的是当前目录"/app")
COPY pom.xml .
COPY src ./src

# 配置Maven源提升下载速度
COPY settings.xml /usr/share/maven/conf/settings.xml

# Build a release artifact.
# 执行Maven的打包命令
RUN mvn package -DskipTests

# Run the web service on container startup.
# 一些参数可以在启动Docker时覆盖掉,这里可以把环境参数写死
CMD ["java","-jar","/app/target/my-backend-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

Dockerfile 编写时,可以跳过 maven 的打包命令,直接将打好的 jar 包放入容器中也可以。这样还能减少体积,提升构建速度。

因为上面的 Dockerfile 中我们交给容器执行 maven 的打包命令,但是容器中 maven 仓库源为默认地址,下载速度极慢。我们需要配置 Maven 的下载源更换为阿里的镜像仓库。在项目主目录加上 settings.xml 文件,文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>central repo</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>apache snapshots</mirrorOf>
<name>阿里云阿帕奇仓库</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
</mirrors>
<proxies/>
<activeProfiles/>
<profiles>
<profile>
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>MavenCentral</id>
<url>http://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>aliyunmavenApache</id>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>

这里演示在服务器中制作镜像。首先将代码上传到 Linux 服务器中。构建镜像:

1
2
# 后端
docker build -t my-backend:v0.0.1 . # -t 打标签,"."表示使用当前的目录的Dockerfile构建镜像

运行镜像:

1
2
# 后端
docker run -p 8223:8123 -d my-backend:v0.0.1 # -d 表示后台运行

附 docker 常用命令:

1
2
3
4
5
docker ps # 查看运行的镜像
docker kill <CONTAINER...> # 杀死运行中的容器
docker logs <CONTAINER> # 追踪容器的日志输出
docker images # 查看镜像
docker rmi -f IMAGE [IMAGE...] # 移除镜像

其他方式

宝塔 Linux 部署

宝塔是一款 Linux 运维面板软件。可以更方便管理服务器软件或部署项目。

官网下载:宝塔面板下载,免费全能的服务器运维软件 (bt.cn)

建议在纯新系统安装宝塔面板,不支持已经部署项目/环境的系统进行安装。

容器托管平台的部署

容器平台:

  • 云服务商的容器平台(腾讯云、阿里云)
  • 面向某个领域的容器平台(前端 / 后端微信云托管)

使用容器平台的优点:

  • 不需要购买云服务器
  • 不用输命令来操作,更方便省事
  • 不用在控制台操作,更傻瓜式、更简单
  • 大厂运维,比自己运维更省心
  • 额外的能力,比如监控、告警、其他(存储、负载均衡、自动扩缩容、流水线)

微信云托管:微信云托管 (qq.com)

本文参考