DDD企业级记账软件实战二|从0-1创建用户微服务和记账微服务基于Spring Cloud
大家好,我是大头,职高毕业,现在大厂资深开发,前上市公司架构师,管理过10人团队!
我将持续分享成体系的知识以及我自身的转码经验、面试经验、架构技术分享、AI技术分享等!
愿景是带领更多人完成破局、打破信息差!我自身知道走到现在是如何艰难,因此让以后的人少走弯路!
无论你是统本CS专业出身、专科出身、还是我和一样职高毕业等。都可以跟着我学习,一起成长!一起涨工资挣钱!
DDD记账软件实战二
经过一开始的战略设计和战术设计以后,我们有了一个初步的服务划分
- 用户服务:管理用户相关的信息
- 记账服务:管理账本和收支相关的信息
并且,我们已经知道了我们要创建一个什么样的目录结构,每个服务的目录如下:
- starter: 接口层,包括HTTP接口、队列的消费者、DTO、启动类
- api: 接口层,提供RPC接口,包括外部RPC接口需要使用的DTO、枚举等
- application:应用服务层,放应用服务,负责编排领域服务、聚合根等。
- domain:领域服务层,放领域相关的一切信息,领域服务负责编排聚合根,聚合根负责完成自身的业务逻辑。
- infrastructure: 基础设施层,放配置、仓储、工厂、对外部的请求、发送MQ消息等。
- common: 放一些公共信息。
我们这个整体架构图如下:
除了我们一开始划分好的两个服务以外,还有一些支撑服务,属于不管干啥都需要用到的。
- 网关
首先,需要通过网关来进行流量转发、权限校验、负载均衡等。
- 网关使用
Spring Cloud GateWay
来实现,网关不需要采用DDD来设计。
- 缓存
缓存也是必不可少的一环,缓存使用Redis
来实现。
- 唯一ID生成
每个服务都需要使用到唯一ID,因此可以使用分布式唯一ID发号器。我们的案例里面使用的是SnowFlake
算法进行生成,这个方案有一个缺点就是强依赖系统时钟。对于我们来说已经够用了。
如果需要更加强大的方案可以使用美团开源的Leaf
来进行唯一ID生成,Leaf支持号段模式
和SnowFlake
模式,解决了SnowFlake强依赖系统时钟的问题。
- 日志收集
日志收集也是必不可少的一环,我们日常都需要将日志统一收集到一起,并提供查询功能。我们直接使用ELK来实现。
- 链路追踪
链路追踪也一样,毕竟多个微服务之间需要通过一个唯一请求ID
来实现链路追踪,查询出一次请求的微服务以及对应的信息。
- 我们本次使用
SkyWalking
来实现链路追踪的能力。
- 消息触达服务
不管做什么业务,其实都需要发送一些消息,包括短信消息、邮件消息、微信消息等等。
因此我们同样抽象出一个消息触达服务来执行消息发送功能。
创建用户服务
首先,我们要创建一个spring项目。可以直接使用start.spring.io来创建。
我们选择的是
- java
- maven
- 3.5.4版本
- java21
- Jar
接下来输入一些基础信息就可以了。
点击下面的generate就可以把项目代码下载下来了。
下载下来以后,我们需要调整maven文件和目录结构。
最外层的maven文件内容如下,我们主要引入了下面的一些依赖
- spring cloud
- nacos: 配置管理和服务注册发现
- mysql
- mybatis plus
- jwt
- lombok
<?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.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zt.bookkeeping.user</groupId><artifactId>user</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>user</name><description>记账软件用户服务</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>21</java.version><spring-cloud.version>2025.0.0</spring-cloud.version><spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version><project.version>0.0.1-SNAPSHOT</project.version></properties><modules><module>user-domain</module><module>user-application</module><module>user-infrastructure</module><module>user-starter</module><module>user-common</module></modules><dependencyManagement><dependencies><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><!-- 内部模块依赖管理 --><dependency><groupId>com.zt.bookkeeping.user</groupId><artifactId>user-domain</artifactId>