作者:付政委
成长总是来自于对未知领域的探索 | 库布齐50公里穿行
微信公众号:bugstack虫洞栈 | 关注获取源码
沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、DDD专题案例[Ing]等。
前言介绍
微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过Domain的功能域设计,可以把核心功能与支撑功能很好的区分开。而在MVC的设计模式常常是把所有的;数据服务、定义的属性类、提供的功能都在一条线上,这样是非常快速的开发方式但在做微服务部署时候却很麻烦。
按照不同的业务场景可能设计出软件在数据库使用上会有单库单表或者分库分表,如果是一个体量足够需要分库分表设计的系统,在扩容时候它是否能满足你的需求包括;
1、核心计算不涉及库扩容,但是系统功能都在一起怎么办,已扩容都扩容了很浪费
2、所有的扩容都涉及到数据库连接数增加,但并不是每个行为都直达到所有库表
3、持续发展的业务会带来数据激增,将来怎么进行扩展,重新洗数据并不是很好的选择
那么实际开发大泥球架构时,不只是会遇到上面的问题,还可能会遇到工期很赶加个人也不提升效率,反复交接代码'扶'不过三代等等,因此我们将服务拆分为独立单体具备此核心域完整功能的系统是非常必要的。
如图,是微服务数据库使用的一种思想,我们希望路由层从最开始就被执行,用户分群动态扩展
微信公众号:bugstack虫洞栈 | 微服务数据库路由
案例目标
本案例通过使用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 │ │ ├── domain10 │ │ │ ├── rule11 │ │ │ │ ├── model12 │ │ │ │ │ ├── aggregates13 │ │ │ │ │ │ └── UserRichInfo.java 14 │ │ │ │ │ └── vo15 │ │ │ │ │ ├── DecisionMatter.java16 │ │ │ │ │ ├── EngineResult.java17 │ │ │ │ │ ├── TreeNodeInfo.java18 │ │ │ │ │ ├── TreeNodeLineInfo.java 19 │ │ │ │ │ └── UserSchool.java 20 │ │ │ │ ├── repository21 │ │ │ │ │ └── IRuleRepository.java 22 │ │ │ │ └── service23 │ │ │ │ ├── engine24 │ │ │ │ │ ├── impl 25 │ │ │ │ │ └── EngineFilter.java 26 │ │ │ │ ├── logic27 │ │ │ │ │ ├── impl 28 │ │ │ │ │ └── LogicFilter.java 29 │ │ │ │ └── MallRuleServiceImpl.java 30 │ │ │ └── tree31 │ │ │ ├── model32 │ │ │ │ ├── aggregates33 │ │ │ │ │ └── TreeCollect.java 34 │ │ │ │ └── vo35 │ │ │ │ ├── TreeInfo.java 36 │ │ │ │ └── TreeRulePoint.java 37 │ │ │ ├── repository38 │ │ │ │ └── ITreeRepository.java 39 │ │ │ └── service40 │ │ │ └── MallTreeServiceImpl.java 41 │ │ ├── infrastructure42 │ │ │ ├── common43 │ │ │ │ └── Constants.java44 │ │ │ ├── dao45 │ │ │ │ ├── RuleTreeDao.java46 │ │ │ │ ├── RuleTreeNodeDao.java 47 │ │ │ │ └── RuleTreeNodeLineDao.java 48 │ │ │ ├── po49 │ │ │ │ ├── RuleTree.java50 │ │ │ │ ├── RuleTreeConfig.java51 │ │ │ │ ├── RuleTreeNode.java 52 │ │ │ │ └── RuleTreeNodeLine.java 53 │ │ │ ├── repository54 │ │ │ │ ├── cache55 │ │ │ │ │ └── RuleCacheRepository.java56 │ │ │ │ ├── mysql57 │ │ │ │ │ ├── RuleMysqlRepository.java 58 │ │ │ │ │ └── TreeMysqlRepository.java59 │ │ │ │ ├── RuleRepository.java 60 │ │ │ │ └── TreeRepository.java 61 │ │ │ └── util62 │ │ │ └── CacheUtil.java63 │ │ ├── interfaces64 │ │ │ ├── dto65 │ │ │ │ ├── DecisionMatterDTO.java66 │ │ │ │ └── TreeDTO.java 67 │ │ │ └── DDDController.java68 │ │ └── DDDApplication.java69 │ └── resources 70 │ ├── mybatis71 │ └── application.yml72 └── test73 └── java74 └── org.itstack.demo.test75 └── 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 └── test10 └── java11 └── org.itstack.demo.test12 └── ApiTest.java
EurekaServerApplication.java | 启动服务
1/** 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例 3 * 论坛:http://bugstack.cn 4 * Create by 付政委 on @2019 5 */ 6@SpringBootApplication 7@EnableEurekaServer 8public class EurekaServerApplication { 910 public static void main(String[] args) {11 SpringApplication.run( EurekaServerApplication.class, args );12 }1314}
application.yml | 服务配置
1server: 2 port: 8989 3 4eureka: 5 instance: 6 hostname: localhost 7 client: 8 registerWithEureka: false 9 fetchRegistry: false10 serviceUrl:11 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/1213spring: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.java10 │ │ ├── web11 │ │ │ └── FeignController.java12 │ │ └── FeignApplication.java13 │ └── resources 14 │ └── application.yml15 └── test16 └── java17 └── org.itstack.demo.test18 └── 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);1112}
FeignApplication.java | 启动服务
1/** 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例 3 * 论坛:http://bugstack.cn 4 * Create by 付政委 on @2019 5 */ 6@SpringBootApplication 7@EnableEurekaClient 8@EnableDiscoveryClient 9@EnableFeignClients10public class FeignApplication {1112 public static void main(String[] args) {13 SpringApplication.run(FeignApplication.class, args);14 }1516}
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 └── test10 └── java11 └── org.itstack.demo.test12 └── ApiTest.java
ZuulApplication.java | 启动服务
1/** 2 * 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例 3 * 论坛:http://bugstack.cn 4 * Create by 付政委 on @2019 5 */ 6@SpringBootApplication 7@EnableZuulProxy 8@EnableEurekaClient 9@EnableDiscoveryClient10public class ZuulApplication {1112 public static void main(String[] args) {13 SpringApplication.run(ZuulApplication.class, args);14 }1516}
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-feign17
测试验证
按照顺序启动;itstack-demo-ddd-eureka-server、itstack-demo-ddd-case{可以模拟启动多个}、itstack-demo-ddd-feign、itstack-demo-ddd-zuul
访问;http://localhost:8989/ | 服务中心
微信公众号:bugstack虫洞栈 | 服务中心
访问:http://localhost:9191/route-a/api/queryTreeSummaryInfo?treeId=10001 | 通过网关路由调用DDD服务接口
微信公众号:bugstack虫洞栈 | 调用网关接口测试
综上总结
1、DDD的设计模式加上SpringBoot与SpringCloud非常适合开发微服务
2、以上案例可以进行扩展,使不同的用户群体在网关接口调用时就打到不同的服务上
3、另外目前没有使用dubbo类型的rpc框架,也就是没有对外提供定义接口jar包,后续会进行延展
微信公众号:bugstack虫洞栈,欢迎关注&获取源码
本文分享自微信公众号 - bugstack虫洞栈(bugstack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。