SpringBoot新手快速入门系列教程十一:基于Docker Compose部署一个最简单分布式服务项目

我的教程都是亲自测试可行才发布的,如果有任何问题欢迎留言或者来群里我每天都会解答。

如果您还对于Docker或者Docker Compose不甚了解,可以劳烦移步到我之前的教程:

SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目

SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目

分布式服务有许多优势,特别是在处理大型和复杂系统时。以下是一些主要的优势:

  1. 可扩展性:分布式服务可以很容易地通过添加更多的服务器来扩展系统容量,从而处理更多的请求和更大的数据量。

  2. 可靠性和高可用性:通过将服务分布在多个节点上,即使某个节点出现故障,其他节点仍然可以继续提供服务,确保系统的高可用性和可靠性。

  3. 性能:分布式服务可以将工作负载分散到多个服务器上,减少单个服务器的负载,提高整体系统的性能和响应速度。

  4. 灵活性:分布式系统通常采用微服务架构,可以让不同的服务独立开发、部署和维护,提高了系统的灵活性和响应变化的能力。

  5. 故障隔离:分布式系统可以将故障隔离在单个节点或服务中,防止故障扩散到整个系统,从而提高系统的稳定性。

  6. 资源优化:分布式服务可以充分利用不同服务器的计算资源和存储资源,提高资源利用率,降低成本。

  7. 地理分布:分布式系统可以在不同的地理位置部署服务器,提供本地化的服务,降低延迟,改善用户体验。

  8. 模块化:通过将系统分解为独立的模块,可以更容易地进行测试、调试和维护,提高开发效率。

今天我会带你来一步一步实现你人生的第一个分布式服务部署,你可以在本地的window系统上做简单的测试部署。当然如果条件允许你也可以尝试的部署在两台不同的服务器上。

我们今天要做的业务逻辑拆分是基于上一教程,用户“输入用户名注册” HelloDistributedDockerA和 “用户通过用户名确认自己是否可以登录”HelloDistributedDockerB 为例子来拆分之前的两个业务逻辑运行在不同的Docker容器内。

步骤一:创建项目

我们来分别创建:HelloDistributedDockerA和HelloDistributedDockerB 项目,依赖如下

步骤二:HelloDistributedDockerA代码

RegisterController.java

package com.yuye.www.hellodistributeddockera.controller;

import com.yuye.www.hellodistributeddockera.entity.User;
import com.yuye.www.hellodistributeddockera.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RegisterController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/register")
    public String registerUser(@RequestParam String name) {
        // Check if a user with the same name already exists
        if (userRepository.existsByName(name)) {
            return "User already exists";
        }

        // If user doesn't exist, create a new user and save to the database
        User user = new User();
        user.setName(name);
        userRepository.save(user);
        return "User registered successfully";
    }
}

User.java

package com.yuye.www.hellodistributeddockera.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

UserRepository.java

package com.yuye.www.hellodistributeddockera.repository;

import com.yuye.www.hellodistributeddockera.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByName(String name);
    boolean existsByName(String name);
}

RegisterServiceApplication.java

package com.yuye.www.hellodistributeddockera;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloDistributedDockerAApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloDistributedDockerAApplication.class, args);
	}
}

application.properties

spring.application.name=HelloDistributedDockerA
spring.datasource.url=jdbc:mysql://mysql:3306/userdata?useSSL=false&serverTimezone=UTC
spring.datasource.username=Yichael
spring.datasource.password=Qwerty9527
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
server.port=8081

Dockerfile

FROM openjdk:17-jdk-slim

ENV SERVER_PORT=8081

COPY build/libs/hellodistributeddockerA-0.0.1-SNAPSHOT.jar app.jar

EXPOSE 8081

ENTRYPOINT ["java", "-jar", "/app.jar"]

docker-compose.yml:

version: '3.8'
services:
  register-service:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8081:8081"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/userdata
      SPRING_DATASOURCE_USERNAME: Yichael
      SPRING_DATASOURCE_PASSWORD: Qwerty9527
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: Qwerty123
      MYSQL_DATABASE: userdata
      MYSQL_USER: Yichael
      MYSQL_PASSWORD: Qwerty9527
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

步骤三:服务二的代码

1,LoginController.java

package com.yuye.www.hellodistributeddockerb.controller;

import com.yuye.www.hellodistributeddockerb.entity.User;
import com.yuye.www.hellodistributeddockerb.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
public class LoginController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/login")
    public String loginUser(@RequestParam String name) {
        Optional<User> user = userRepository.findByName(name);
        if (user.isPresent()) {
            return "User found: " + name;
        } else {
            return "User not found";
        }
    }
}

2,User.java:

package com.yuye.www.hellodistributeddockerb.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3,UserRepository.java

package com.yuye.www.hellodistributeddockerb.repository;

import com.yuye.www.hellodistributeddockerb.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByName(String name);
    boolean existsByName(String name);
}

4,HelloDistributedDockerBApplication.java

package com.yuye.www.hellodistributeddockerb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloDistributedDockerBApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloDistributedDockerBApplication.class, args);
    }
}

5,application.properties

spring.application.name=HelloDistributedDockerB
spring.datasource.url=jdbc:mysql://mysql:3306/userdata?useSSL=false&serverTimezone=UTC
spring.datasource.username=Yichael
spring.datasource.password=Qwerty9527
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
server.port=8082

6,Dockerfile

FROM openjdk:17-jdk-slim

ENV SERVER_PORT=8082

COPY build/libs/hellodistributeddockerB-0.0.1-SNAPSHOT.jar app.jar

EXPOSE 8082

ENTRYPOINT ["java", "-jar", "/app.jar"]

7,docker-compose.yml

version: '3.8'
services:
  login-service:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8082:8082"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/userdata
      SPRING_DATASOURCE_USERNAME: Yichael
      SPRING_DATASOURCE_PASSWORD: Qwerty9527
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: Qwerty123
      MYSQL_DATABASE: userdata
      MYSQL_USER: Yichael
      MYSQL_PASSWORD: Qwerty9527
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

步骤三:部署和测试步骤

部署 HelloDistributedDockerA
  1. 打开命令行或终端,导航到 HelloDistributedDockerA 项目目录。
  2. 运行以下命令构建并启动服务

docker-compose up --build

这将构建 register-service 容器并启动 MySQL 数据库。

部署 HelloDistributedDockerB
  1. 打开另一个命令行或终端,导航到 HelloDistributedDockerB 项目目录。
  2. 运行以下命令构建并启动服务:
docker-compose up --build

这将构建 login-service 容器并启动 MySQL 数据库。

步骤四:部署和测试步骤

使用 Postman 或 curl 进行测试:

注册用户

curl -X GET "http://localhost:8081/register?name=testuser"

登录用户

curl -X GET "http://localhost:8082/login?name=testuser"

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文翻译:Large Language Models for Education: A Survey

目录 大型语言模型在教育领域的应用&#xff1a;一项综述摘要1 引言2. 教育中的LLM特征2.1. LLMs的特征2.2 教育的特征2.2.1 教育发展过程 低进入门槛。2.2.2. 对教师的影响2.2.3 教育挑战 2.3 LLMEdu的特征2.3.1 "LLMs 教育"的具体体现2.3.2 "LLMs 教育"…

【系统架构设计】计算机组成与体系结构(三)

计算机组成与体系结构&#xff08;三&#xff09; 计算机系统组成存储器系统主存储器辅助存储器Cache存储器Cache 基本原理映射机制直接映射全相联映射组相联映射 替换算法写操作 流水线&#xff08;计算&#xff09;流水线周期流水线执行时间流水线的吞吐率流水线的加速比 计算…

Python函数 之 匿名函数

1.概念 匿名函数: 使用 lambda 关键字 定义的表达式&#xff0c;称为匿名函数. 2.语法 lambda 参数, 参数: 一行代码 # 只能实现简单的功能&#xff0c;只能写一行代码 # 匿名函数 一般不直接调用&#xff0c;作为函数的参数使用的 3.代码 4.练习 # 1, 定义匿名函数, 参数…

JDK 和 JRE:它们之间的区别是什么?

JDK 和 JRE&#xff1a;它们之间的区别是什么&#xff1f; 1、JRE&#xff08;Java Runtime Environment&#xff09;1.1 JRE的主要组成部分1.2 JRE的用途 2、JDK&#xff08;Java Development Kit&#xff09;2.1 JDK的主要组成部分2.2 JDK的用途 3、总结 &#x1f496;The Be…

pbootCMS 数据库sqlite转mysql数据库

前言 pbootCMS默认使用 sqlite数据库 &#xff0c;那么什么是sqlite数据库呢&#xff1f; SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌…

Java | Leetcode Java题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack new ArrayDeque<Integer>();outStack new ArrayDeque<Integer>();}public void push(int x) {inStack.push(x);}pub…

Spark底层原理:案例解析(第34天)

系列文章目录 一、Spark架构设计概述 二、Spark核心组件 三、Spark架构设计举例分析 四、Job调度流程详解 五、Spark交互流程详解 文章目录 系列文章目录前言一、Spark架构设计概述1. 集群资源管理器&#xff08;Cluster Manager&#xff09;2. 工作节点&#xff08;Worker No…

数电基础 - 组合逻辑电路

目录 一. 简介 二. 分析方法 三. 设计方法 四. 常用的逻辑组合电路 五. 冒险现象 六. 消除冒险现象 七. 总结 一. 简介 组合逻辑电路是数字电路中的一种类型&#xff0c;它在任何时刻的输出仅仅取决于当时的输入信号组合&#xff0c;而与电路过去的状态无关。 组合逻辑…

红酒的艺术之旅:品味、鉴赏与生活的整合

在繁忙的都市生活中&#xff0c;红酒如同一道不同的风景线&#xff0c;将品味、鉴赏与日常生活巧妙地整合在一起。它不仅仅是一种饮品&#xff0c;更是一种艺术&#xff0c;一种生活的态度。今天&#xff0c;就让我们一起踏上这趟红酒的艺术之旅&#xff0c;探寻雷盛红酒如何以…

秋招突击——7/9——MySQL索引的使用

文章目录 引言正文B站网课索引基础创建索引如何在一个表中查看索引为字符串建立索引全文索引复合索引复合索引中的排序问题索引失效的情况使用索引进行排序覆盖索引维护索引 数据库基础——文档资料学习整理创建索引删除索引创建唯一索引索引提示复合索引聚集索引索引基数字符串…

映美精黑白相机IFrameQueueBuffer转halcon的HObject

映美精黑白相机&#xff0c;用wpfhalcon开发取图 1.到官网下载&#xff0c;开发包 1sdk 2c开发例子 3c#开发例子 引入TIS.Imaging.ICImagingControl35.dll 3.ICImagingControl使用这个类控制相机 /// <summary> /// 相机控制 /// </summary> public ICImagingC…

CentOS7二进制安装和YUM安装mongodb,服务器无法安装5.0以上的 mongodb 数据库报错 Illegal instruction

文章目录 MongoDB 安装二进制安装YUM 安装 Tips:1、MongoDB安装问题2、MongoDB登录3、MongoDB排序时内存大小限制和创建索引4、创建用户5、Java yaml使用密码连接mongodb6、MongoDB增删改查 MongoDB 安装 二进制安装 [rootmysql5-7 mongodb-6.0.4]# cat start.sh #!/bin/bash…

小程序-设置环境变量

在实际开发中&#xff0c;不同的开发环境&#xff0c;调用的接口地址是不一样的 例如&#xff1a;开发环境需要调用开发版的接口地址&#xff0c;生产环境需要正式版的接口地址 这时候&#xff0c;我们就可以使用小程序提供了 wx.getAccountInfoSync() 接口&#xff0c;用来获取…

作为空降高管,如何服众?教你3个步骤,站稳脚跟

作为空降高管&#xff0c;如何服众&#xff1f;教你3个步骤&#xff0c;站稳脚跟 第一招&#xff1a;请“尚方宝剑” 空降领导最大的劣势有4点&#xff1a; ①、缺乏支持&#xff0c;没有群众基础&#xff0c;不得民心。 ②、对环境不熟悉&#xff0c;不了解团队结构。 ③…

TCP传输控制协议二

TCP 是 TCP/IP 模型中的传输层一个最核心的协议&#xff0c;不仅如此&#xff0c;在整个 4 层模型中&#xff0c;它都是核心的协议&#xff0c;要不然模型怎么会叫做 TCP/IP 模型呢。 它向下使用网络层的 IP 协议&#xff0c;向上为 FTP、SMTP、POP3、SSH、Telnet、HTTP 等应用…

12-《向日葵》

向日葵 向日葵&#xff08;拉丁文&#xff1a;Helianthus annuusL.&#xff09;&#xff0c;为木兰纲、菊目、菊科、向日葵属的一年生草本植物。高1&#xff5e;3.5米。茎直立&#xff0c;圆形多棱角&#xff0c;质硬被白色粗硬毛。广卵形的叶片通常互生&#xff0c;先端锐突或…

如何在项目中打印sql和执行的时间

目标&#xff1a;打印DAO方法中sql和执行的时间 一种方式是去实现Mybatis的拦截器Interceptor &#xff0c;比较麻烦&#xff1b; 这里介绍一种比较简单的实现方式&#xff1b; 1、如何打印sql&#xff1f; 配置文件加这个可以打印出com.zhenhui.ids.busi.watch包下执行的sq…

Nacos服务公网环境登陆报密码错误问题排查

作者&#xff1a;小丫 一、问题现象 nacos服务内网可以正常登录&#xff0c;如下&#xff1a; 走公网代理出来之后&#xff0c;无法正常登录&#xff0c;报错"用户名密码错误" 二、排查步骤 1、链路分析 首先确认公网代理的链路&#xff1a; 域名—>haprox…

Stable Diffusion 深度探索:从入门到精通的全方位教程

在人工智能艺术创作的浪潮中&#xff0c;Stable Diffusion 作为一股不可忽视的力量&#xff0c;正以其独特的魅力吸引着无数创作者和科技爱好者的目光。本文旨在为大家提供一份详尽的 Stable Diffusion 教程&#xff0c;从基础概念到高级应用&#xff0c;带领你一步步走进这个充…

Detrs beat yolos on real-time object detection

Abstract 然而&#xff0c;我们观察到nnms对yolo的速度和准确性产生了负面影响。最近&#xff0c;端到端基于变压器的检测器(DETRs)为消除NMS提供了一种替代方案。然而&#xff0c;高昂的计算成本限制了它们的实用性&#xff0c;阻碍了它们充分发挥排除NMS的优势。在本文中&am…