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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过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包,后续会进行延展

目录
相关文章
|
28天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
51 2
|
2月前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
54 0
|
15天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
55 4
|
12天前
|
前端开发 测试技术 数据库
DDD架构中assembler和converter的区别
在 DDD 四层架构模式中,assembler 和 converter 常用于对象转换,但两者在实际项目中的使用较为随意。本文从英文释义、语义区分和模型层区分三个方面探讨了两者的区别,建议按模型层区分,即 Interface 和 Application 层使用 assembler,Infrastructure 层使用 converter,以避免混淆和随意使用。此外,将转换代码抽离为独立方法有助于保持代码整洁和可测试性。
47 1
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
27天前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
73 1
|
1月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
1月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
43 1
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
102 5