作者:小傅哥
来自:博客园小傅哥
一、前言介绍
======
微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过Domain的功能域设计,可以把核心功能与支撑功能很好的区分开。而在MVC的设计模式尝尝是把所有的;数据服务、定义的属性类、提供的功能都在一条线上,这样是非常快速的开发方式但在作为服务部署时候却很麻烦。
按照不同的业务场景可能设计出软件在数据库使用上会有单库单表或者分库分表,如果是一个体量足够需要分库分表设计的系统,在扩容时候它是否能满足你的需求包括;
核心计算不涉及库扩容,但是系统功能都在一起怎么办,已扩容都扩容了很浪费
所有的扩容都涉及到数据库连接数增加,但并不是每个行为都直达到所有库表
持续发展的业务会带来数据激增,将来怎么进行扩展,重新洗数据并不是很好的选择
那么实际开发大泥球架构时,不只是会遇到上面的问题,还可能会遇到工期很赶加个人也不提升效率,反复交接代码扶不过三代等等,因此我们将服务拆分为独立单体具备此核心域完整功能的系统是非常必要的。
如图,是微服务数据库使用的一种思想,我们希望路由层从最开始就被执行,用户分群动态扩展
二、案例目标
======
本案例通过使用SpringCloud将我们的服务架构扩展为通过路由调用的微服务
首先通过Eureka作为服务注册与发现中心
然后使用Feign模式作为调用API接口
最后依赖于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{网关路由组件}
三、开发环境
======
jdk1.8
springboot 2.0.6.RELEASE 以及SpringCloud相关服务
idea + maven
四、代码示例
======
1. itstack-demo-ddd-case | 基于DDD的微服务 {本段代码在上一章节已经演示}
=====================================================
itstack-demo-ddd-case
└── src
├── main
│ ├── java
│ │ └── org.itstack.demo
│ │ ├── application
│ │ │ ├── MallRuleService.java
│ │ │ └── MallTreeService.java
│ │ ├── domain
│ │ │ ├── rule
│ │ │ │ ├── model
│ │ │ │ │ ├── aggregates
│ │ │ │ │ │ └── UserRichInfo.java
│ │ │ │ │ └── vo
│ │ │ │ │ ├── DecisionMatter.java
│ │ │ │ │ ├── EngineResult.java
│ │ │ │ │ ├── TreeNodeInfo.java
│ │ │ │ │ ├── TreeNodeLineInfo.java
│ │ │ │ │ └── UserSchool.java
│ │ │ │ ├── repository
│ │ │ │ │ └── IRuleRepository.java
│ │ │ │ └── service
│ │ │ │ ├── engine
│ │ │ │ │ ├── impl
│ │ │ │ │ └── EngineFilter.java
│ │ │ │ ├── logic
│ │ │ │ │ ├── impl
│ │ │ │ │ └── LogicFilter.java
│ │ │ │ └── MallRuleServiceImpl.java
│ │ │ └── tree
│ │ │ ├── model
│ │ │ │ ├── aggregates
│ │ │ │ │ └── TreeCollect.java
│ │ │ │ └── vo
│ │ │ │ ├── TreeInfo.java
│ │ │ │ └── TreeRulePoint.java
│ │ │ ├── repository
│ │ │ │ └── ITreeRepository.java
│ │ │ └── service
│ │ │ └── MallTreeServiceImpl.java
│ │ ├── infrastructure
│ │ │ ├── common
│ │ │ │ └── Constants.java
│ │ │ ├── dao
│ │ │ │ ├── RuleTreeDao.java
│ │ │ │ ├── RuleTreeNodeDao.java
│ │ │ │ └── RuleTreeNodeLineDao.java
│ │ │ ├── po
│ │ │ │ ├── RuleTree.java
│ │ │ │ ├── RuleTreeConfig.java
│ │ │ │ ├── RuleTreeNode.java
│ │ │ │ └── RuleTreeNodeLine.java
│ │ │ ├── reposi
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 开源分享
tory
│ │ │ │ ├── cache
│ │ │ │ │ └── RuleCacheRepository.java
│ │ │ │ ├── mysql
│ │ │ │ │ ├── RuleMysqlRepository.java
│ │ │ │ │ └── TreeMysqlRepository.java
│ │ │ │ ├── RuleRepository.java
│ │ │ │ └── TreeRepository.java
│ │ │ └── util
│ │ │ └── CacheUtil.java
│ │ ├── interfaces
│ │ │ ├── dto
│ │ │ │ ├── DecisionMatterDTO.java
│ │ │ │ └── TreeDTO.java
│ │ │ └── DDDController.java
│ │ └── DDDApplication.java
│ └── resources
│ ├── mybatis
│ └── application.yml
└── test
└── java
└── org.itstack.demo.test
└── ApiTest.java
2. itstack-demo-ddd-eureka-server | 服务注册与发现
============================================
itstack-demo-ddd-eureka-server
└── src
├── main
│ ├── java
│ │ └── org.itstack.demo
│ │ └── EurekaServerApplication.java
│ └── resources
│ └── application.yml
└── test
└── java
└── org.itstack.demo.test
└── ApiTest.java
EurekaServerApplication.java | 启动服务
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run( EurekaServerApplication.class, args );
}
}
application.yml | 服务配置
server:
port: 8989
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http:// e u r e k a . i n s t a n c e . h o s t n a m e : {eureka.instance.hostname}: eureka.instance.hostname:{server.port}/eureka/
spring:
application:
name: itstack-demo-ddd-eureka-server
3. itstack-demo-ddd-feign | 调用方,通过API接口调用
==========================================
itstack-demo-ddd-feign
└── src
├── main
│ ├── java
│ │ └── org.itstack.demo
│ │ ├── domain
│ │ │ └── TreeDTO.java
│ │ ├── service
│ │ │ └── MallService.java
│ │ ├── web
│ │ │ └── FeignController.java
│ │ └── FeignApplication.java
│ └── resources
│ └── application.yml
└── test
└── java
└── org.itstack.demo.test
└── ApiTest.java
MallService.java | 通过注册方式调用API
@FeignClient(value = “itstack-demo-ddd-case”)
public interface MallService {
@RequestMapping(value = “/api/tree/queryTreeSummaryInfo”, method = RequestMethod.POST)
Object queryTreeSummaryInfo(@RequestBody TreeDTO request);
}
FeignApplication.java | 启动服务
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients