作者: cxdmz
来源:博客园cxdmz
一、前言介绍
微服务不是泥球的小单体,而是一种具有更清晰职责边界的完全一体化的业务功能服务。 域驱动设计的思想通过域的功能域设计,可以很好地区分核心功能和支持功能。 在MVC的设计模式中,尝试吃一切; 数据服务、定义的属性类和提供的功能都已联机,因此开发速度非常快,但作为服务部署时却很麻烦。根据不同的业务场景,软件在数据库的使用上可能被设计为具有单个库表或库表。 如果是卷足够且需要设计库表的系统,在扩展时是否能够满足需要,如下所示。
虽然计算与库的扩展无关,但是系统的功能都一起怎么办呢? 即使扩展也没用。所有的扩展都涉及数据库连接数的增加,但并不是所有动作都达到了所有库表的持续发展的业务都会带来数据的激增。 将来如何扩张,重新清洗数据不是个好选择。 实际上如果开发大的泥球体系结构,不仅会面临上述问题,即使工期紧迫,个人效率也不会提高,重复代码交接也不过三代等,我们都有可能面临
图示为微服务数据库使用的思想,希望路由层从一开始就执行,用户动态分组进行扩展
二、案例目标
在这种情况下,我们使用SpringCloud将服务体系结构扩展到由路由调用的微服务首先通过Eureka作为服务注册和发现中心,然后调用Feign模式作为API接口,最后依赖zuul设置路由传输功能。 为了便于测试,本案例会在itstack-demo-ddd-03上制作了4个项目; 基于it堆栈-演示- DDD -事例的微服务it堆栈-演示- DDD -欧盟服务器{服务注册与发现} it堆栈-演示- DDD-FD-FFD
三、开发环境
JDK 1.8 spring boot2.0.6.发行版和SpringCloud相关服务idea maven四、代码示例
1. itstack-demo-ddd-case | 基于DDD的微服务 {本段代码在上一章节已经演示}
it堆栈-演示- DDD -缓存( src
main
java
()org.it堆栈. demo
APP
mallruleservice.Java
malltreeservice.Java
域
规则
()模型
()aggregates
userrichinfo.Java
VO
%诊断资料. Java
()EngineResult.Java
()三重节点信息. Java
()三重线路信息. Java
userschool.Java
()资料档案库
irulerepository.Java
((() )服务
()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.java2. 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.javaEurekaServerApplication.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://${eureka.instance.hostname}:${server.port}/eureka/ spring: application: name: itstack-demo-ddd-eureka-server3. 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.javaMallService.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 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/4. 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.javaZuulApplication.java | 启动服务
@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服务接口