Maven 聚合工程
学习目标
在这里,你将系统学习了解 Maven 聚合工程
的相关知识
我们将以最简单直接
的方式为您呈现内容!
# 🍜 单体服务架构
# 介绍
- 我们做一个简单的学生管理系统、外卖点餐平台等等,通常在使用单体服务架构就能搞定
# 优缺点分析
# 🥃 分布式服务架构
# 什么是分布式服务架构
分布式服务架构是一种系统架构,它将应用程序的不同组件或服务分布部署在不同的计算机节点上,并通过网络进行通信和协作。这种架构的目的是实现高性能、高可用性和可伸缩性。
从专业角度来看,分布式服务架构涉及以下关键概念:
# 如何构建分布式服务架构
服务拆分:首先,你需要将应用程序拆分成多个独立的服务。每个服务都应该具有明确定义的职责和边界。
服务接口定义:为每个服务定义清晰的接口,以便其他服务或客户端能够调用。
服务实现:为每个服务接口实现具体的逻辑。
服务注册与发现:使用注册中心来存储服务的元数据,以便其他服务能够发现和调用它们。
远程调用:使用 RPC(Remote Procedure Call)框架,如 Dubbo,来实现服务的远程调用。
负载均衡:通过负载均衡算法,确保请求能够均匀地分配到各个服务实例上。
服务监控与治理:建立监控系统以跟踪服务的性能和健康状况。此外,需要提供机制来管理和调整服务的配置。
容错与高可用性:实施策略以处理服务的故障和停机时间,确保系统的高可用性。
安全性:确保服务之间的通信是安全的,可能需要使用 HTTPS、OAuth、SSL/TLS 等技术。
综上所述,分布式服务架构是一种将应用程序的不同组件或服务分布部署在不同计算机节点上,并通过网络进行通信和协作的系统架构。其核心就是通过服务拆分、负载均衡、容错机制等技术手段实现高性能、高可用性和可伸缩性,以满足不断增长的业务需求。
# 🌮 实现服务拆分
我们要着手将目前的单体服务通过服务拆分,重构成为分布式服务架构。拆分服务需要根据业务边界实现,我们将着手实现:
拆分出 memory-backend-application 子服务:自定义丰富的接口实现。
拆分出 memory-backend-common 子服务:抽象公共服务,全局的实体映射类、通用返回类、自定义错误码等。
拆分出 memory-backend-gateway 子服务:实现网关,实现请求转发、统一鉴权、统一业务处理、负载均衡和访问控制等。
拆分出 memory-bacnkend-core-service 子服务:实现在线用户管理、接口发布与下线、接口调用管理。
拆分出 memory-backend-server-client 子服务:远程调用服务,实现内部服务间远程调用。
拆分出 memory-client-spring-boot-starter 子服务,封装调用自定义接口实现代码,一行代码即可边便捷调用后台服务。
# 🥩 目录结构
本项目实现代码的目录结构
如下:
memory-api-backend
|—— sql
|—— doc
|—— memory-backend-application (丰富的接口实现)
|—— src
|—— main
|—— java
├── com.memory.client
├── controller
├── mapper
├── model
├── service
├── ClientAppication
|—— resources
|—— mapper
|—— application.yml (配置文件)
|—— application-dev.yml
|—— application-prod.yml
|—— banner.txt
└── pom.xml
|—— memory-backend-common (抽取公共服务)
|—— src
|—— main
|—— java
├── com.memory.common
├── common
├── constant
├── exception
├── model
├── service.dubboService
├── utils
|—— resources
|—— application.yml (配置文件)
└── pom.xml
|—— memory-backend-core-service (核心功能)
|—— src
|—— main
|—— java
├── com.memory.api
├── annotation (自定义注解)
├── aop
├── config
├── controller
├── dataSource
├── mapper
├── service
├── CoreAppication
|—— resources
|—— mapper
|—— application.yml (配置文件)
|—— application-dev.yml
|—— application-prod.yml
|—— banner.txt
└── pom.xml
|—— memory-backend-gateway (网关)
|—— src
|—— main
|—— java
├── com.memory.gateway
├── config
├── filter
├── GatewayAppication
|—— resources
|—— application.yml (配置文件)
|—— application-dev.yml
|—— application-prod.yml
└── pom.xml
|—— memory-backend-server-client (远程调用服务)
|—— src
|—— main
|—— java
├── com.memory.client.feignClient
├── InterfaceInfoFeignClient
├── UserFeignClient
├── UserInterfaceInfoFeignCient
|—— resources
|—— application.yml (配置文件)
|—— application-dev.yml
|—— application-prod.yml
└── pom.xml
|—— Dockerfile
|—— pom.xml
|—— READEME.en.md
└── READEME.md
# ☕ 服务配置
memory-backend-api 父工程,公共依赖:
<groupId>com.memory.api</groupId>
<artifactId>memory-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!-- 注意这里的packaging标签 -->
<name>memory-api</name>
<description>memory-api</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<maven-compiler-plugin>3.8.1</maven-compiler-plugin>
</properties>
<modules>
<module>memory-backend-core-service</module>
<module>memory-backend-common</module>
<module>memory-backend-application</module>
<module>memory-backend-gateway</module>
<module>memory-backend-server-client</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.4</version>
</dependency>
..................................................
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
memory-backend-application 子服务:自定义丰富的接口实现。
<parent>
<groupId>com.memory.api</groupId>
<artifactId>memory-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.memory.application</groupId>
<artifactId>memory-backend-application</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.memory.common</groupId>
<artifactId>memory-backend-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.memory</groupId>
<artifactId>memory-client-spring-boot-starter</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version> <!-- 使用时检查是否有更新的版本 -->
</dependency>
<!-- https://doc.xiaominfo.com/knife4j/documentation/get_start.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
memory-backend-common 子服务:抽象公共服务,全局的实体映射类、通用返回类、自定义错误码等。
<parent>
<groupId>com.memory.api</groupId>
<artifactId>memory-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.memory.common</groupId>
<artifactId>memory-backend-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 添加 openfeign 框架依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
memory-backend-gateway 子服务:实现网关,实现请求转发、统一鉴权、统一业务处理、负载均衡和访问控制等。
<parent>
<groupId>com.memory.api</groupId>
<artifactId>memory-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.memory.gateway</groupId>
<artifactId>memory-backend-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.memory.common</groupId>
<artifactId>memory-backend-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.memory.client</groupId>
<artifactId>memory-backend-server-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
...............................................
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
memory-bacnkend-core-service 子服务:实现在线用户管理、接口发布与下线、接口调用管理。
<parent>
<groupId>com.memory.api</groupId>
<artifactId>memory-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<name>memory-core</name>
<description>memory-core</description>
<groupId>com.memory</groupId>
<artifactId>memory-backend-core-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.memory.common</groupId>
<artifactId>memory-backend-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.memory.client</groupId>
<artifactId>memory-backend-server-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.memory</groupId>
<artifactId>memory-client-spring-boot-starter</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.1.8</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spi</artifactId>
<version>2.10.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-web</artifactId>
<version>2.10.5</version>
<scope>compile</scope>
</dependency>
<!-- 添加 openfeign 框架依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- https://doc.xiaominfo.com/knife4j/documentation/get_start.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
<!-- OSS依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
memory-backend-server-client 子服务:远程调用服务,实现内部服务间远程调用。
<parent>
<groupId>com.memory.api</groupId>
<artifactId>memory-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.memory.client</groupId>
<artifactId>memory-backend-server-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.memory.common</groupId>
<artifactId>memory-backend-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 添加 openfeign 框架依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>