前言介绍
微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过Domain的功能域设计,可以把核心功能与支撑功能很好的区分开。而在MVC的设计模式常常是把所有的;数据服务、定义的属性类、提供的功能都在一条线上,这样是非常快速的开发方式但在做微服务部署时候却很麻烦。
按照不同的业务场景可能设计出软件在数据库使用上会有单库单表或者分库分表,如果是一个体量足够需要分库分表设计的系统,在扩容时候它是否能满足你的需求包括;
1、核心计算不涉及库扩容,但是系统功能都在一起怎么办,已扩容都扩容了很浪费
2、所有的扩容都涉及到数据库连接数增加,但并不是每个行为都直达到所有库表
3、持续发展的业务会带来数据激增,将来怎么进行扩展,重新洗数据并不是很好的选择
那么实际开发大泥球架构时,不只是会遇到上面的问题,还可能会遇到工期很赶加个人也不提升效率,反复交接代码'扶'不过三代等等,因此我们将服务拆分为独立单体具备此核心域完整功能的系统是非常必要的。
如图,是微服务数据库使用的一种思想,我们希望路由层从最开始就被执行,用户分群动态扩展
案例目标
本案例通过使用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
综上总结
1、DDD的设计模式加上SpringBoot与SpringCloud非常适合开发微服务
2、以上案例可以进行扩展,使不同的用户群体在网关接口调用时就打到不同的服务上
3、另外目前没有使用dubbo类型的rpc框架,也就是没有对外提供定义接口jar包,后续会进行延展