DDD专题案例三《领域驱动设计架构基于SpringCloud搭建微服务》

简介: 微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过Domain的功能域设计,可以把核心功能与支撑功能很好的区分开。而在MVC的设计模式常常是把所有的;数据服务、定义的属性类、提供的功能都在一条线上,这样是非常快速的开发方式但在做微服务部署时候却很麻烦。

前言介绍

微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过Domain的功能域设计,可以把核心功能与支撑功能很好的区分开。而在MVC的设计模式常常是把所有的;数据服务、定义的属性类、提供的功能都在一条线上,这样是非常快速的开发方式但在做微服务部署时候很麻烦。

按照不同的业务场景可能设计出软件在数据库使用上会有单库单表或者分库分表,如果是一个体量足够需要分库分表设计的系统,在扩容时候它是否能满足你的需求包括;
1、核心计算不涉及库扩容,但是系统功能都在一起怎么办,已扩容都扩容了很浪费
2、所有的扩容都涉及到数据库连接数增加,但并不是每个行为都直达到所有库表
3、持续发展的业务会带来数据激增,将来怎么进行扩展,重新
数据并不是很好的选择

那么实际开发大泥球架构时,不只是会遇到上面的问题,还可能会遇到工期很赶加个人也不提升效率,反复交接代码'扶'不过三代等等,因此我们将服务拆分为独立单体具备此核心域完整功能的系统是非常必要的。

如图,是微服务数据库使用的一种思想,我们希望路由层从最开始就被执行,用户分群动态扩展

6.jpg

案例目标

本案例通过使用SpringCloud将我们的服务架构扩展为通过路由调用的微服务

1、首先通过Eureka作为服务注册与发现中心

2、然后使用Feign模式作为调用API接口

3、最后依赖于zuul设置路由转发功能

为了方便测试,本案例会在itstack-demo-ddd-03中建4个工程;

itstack-demo-ddd-case{基于DDD的微服务}

itstack-demo-ddd-eureka-server{服务注册与发现}

itstack-demo-ddd-feign{调用方,通过API接口调用}

itstack-demo-ddd-zuul{网关路由组件}

开发环境

1、jdk1.8

2、springboot 2.0.6.RELEASE 以及SpringCloud相关服务

3、idea + maven

代码示例

itstack-demo-ddd-case | 基于DDD的微服务 {本段代码在上一章节已经演示}

1itstack-demo-ddd-case
 2└── src
 3    ├── main
 4    │   ├── java
 5    │   │   └── org.itstack.demo
 6    │   │       ├── application
 7    │   │       │    ├── MallRuleService.java    
 8    │   │       │    └── MallTreeService.java    
 9    │   │       ├── domain
10    │   │       │    ├── rule
11    │   │       │    │   ├── model
12    │   │       │    │   │   ├── aggregates
13    │   │       │    │   │   │   └── UserRichInfo.java   
14    │   │       │    │   │   └── vo
15    │   │       │    │   │       ├── DecisionMatter.java
16    │   │       │    │   │       ├── EngineResult.java
17    │   │       │    │   │       ├── TreeNodeInfo.java
18    │   │       │    │   │       ├── TreeNodeLineInfo.java   
19    │   │       │    │   │       └── UserSchool.java 
20    │   │       │    │   ├── repository
21    │   │       │    │   │   └── IRuleRepository.java    
22    │   │       │    │   └── service
23    │   │       │    │       ├── engine
24    │   │       │    │       │   ├── impl    
25    │   │       │    │       │   └── EngineFilter.java   
26    │   │       │    │       ├── logic
27    │   │       │    │       │   ├── impl    
28    │   │       │    │       │   └── LogicFilter.java    
29    │   │       │    │       └── MallRuleServiceImpl.java    
30    │   │       │    └── tree
31    │   │       │        ├── model
32    │   │       │        │   ├── aggregates
33    │   │       │        │   │   └── TreeCollect.java    
34    │   │       │        │   └── vo
35    │   │       │        │       ├── TreeInfo.java   
36    │   │       │        │       └── TreeRulePoint.java  
37    │   │       │        ├── repository
38    │   │       │        │   └── ITreeRepository.java    
39    │   │       │        └── service
40    │   │       │            └── MallTreeServiceImpl.java    
41    │   │       ├── infrastructure
42    │   │       │    ├── common
43    │   │       │    │   └── Constants.java
44    │   │       │    ├── dao
45    │   │       │    │   ├── RuleTreeDao.java
46    │   │       │    │   ├── RuleTreeNodeDao.java    
47    │   │       │    │   └── RuleTreeNodeLineDao.java    
48    │   │       │    ├── po
49    │   │       │    │   ├── RuleTree.java
50    │   │       │    │   ├── RuleTreeConfig.java
51    │   │       │    │   ├── RuleTreeNode.java   
52    │   │       │    │   └── RuleTreeNodeLine.java       
53    │   │       │    ├── repository
54    │   │       │    │   ├── cache
55    │   │       │    │   │   └── RuleCacheRepository.java
56    │   │       │    │   ├── mysql
57    │   │       │    │   │   ├── RuleMysqlRepository.java    
58    │   │       │    │   │   └── TreeMysqlRepository.java
59    │   │       │    │   ├── RuleRepository.java 
60    │   │       │    │   └── TreeRepository.java 
61    │   │       │    └── util
62    │   │       │        └── CacheUtil.java
63    │   │       ├── interfaces
64    │   │       │    ├── dto
65    │   │       │    │   ├── DecisionMatterDTO.java
66    │   │       │    │   └── TreeDTO.java    
67    │   │       │    └── DDDController.java
68    │   │       └── DDDApplication.java
69    │   └── resources    
70    │       ├── mybatis
71    │       └── application.yml
72    └── test
73         └── java
74             └── org.itstack.demo.test
75                 └── ApiTest.java

itstack-demo-ddd-eureka-server | 服务注册与发现

1itstack-demo-ddd-eureka-server
 2└── src
 3    ├── main
 4    │   ├── java
 5    │   │   └── org.itstack.demo
 6    │   │       └── EurekaServerApplication.java
 7    │   └── resources    
 8    │       └── application.yml
 9    └── test
10         └── java
11             └── org.itstack.demo.test
12                 └── ApiTest.java

EurekaServerApplication.java | 启动服务

1/**
 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
 3 * 论坛:http://bugstack.cn
 4 * Create by 付政委 on @2019
 5 */
 6@SpringBootApplication
 7@EnableEurekaServer
 8public class EurekaServerApplication {
 9
10    public static void main(String[] args) {
11        SpringApplication.run( EurekaServerApplication.class, args );
12    }
13
14}

application.yml | 服务配置

1server:
 2  port: 8989
 3
 4eureka:
 5  instance:
 6    hostname: localhost
 7  client:
 8    registerWithEureka: false
 9    fetchRegistry: false
10    serviceUrl:
11      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
12
13spring:
14  application:
15    name: itstack-demo-ddd-eureka-server

itstack-demo-ddd-feign | 调用方,通过API接口调用

1itstack-demo-ddd-feign
 2└── src
 3    ├── main
 4    │   ├── java
 5    │   │   └── org.itstack.demo
 6    │   │       ├── domain
 7    │   │       │    └── TreeDTO.java
 8    │   │       ├── service
 9    │   │       │    └── MallService.java
10    │   │       ├── web
11    │   │       │    └── FeignController.java
12    │   │       └── FeignApplication.java
13    │   └── resources    
14    │       └── application.yml
15    └── test
16         └── java
17             └── org.itstack.demo.test
18                 └── ApiTest.java

MallService.java | 通过注册方式调用API

1/**
 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
 3 * 论坛:http://bugstack.cn
 4 * Create by 付政委 on @2019
 5 */
 6@FeignClient(value = "itstack-demo-ddd-case")
 7public interface MallService {
 8
 9    @RequestMapping(value = "/api/tree/queryTreeSummaryInfo", method = RequestMethod.POST)
10    Object queryTreeSummaryInfo(@RequestBody TreeDTO request);
11
12}

FeignApplication.java | 启动服务

1/**
 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
 3 * 论坛:http://bugstack.cn
 4 * Create by 付政委 on @2019
 5 */
 6@SpringBootApplication
 7@EnableEurekaClient
 8@EnableDiscoveryClient
 9@EnableFeignClients
10public class FeignApplication {
11
12    public static void main(String[] args) {
13        SpringApplication.run(FeignApplication.class, args);
14    }
15
16}

application.yml | 服务配置

1server:
 2  port: 9090
 3
 4spring:
 5  application:
 6    name: itstack-demo-ddd-feign
 7
 8eureka:
 9  client:
10    serviceUrl:
11      defaultZone: http://localhost:8989/eureka/

itstack-demo-ddd-zuul| 网关路由组件

1itstack-demo-ddd-zuul
 2└── src
 3    ├── main
 4    │   ├── java
 5    │   │   └── org.itstack.demo
 6    │   │       └── ZuulApplication.java
 7    │   └── resources    
 8    │       └── application.yml
 9    └── test
10         └── java
11             └── org.itstack.demo.test
12                 └── ApiTest.java

ZuulApplication.java | 启动服务

1/**
 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
 3 * 论坛:http://bugstack.cn
 4 * Create by 付政委 on @2019
 5 */
 6@SpringBootApplication
 7@EnableZuulProxy
 8@EnableEurekaClient
 9@EnableDiscoveryClient
10public class ZuulApplication {
11
12    public static void main(String[] args) {
13        SpringApplication.run(ZuulApplication.class, args);
14    }
15
16}

application.yml | 服务配置{本案例是静态路由,按需可以开发为动态路由}

1server:
 2  port: 9191
 3
 4spring:
 5  application:
 6    name: itstack-demo-ddd-zuul
 7
 8eureka:
 9  client:
10    serviceUrl:
11      defaultZone: http://localhost:8989/eureka/
12zuul:
13  routes:
14    api-a:
15      path: /route-a/**
16      serviceId: itstack-demo-ddd-feign
17

测试验证

按照顺序启动;itstack-demo-ddd-eureka-server、itstack-demo-ddd-case{可以模拟启动多个}、itstack-demo-ddd-feign、itstack-demo-ddd-zuul

7.jpg

8.jpg

综上总结

1、DDD的设计模式加上SpringBoot与SpringCloud非常适合开发微服务

2、以上案例可以进行扩展,使不同的用户群体在网关接口调用时就打到不同的服务上

3、另外目前没有使用dubbo类型的rpc框架,也就是没有对外提供定义接口jar包,后续会进行延展

目录
相关文章
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
617 102
|
人工智能 前端开发 Java
DDD四层架构和MVC三层架构的个人理解和学习笔记
领域驱动设计(DDD)是一种以业务为核心的设计方法,与传统MVC架构不同,DDD将业务逻辑拆分为应用层和领域层,更关注业务领域而非数据库设计。其四层架构包括:Interface(接口层)、Application(应用层)、Domain(领域层)和Infrastructure(基础层)。各层职责分明,避免跨层调用,确保业务逻辑清晰。代码实现中,通过DTO、Entity、DO等对象的转换,结合ProtoBuf协议,完成请求与响应的处理流程。为提高复用性,实际项目中可增加Common层存放公共依赖。DDD强调从业务出发设计软件,适应复杂业务场景,是微服务架构的重要设计思想。
|
前端开发 测试技术 数据库
DDD架构中assembler和converter的区别
在 DDD 四层架构模式中,assembler 和 converter 常用于对象转换,但两者在实际项目中的使用较为随意。本文从英文释义、语义区分和模型层区分三个方面探讨了两者的区别,建议按模型层区分,即 Interface 和 Application 层使用 assembler,Infrastructure 层使用 converter,以避免混淆和随意使用。此外,将转换代码抽离为独立方法有助于保持代码整洁和可测试性。
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
799 4
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
2086 10
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
605 1
|
7天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1922 6
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
5天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
652 111