文章目录
前言
在日常开发工作中通常会根据不同的项目运行环境,添加不同的配置文件,例如 开发环境,测试环境,生产环境等,每次手工的修改配置文件太过于繁琐,所以,可以在通过maven打包时确定需要使用的配置文件可以很好的解决这个问题。
一、Spring 配置
在application.yml中添加配置
# Spring配置
spring:
profiles:
active:
- "@activated.profile@"
二、Maven 配置
Spring 配置文件也可以通过 Maven 配置文件激活
,通过指定activated.profile 配置属性。
在每个 Maven 配置文件(父pom.xml)中,我们可以设置一个activated.profile属性,代码如下(示例)::
<profiles>
<profile>
<id>druid</id>
<activation>
<!-- 不显式指定环境时, 会取 activeByDefault true 的环境变量,
需要注意的是: 没指定 activeByDefault true 的其他相同 profile id 的 properties 是不会生效的-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<activated.profile>druid</activated.profile>
</properties>
<build>
<resources>
<resource>
<!--不加载docker.* 配置文件-->
<filtering>false</filtering>
<directory>src/main/resources</directory>
<excludes>
<exclude>application-docker.*</exclude>
</excludes>
</resource>
<resource>
<!--加载.* , druid.* 配置文件-->
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application.*</include>
<include>application-druid.*</include>
</includes>
</resource>
</resources>
</build>
</profile>
<profile>
<id>docker</id>
<properties>
<activated.profile>docker</activated.profile>
<!-- redis连接配置,与application-docker.yml配置文件中属性绑定 -->
<redis.host>ruoyi-redis</redis.host>
<redis.port>6379</redis.port>
<!-- mysql连接配置,与application-docker.yml配置文件中属性绑定 -->
<datasource.url><![CDATA[jdbc:mysql://172.16.10.132:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8]]></datasource.url>
<datasource.username>root</datasource.username>
<datasource.password>root</datasource.password>
</properties>
<build>
<resources>
<resource>
<!--不加载druid.* 配置文件-->
<filtering>false</filtering>
<directory>src/main/resources</directory>
<excludes>
<exclude>application-druid.*</exclude>
</excludes>
</resource>
<resource>
<!--加载.* , docker.* 配置文件-->
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application.*</include>
<include>application-docker.*</include>
</includes>
</resource>
</resources>
</build>
</profile>
</profiles>
<activated.profile>docker</activated.profile>它的值将用于替换 application.yml中的@activated.profile@ 占位符:
因此,项目就会加载application-docker.yml 的配置
同理,当需要配置数据库信息时,也可用此方法,标签名一致即可,替换application-docker.yml中的数据。
三、Nginx 配置
使用Nginx进行反向代理,创建nginx.conf
文件,代码如下(示例):
#允许生成的进程数,默认为1
worker_processes 1;
events {
#每个进程的最大连接数,默认为512
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表
include /etc/nginx/mime.types;
#允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile on;
# 代理缓冲区
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
client_max_body_size 100m;
# keepalive_timeout 65;
server {
listen 80;
# server_name localhost;
# charset utf-8;
location / { # 请求的url过滤
# 对应docker-compose.yml文件中的配置(nginx:volumes)
root /home/www/ruoyi-frontend;
}
location /prod-api/ {
resolver 127.0.0.11 ipv6=off;
# 对应docker-compose.yml文件中的配置(ruoyi-system 容器名可代表IP),8080代表后端模块端口
set $upstream ruoyi-system:8080;
proxy_pass http://$upstream;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、Docker部署
Dockerfile 定制镜像
创建Dockerfile
文件,代码如下(示例):
FROM openjdk:8-jre
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
WORKDIR /
ENTRYPOINT ["java","-jar","/app.jar"]
Docker Compose 定义和运行多个 Docker 容器
创建docker-compose.yaml
文件,代码如下(示例):
version: "3.7"
services:
# 对于不是自定义镜像,可直接从线上(dockerhub)拉取
redis:
image: redis:latest # 镜像名:版本
container_name: ruoyi-redis # 容器中的镜像名
ports: # 映射端口-->对外暴露端口:容器内部占用端口
- 6379:6379
networks: # 网关
- backend
environment:
- TZ=Asia/Shanghai
# 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: unless-stopped
ruoyi:
build: ./ruoyi-admin # 指定同级目录的eureka文件中构建的镜像(Dockerfile文件)
image: ruoyi/system:latest
container_name: ruoyi-system
volumes:
# D:\logs\ruoyi 部署成功后,日志文件的位置
# /logs 对应模块下application-docker.yml中配置的日志路径
- D:\logs\ruoyi:/logs
networks:
- backend
# ports:
# - 8080:8080
depends_on:
- redis # 当前容器依赖于这个项目启动之后才能启动
environment:
- TZ=Asia/Shanghai
# nginx 配置
nginx:
image: nginx:latest
container_name: ruoyi-nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./frontend:/home/www/ruoyi-frontend # 静态资源路径(打包后的资源文件夹名) : nginx.cong中配置的路由跳转路径
ports:
- 31002:80 # 对外暴露端口:容器内部占用端口(即nginx监听端口)
restart: unless-stopped
networks:
- backend
# 配置网关
networks:
backend:
name: ruoyi # 随便取
五、打包部署命令
前端
在前端Vue项目的package.json
,的 "scripts"中添加
"build:prod": "vue-cli-service build",
直接运行该指令,或npm run bulid:prod
,生成静态资源文件,复制至后端项目中
后端
###帮助文件
### maven commands
/**
-P xxx ,激活id为xxx的profile(如有多个,用逗号隔开)
-DskipTests 打包时,跳过src->test 测试文件夹
*/
mvn clean package -P docker -DskipTests
mvn clean package -P docker -DskipTests -Ddatasource.url=<your db url> -Ddatasource.username=<your db username> -Ddatasource.password=<your db password> -Djwt.secret=<your jwt secret>
### 移动打包好后的文件
修改、运行 gatherWarPackages.bat
### docker compose
##### 全部启动
docker compose up // -d --no-start --no-recreate --no-build (-d是在后台运行)
docker compose up --build service1 service2 (部分启动)
##### build
docker compose build [service1, service2...]
举例说明:docker compose build service1 service2 (服务之间用空格隔开)
##### start
docker compose start [service1, service2...]
##### restart
docker compose restart [service1, service2...]
注意事项 1
当定制镜像时,如果使用openjdk:8-jre-alpine
有可能会出现NullPointerException错误
,如下所示:
java.lang.NullPointerException
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
这是由于alpine缺少FontConfiguration导致的。
所以,建议此时,使用openjdk:8-jre
,即可解决问题。
注意事项 2
当使用Nginx进行反向代理的时候,如果nginx.conf
配置文件写在了项目里,则说明部署的时候会将Nginx也部署在Docker中,docker-compose.yml
中的ports可选择性
注释掉,因为Nginx与项目部署在一起,所以两者的端口其实是一致的,映射端口无意义。
当不使用Nginx而使用Gateway进行代理时,也可选择性
注释部分ports,因为Gateway帮我们映射了
注意事项 3
当你部署完成后,如果需要通过idea启动项目,则必须重新编译原有项目