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

news2025/6/12 21:02:54

一. 创建根项目

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

一些需要注意的点:

  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: 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}

三. 创建微服务模块

需要注意的点:

  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: 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

需要注意的点:

  1. 由于这里只是简单的配置了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

部署成功

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…