整理pom文件
这里 <relativePath/>与指定的父级pom不能同时存在,不然打包时会报错,在这里<relativePath>
元素用于指定父级项目的相对路径,直接指定不要使用相对路径
<parent>
<groupId>music</groupId>
<artifactId>music</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- <relativePath/>-->
</parent>
接下来
添加打包插件,注意这里的
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
在整个项目的根pom中不要添加这段executions(但是需要添加打包插件),如下,其他的模块全部需要添加打包插件和executions,解释一下execution,它的 id
为 repackage
,这个 id 可以是任意的,用于标识这个执行阶段。<goals>
元素指定了这个执行阶段要执行的目标(goals),在这里,它指定了要执行 repackage
接下来再注意一些pom的小细节
1.服务的父模块如mchat-service只能指定<packaging>为pom而不能为jar
2.如下2图类似的utils,model,feign依赖模块,有时候会(经常)报错,业务模块找不到指定的如下1图的依赖,导致无法打包,这时候就可以在被依赖模块中添加2图中框选的<configuration>,这样就不会打包报错了
3.有时候依赖服务模块(utils,model......)还会打包报错----无法找到主类,这时候直接创建一个main类里面添加一个空的main方法就可以了
打包业务服务与依赖服务
在这里我们要使用到docker和docker-compose来创建服务镜像和容器
这里如何在虚拟机中使用docker操作就不赘述了,一搜一大把
这里讲如何在IDEA中使用docker,直接在plugins里面搜索Docker安装Docker然后启用就可以了如下
然后需要配置远程连接虚拟机中的docker,
选择TCP连接,填写URL,这里需要修改虚拟机中的docker配置才能连接成功,怎么修改这里就不赘述了,一搜一大把
编写DockerFile
根据这里的注释编写把变量换成自己对应的表示就好了,---DcokerFile是为了创建服务镜像
注意暴露端口就是你的服务端口后面会讲到
编写业务依赖的docker-compose-env.yml
如下,用于创建依赖(如mysql,redis........)的镜像和启动对应容器
具体如何编写这里不再赘述,一搜一大把
version: '3'
services:
mysql:
container_name: mysql
image: mysql:8.0.27
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ""
volumes:
- ./mysql_data:/var/lib/mysql #挂载到本地目录实现持久化
- ./mysql_init:/docker-entrypoint-initdb.d #启动脚本
command: --default-authentication-plugin=mysql_native_password
restart: always
networks:
- fuckingNet
redis:
container_name: redis
image: redis:latest
ports:
- "6379:6379"
environment:
PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
GOSU_VERSION: "1.17"
REDIS_VERSION: "7.2.4"
REDIS_DOWNLOAD_URL: "http://download.redis.io/releases/redis-7.2.4.tar.gz"
REDIS_DOWNLOAD_SHA: "8d104c26a154b29fd67d6568b4f375212212ad41e0c2caa3d66480e78dbd3b59"
command:
- "--requirepass"
- ""
volumes:
- ./redis_data:/data
working_dir: "/data"
restart: always
entrypoint:
- "docker-entrypoint.sh"
networks:
- fuckingNet
rabbitmq:
container_name: rabbitmq
image: rabbitmq:3.12.12-management
ports:
- "15671:15671"
- "15672:15672"
- "15691:15691"
- "15692:15692"
- "25672:25672"
- "4369:4369"
- "5671:5671"
- "5672:5672"
environment:
RABBITMQ_DEFAULT_USER: ""
RABBITMQ_DEFAULT_PASS: ""
volumes:
- ./rabbitmq_data:/var/lib/rabbitmq
restart: always
command:
- "rabbitmq-server"
networks:
- fuckingNet
nacos:
container_name: nacos
image: nacos/nacos-server:latest
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
environment:
MODE: "standalone"
PREFER_HOST_MODE: "ip"
BASE_DIR: "/home/nacos"
CLASSPATH: ".:/home/nacos/conf:"
CLUSTER_CONF: "/home/nacos/conf/cluster.conf"
FUNCTION_MODE: "all"
JAVA_HOME: "/usr/lib/jvm/java-1.8.0-openjdk"
NACOS_USER: "nacos"
JAVA: "/usr/lib/jvm/java-1.8.0-openjdk/bin/java"
JVM_XMS: "1g"
JVM_XMX: "1g"
JVM_XMN: "512m"
JVM_MS: "128m"
JVM_MMS: "320m"
NACOS_DEBUG: "n"
TOMCAT_ACCESSLOG_ENABLED: "false"
TIME_ZONE: "Asia/Shanghai"
restart: always
entrypoint:
- "bin/docker-startup.sh"
working_dir: "/home/nacos"
networks:
- fuckingNet
minio:
container_name: minio
image: minio/minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: ""
MINIO_ROOT_PASSWORD: ""
volumes:
- ./minio_data:/data
restart: always
command:
- "server"
- "/data"
- "--console-address"
- ":9001"
networks:
- fuckingNet
networks:
fuckingNet:
编写业务依赖的docker-compose-service.yml
这里注意ports:- "8880:8880" 映射前面对应外部访问端口,后面对应服务的端口
还有这里的docker-compose文件其实就是去执行刚刚创建的DockerFile文件,从而创建镜像和启动容器
如何编写docker-compose文件建议百度
version: '3'
services:
mchat-gateway:
container_name: mchat-gateway
build:
context: ./mchat-gateway
dockerfile: DockerFile
ports:
- "8880:8880"
networks:
- fuckingNet
chat-server:
container_name: chat-server
build:
context: ./mchat-service/chat-server
dockerfile: DockerFile
ports:
- "8899:8899"
networks:
- fuckingNet
depends_on:
- mchat-gateway
music-client-server:
container_name: music-client-server
build:
context: ./mchat-service/music-client-server
dockerfile: DockerFile
ports:
- "8877:8877"
networks:
- fuckingNet
depends_on:
- chat-server
- mchat-gateway
music-manage-server:
container_name: music-manage-server
build:
context: ./mchat-service/music-manage-server
dockerfile: DockerFile
ports:
- "8888:8888"
networks:
- fuckingNet
depends_on:
- music-client-server
- chat-server
- mchat-gateway
networks:
fuckingNet:
打包之前
在打包之前,注意修改nacos中的配置,这里建议创建两套配置,即添加一个application-prod.yml配置,然后把其中的依赖的地址改成自己刚刚创建依赖容器时的容器名称,如下
创建的新的yml配置文件如下,这里name改成__服务名称+prod,然后在nacos创建一套新的如上的配置
记得修改feign模块的@FeignClient(value = "mchat-manage-prod", contextId = "ListSong")
将value修改为新的prod配置文件中的name
打包
使用maven工具,在根文件夹上先clean再package
打包会遇到的各种问题开头基本上说到了
运行docker-compose文件
先运行依赖即-env后缀的文件,再运行业务-prod后缀
如果运行docker-compose文件时报错---找不到指定的docker-compose.exe,那就直接去下载一个DockerDesktop
然后找到刚刚下载的DockerDesktop的docker-compose.exe文件的路径,把该路径设置到IDEA里面
这样基本上就可以了
然后成功运行之后大概是这样
点开容器可以看到执行状态
测试是否成功部署
前后端分离项目,直接把请求ip地址改成虚拟机地址即可
尝试访问
访问成功
后端本地部署结束