当前位置: 首页 > news >正文

基于Docker Compose部署Java微服务项目

一. 创建根项目

根项目(父项目)主要用于依赖管理

一些需要注意的点:

  1. 打包方式需要为 pom
  2. <modules>里需要注册子模块
  3. 不要引入maven的打包插件,否则打包时会出问题
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.cqw.simpleproject</groupId><artifactId>simpleproject</artifactId><version>0.0.1-SNAPSHOT</version><name>simpleproject</name><description>simpleproject</description><!--  打包方式为pom  --><packaging>pom</packaging><!--  版本变量  --><properties><java.version>17</java.version><spring-cloud.version>2021.0.1</spring-cloud.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><lombok.version>1.18.20</lombok.version><spring-boot.version>2.6.3</spring-boot.version><maven-plugin.version>3.1.1</maven-plugin.version><mavem-compiler-version>3.8.1</mavem-compiler-version></properties><!--  注册子模块  --><modules><module>common</module><module>realproject</module></modules><!-- 父依赖控制大版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><type>pom</type><scope>import</scope><version>${spring-boot.version}</version></dependency><!--      spring cloud      --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--	spring cloud alibaba		--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!--	lombok		--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement><!--管理插件版本依赖--><build><pluginManagement><plugins><!--        构建Spring Boot程序        --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${maven-plugin.version}</version></plugin><!--        控制jdk编译的版本        --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${mavem-compiler-version}</version><configuration><source>17</source><target>17</target></configuration></plugin></plugins></pluginManagement></build>
</project>

二. 创建公共模块common

这个模块主要是配置一些所有人都需要引入的包或一些公共内容(比如全局异常类、控制层返回结果的泛型类等等),所以微服务模块都注册这个模块,实现对公共包的引入

一些需要注意的点:

  1. 除了根项目外,其他的打包方式都为jar
  2. 在yml里Nacos的配置地址需要写成docker里的nacos容器名而非公网ip

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--  指定根项目为父  --><parent><groupId>org.cqw.simpleproject</groupId><artifactId>simpleproject</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>org.cqw.simpleproject</groupId><artifactId>common</artifactId><version>0.0.1-SNAPSHOT</version><name>common</name><description>common</description><!--  除了根项目外,剩下的项目打包方式都为jar  --><packaging>jar</packaging><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--    服务发现    --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--    配置中心    --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

yml

spring:application:name: commoncloud:nacos:discovery:server-addr: nacos #尤其注意!这里填写的是在docker里的服务名而非公网idport: 8848config:server-addr: nacos #尤其注意!这里填写的是在docker里的服务名而非公网idfile-extension: yml #在nacos上配置的是ymlconfig:import:#配置导入的文件的全称,不配置启动会报错- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}

三. 创建微服务模块

需要注意的点:

  1. 在yml里Nacos的配置地址需要写成docker里的nacos容器名而非公网ip
  2. 要指定主类<mainClass>,不然打包之后, 执行 java -jar 会报找不到主类
  3. <spring-boot-maven-plugin>的配置尤其注意,如果没有repackage,打包的jar则不包含所有的依赖包,在其他服务器是无法直接执行的

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.cqw.simpleproject</groupId><artifactId>simpleproject</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>org.cqw.simpleproject</groupId><artifactId>realproject</artifactId><version>0.0.1-SNAPSHOT</version><name>realproject</name><description>realproject</description><packaging>jar</packaging><dependencies><!--   直接引入公共模块即可     --><dependency><groupId>org.cqw.simpleproject</groupId><artifactId>common</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><!--   引入maven插件     --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--    指定主类,不然打包之后,java -jar会报找不到主类 --><configuration><mainClass>org.cqw.simpleproject.realproject.RealprojectApplication</mainClass><!--      不跳过插件              --><skip>false</skip></configuration><!--        将项目打包成一个可执行的jar,包含了所有依赖包在里面        --><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

yml

spring:application:name: realprojectcloud:nacos:discovery:server-addr: nacos #尤其注意!这里填写的是在docker里的容器名而非公网ipport: 8848config:server-addr: nacos #尤其注意!这里填写的是在docker里的容器名而非公网ipfile-extension: yml #在nacos上配置的是ymlconfig:import:#配置导入的文件的全称,不配置启动会报错- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}

一个简单的Controller用于验证

package org.cqw.simpleproject.realproject.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author yamu* @version 1.0* @description* @date 2025/6/5 11:47*/@RestController
@RequestMapping()
public class TestController {@RequestMapping("/hello")public String hello() {return "Hello World";}
}

四. 打包,发送到虚拟机或服务器上

执行maven插件的打包
在这里插入图片描述

上述完成后,目录结构如下:
在这里插入图片描述

接着把/realproject/target/realproject-0.0.1-SNAPSHOT.jar发送到服务器或虚拟机上

五. 编写docker-compose.yaml

需要注意的点:

  1. 由于这里只是简单的配置了docker-compose .yaml,没法等nacos启动完毕了之后再启动该微服务,所以加了restart: always,如果微服务报nacos连接失败的错误,可以排查一下这一点,也可以先启动了nacos再启动该微服务
version: "2"
services:realproject:image: openjdk:17-jdkcontainer_name: realprojectports:- "8061:8061"volumes:- /mydata/simpleproject:/appenvironment:- TZ="Asia/Shanghai"command: java -jar /app/realproject-0.0.1-SNAPSHOT.jar #/app是容器里的目录,对应上面的volumes的挂载restart: alwaysdepends_on:- nacosnacos:image: nacos/nacos-server:v2.5.1container_name: nacosenvironment:- PREFER_HOST_MODE=hostname- MODE=standalone# 省略了一些内容- NACOS_AUTH_IDENTITY_KEY=- NACOS_AUTH_IDENTITY_VALUE=- NACOS_AUTH_TOKEN=- JVM_XMS=512m- JVM_XMX=512m- JVM_XMN=256mvolumes:- /mydata/nacos/log:/var/log/nacos- /mydata/standalone-logs/:/mydata/nacos/logsports:- "8848:8848"- "9848:9848"

在docker-compose.yaml目录下,执行

docker compose up

部署成功

在这里插入图片描述

在这里插入图片描述

http://www.lqws.cn/news/142453.html

相关文章:

  • docker快速部署OS web中间件 数据库 编程应用
  • ES6中的Map与Set数据结构的简单应用
  • Python html 库用法详解
  • 【Spark征服之路-2.2-安装部署Spark(二)】
  • ajax学习手册
  • 会计 - 金融负债和权益工具
  • 腾讯云V3签名
  • Zookeeper 和 Kafka 版本与 JDK 要求
  • 从二叉树到 STL:揭开 set 容器的本质与用法
  • CIFAR10的使用
  • Vue ②-computed || watch || 指令
  • 【Algorithm】Union-Find简单介绍
  • 《区间DP》题集
  • 【十年技术演进深度解构:车载充电机(OBC)将成为新能源汽车的“能源大脑”】
  • 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】
  • 智慧照明:集中控制器、单双灯控制器与智慧灯杆网关的高效协同
  • npm install 报错:npm error: ...node_modules\deasync npm error command failed
  • python入门(1)
  • AI Agent 能否理解人类的行为和决策?
  • 单锁与分布式锁
  • 【学习记录】Linux 密码破解实战
  • 【Vue】初学Vue(setup函数,数据响应式, 脚手架 )
  • Mybatis入门到精通
  • GO语言----基础类型取别名
  • 2025 Vscode插件离线下载方式
  • HOPE800系列变频器安装到快速调试的详细操作说明
  • Python-多线程
  • Python训练打卡Day42
  • 【DVWA系列】——Brute Force(暴力破解)——low
  • C++抽象类与多态实战解析