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

前言介绍

微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务。领域驱动设计的思想通过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的微服务 {本段代码在上一章节已经演示}

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 | 服务注册与发现

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 | 启动服务

/**
 * 微信公众号: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 | 服务配置

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 | 调用方,通过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

/**
 * 微信公众号: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| 网关路由组件

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/ | 服务中心
微信公众号:bugstack虫洞栈 | 服务中心

访问:http://localhost:9191/route-a/api/queryTreeSummaryInfo?treeId=10001 | 通过网关路由调用DDD服务接口

微信公众号:bugstack虫洞栈 | 调用网关接口测试

综上总结

1、DDD的设计模式加上SpringBoot与SpringCloud非常适合开发微服务
2、以上案例可以进行扩展,使不同的用户群体在网关接口调用时就打到不同的服务上
3、另外目前没有使用dubbo类型的rpc框架,也就是没有对外提供定义接口jar包,后续会进行延展


微信公众号:bugstack虫洞栈,欢迎关注&获取源码

小傅哥 CSDN认证博客专家 ASM 设计模式 面经手册
一线互联网软件开发工程师,擅长编写优秀的代码、中间件开发、架构设计等。| 公众号:bugstack虫洞栈,回复:设计模式、面经手册、字节码编程,可以下载我的PDF!
<div style="color:#313131;font-size:16px;"> 课程介绍 </div> <p> <br /> </p> <p> <span><span style="font-size:16px;">你是否在寻找机会进入</span><span style="color:#E67E22;font-size:16px;">自动化测试领域</span><span style="font-size:16px;">?</span></span> </p> <p> <span><span style="font-size:16px;">你是否渴望学习selenium webdriver + Java以及</span><span style="color:#E67E22;font-size:16px;">最新的框架和技术</span><span style="font-size:16px;">进行web自动化测试?</span></span> </p> <p> <span><span style="font-size:16px;">你是否感兴趣</span><span style="color:#E67E22;font-size:16px;">学习Selenium</span><span style="font-size:16px;">如何用在你现有的项目里的?</span></span> </p> <p> <span style="font-size:16px;">这门课带你从Selenium搭建环境开始讲起,然后学习selenium,TestNG, logback, maven, jenkins。</span> </p> <p> <span><span><span style="font-size:16px;">我们假设学员没有任何自动化经验,来设计的这套课程。每个课题都</span><span style="color:#E67E22;font-size:16px;">从最基础的开始</span><span style="font-size:16px;">讲起。</span><span style="color:#E67E22;font-size:16px;">Selenium相关的该覆盖的课题都覆盖了。</span></span></span> </p> <p> <span><span style="font-size:16px;">例子都是来自于</span><span style="color:#E67E22;font-size:16px;">真实的web应用项目</span><span style="font-size:16px;">,帮助你理解不同的组件怎么用上自动化,这将展示给你一个行业层面的框架,增加自信心。</span></span> </p> <p> <span><span style="color:#E67E22;font-size:16px;">全网没有其他课程像这门课涵盖到如此之深的细节</span><span style="font-size:16px;">。</span></span> </p> <p> <span><span style="font-size:20px;"><span>您将会学到什么</span></span></span> </p> <ul> <li> <span style="font-size:16px;">学完课程以后,你将拥有完整的Selenium Webdriver知识</span> </li> <li> <span style="font-size:16px;">你将具备从头开始设计Page Object、Page Factory、DATADRIVEN等搭建自动化框架的能力</span> </li> <li> <span><span style="font-size:16px;">用100多个实例对Selenium现实</span><span style="font-size:16px;">场景应用进行深入理解</span></span> </li> <li> <span style="font-size:16px;">全面了解TestNG, Maven, Jenkins, HTML报告,多浏览器并行测试</span> </li> <li> <span style="font-size:16px;">了解数据库测试和使用Selenium进行性能测试</span> </li> <li> <span style="font-size:16px;">你将彻底了解testNG框架</span> </li> <li> <span style="font-size:16px;">你从网上随便选择一个网站,都可以实现自动化,用所有可能的测试用例进行自动化测试</span> </li> <li> <span style="font-size:16px;">将提高你的编码技能,以编写最优化的自动化测试用例代码</span> </li> <li> <span style="font-size:16px;">你基本可以搞定任何Selenium面试,并能从设计阶段开始领导整个Selenium自动化项目</span> </li> <li> <span style="font-size:16px;">你应该能够使用应用程序的GUI来验证数据完整性</span> </li> <li> <span style="font-size:16px;">你将能够创建漂亮的报告来打动客户或领导</span> </li> <li> <span style="font-size:16px;">更深入地理解自动化指南和代码质量标准</span> </li> <li> <span style="font-size:16px;">会附带一个练习网站,可以用上所有可用的WebDriver功能,实现自动化</span> </li> </ul> <p> <span style="font-size:20px;"><span style="color:#3498DB;"><span>【适合人群】</span></span></span> </p> <ul> <li> <span style="font-size:16px;">软件手动测试人员想转为自动化测试的人员</span> </li> <li> <span style="font-size:16px;">自动化软件测试人员想加强专业技能的</span> </li> <li> <span style="font-size:16px;">刚毕业学生想从事软件行业</span> </li> <li> <span style="font-size:16px;">QA 组长或项目经理</span> </li> </ul> <p> <span style="color:#3498DB;"><span style="font-size:20px;"><span>【课程优势】</span></span></span> </p> <p> <span style="font-size:16px;">学完课程以后,你将拥有完整的Selenium Webdriver知识</span> </p> <p> <span style="color:#3498DB;"><span style="font-size:20px;"><span>【讲师介绍】</span></span></span> </p> <p> <span style="font-size:16px;"><span style="color:#E67E22;"><span>资质介绍:</span></span></span> </p> <p> <span style="font-size:16px;">12年以上软件测试工作经验,其中7年以上自动化测试开发经验</span> </p> <p> <span style="font-size:16px;">新书“Python3+Selenium3自动化测试项目实战”作者</span> </p> <p> <span><br /> </span> </p> <p> <img src="https://img-bss.csdn.net/201912160910055665.jpg" alt="" /><img src="https://img-bss.csdn.net/201912160910249590.jpg" alt="" /><img src="https://img-bss.csdn.net/201912160910311596.jpg" alt="" /> </p> <br /> <br />
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值