做者:小傅哥
博客:https://bugstack.cnhtml
沉淀、分享、成长,让本身和他人都能有所收获!java
微服务不是泥球小单体,而是具有更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想经过Domain的功能域设计,能够把核心功能与支撑功能很好的区分开。而在MVC的设计模式尝尝是把全部的;数据服务、定义的属性类、提供的功能都在一条线上,这样是很是快速的开发方式但在作微服务部署时候确很麻烦。mysql
按照不一样的业务场景可能设计出软件在数据库使用上会有单库单表或者分库分表,若是是一个体量足够须要分库分表设计的系统,在扩容时候它是否能知足你的需求包括;web
那么实际开发大泥球架构时,不仅是会遇到上面的问题,还可能会遇到工期很赶加我的也不提高效率,反复交接代码扶不过三代等等,所以咱们将服务拆分为独立单体具有此核心域完整功能的系统是很是必要的。spring
如图,是微服务数据库使用的一种思想,咱们但愿路由层从最开始就被执行,用户分群动态扩展
sql
本案例经过使用SpringCloud将咱们的服务架构扩展为经过路由调用的微服务数据库
为了方便测试,本案例会在itstack-demo-ddd-03中建4个工程;
itstack-demo-ddd-case{基于DDD的微服务}
itstack-demo-ddd-eureka-server{服务注册与发现}
itstack-demo-ddd-feign{调用方,经过API接口调用}
itstack-demo-ddd-zuul{网关路由组件}设计模式
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 │ │ │ ├── repository │ │ │ │ ├── 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
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 | 启动服务api
/** * 微信公众号:bugstack虫洞栈 | 专一原创技术专题案例 * 论坛:http://bugstack.cn * Create by 小傅哥 on @2019 */ @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run( EurekaServerApplication.class, args ); } }
application.yml | 服务配置springboot
server: port: 8989 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ spring: application: name: itstack-demo-ddd-eureka-server
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
/** * 微信公众号:bugstack虫洞栈 | 专一原创技术专题案例 * 论坛:http://bugstack.cn * Create by 小傅哥 on @2019 */ @FeignClient(value = "itstack-demo-ddd-case") public interface MallService { @RequestMapping(value = "/api/tree/queryTreeSummaryInfo", method = RequestMethod.POST) Object queryTreeSummaryInfo(@RequestBody TreeDTO request); }
FeignApplication.java | 启动服务
/** * 微信公众号:bugstack虫洞栈 | 专一原创技术专题案例 * 论坛:http://bugstack.cn * Create by 小傅哥 on @2019 */ @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient @EnableFeignClients public class FeignApplication { public static void main(String[] args) { SpringApplication.run(FeignApplication.class, args); } }
application.yml | 服务配置
server: port: 9090 spring: application: name: itstack-demo-ddd-feign eureka: client: serviceUrl: defaultZone: http://localhost:8989/eureka/
itstack-demo-ddd-zuul └── src ├── main │ ├── java │ │ └── org.itstack.demo │ │ └── ZuulApplication.java │ └── resources │ └── application.yml └── test └── java └── org.itstack.demo.test └── ApiTest.java
ZuulApplication.java | 启动服务
/** * 微信公众号:bugstack虫洞栈 | 专一原创技术专题案例 * 论坛:http://bugstack.cn * Create by 小傅哥 on @2019 */ @SpringBootApplication @EnableZuulProxy @EnableEurekaClient @EnableDiscoveryClient public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
application.yml | 服务配置{本案例是静态路由,按需能够开发为动态路由}
server: port: 9191 spring: application: name: itstack-demo-ddd-zuul eureka: client: serviceUrl: defaultZone: http://localhost:8989/eureka/ zuul: routes: api-a: path: /route-a/** serviceId: itstack-demo-ddd-feign
按照顺序启动;itstack-demo-ddd-eureka-server、itstack-demo-ddd-case{能够模拟启动多个}、itstack-demo-ddd-feign、itstack-demo-ddd-zuul
访问;http://localhost:8989/ | 服务中心
访问:http://localhost:9191/route-a/api/queryTreeSummaryInfo?treeId=10001 | 经过网关路由调用DDD服务接口