一. 创建根项目
根项目(父项目)主要用于依赖管理
一些需要注意的点:
- 打包方式需要为 pom
- <modules>里需要注册子模块
- 不要引入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
这个模块主要是配置一些所有人都需要引入的包或一些公共内容(比如全局异常类、控制层返回结果的泛型类等等),所以微服务模块都注册这个模块,实现对公共包的引入
一些需要注意的点:
- 除了根项目外,其他的打包方式都为jar
- 在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: common
cloud:
nacos:
discovery:
server-addr: nacos #尤其注意!这里填写的是在docker里的服务名而非公网id
port: 8848
config:
server-addr: nacos #尤其注意!这里填写的是在docker里的服务名而非公网id
file-extension: yml #在nacos上配置的是yml
config:
import:
#配置导入的文件的全称,不配置启动会报错
- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
三. 创建微服务模块
需要注意的点:
- 在yml里Nacos的配置地址需要写成docker里的nacos容器名而非公网ip
- 要指定主类<mainClass>,不然打包之后, 执行 java -jar 会报找不到主类
- <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: realproject
cloud:
nacos:
discovery:
server-addr: nacos #尤其注意!这里填写的是在docker里的容器名而非公网ip
port: 8848
config:
server-addr: nacos #尤其注意!这里填写的是在docker里的容器名而非公网ip
file-extension: yml #在nacos上配置的是yml
config:
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
需要注意的点:
- 由于这里只是简单的配置了docker-compose .yaml,没法等nacos启动完毕了之后再启动该微服务,所以加了restart: always,如果微服务报nacos连接失败的错误,可以排查一下这一点,也可以先启动了nacos再启动该微服务
version: "2"
services:
realproject:
image: openjdk:17-jdk
container_name: realproject
ports:
- "8061:8061"
volumes:
- /mydata/simpleproject:/app
environment:
- TZ="Asia/Shanghai"
command: java -jar /app/realproject-0.0.1-SNAPSHOT.jar #/app是容器里的目录,对应上面的volumes的挂载
restart: always
depends_on:
- nacos
nacos:
image: nacos/nacos-server:v2.5.1
container_name: nacos
environment:
- 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=256m
volumes:
- /mydata/nacos/log:/var/log/nacos
- /mydata/standalone-logs/:/mydata/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
在docker-compose.yaml目录下,执行
docker compose up
部署成功