欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于DDD的微服务架构设计

程序员文章站 2022-06-06 10:53:52
...

DDD领域驱动设计(DDD:Domain-Driven Design)

架构背景:

    现有的架构设计实在受不了,业务的反反复复地变化,导致代码圈复杂度之深让人恐惧。之前的微服务架构经验让我更加彻底点,采用DDD领域驱动设计进行整个改变。

    随着经过几个月的努力,确实慢慢地体会到ddd的架构设计的优势,聚合根设计能够协助我们整个服务改造,开发起来越来越迅速。


基于DDD的微服务架构设计
            
    
    博客分类: JavaGeekeropensource架构Performance DDDAXONNETTY 
 

CQRS访问方式:


基于DDD的微服务架构设计
            
    
    博客分类: JavaGeekeropensource架构Performance DDDAXONNETTY 
 
CQRS的架构体系,首先会被独立出来两个组件,一个事command的微服务负责addupdate等改变状态的动作,query的微服务顾名思义就是读动作


基于DDD的微服务架构设计
            
    
    博客分类: JavaGeekeropensource架构Performance DDDAXONNETTY 

  • 微服务采用spring-boot框架
  • 构建、运行采用docker容器
  • CQRS的axon、eventbus,存储采用elasticsearch
  • gateway采用自主研发的方式,支持注册、发现、路由方式

案例:

gateway在之前的blog已经写过,不在这里叙述

首先简单的rest controller

@RestController
public class NotifyController {

    @Autowired
    private CommandGateway commandGateway;


    @RequestMapping(value = "/notify", method = RequestMethod.GET)
    public void notify(HttpServletRequest request) {
        commandGateway.send(asCommandMessage(new CreateTaskCommand("1","chenyang","China")),
                new CommandCallback() {
                    @Override
                    public void onSuccess(Object result) {
                        //成功继续事情
                    }
                    @Override
                    public void onFailure(Throwable cause) {
                        //失败
                    }
                });
    }
}

 Command:

public class SuccessNotification  extends AbstractAnnotatedAggregateRoot<String>

    {
        /**
         * The constant serialVersionUID
         */
        private static final long serialVersionUID = -159779842362041665L;

        @AggregateIdentifier
        private String id;

        @CommandHandler
        public SuccessNotification(SuccessNotifyCommand command) {
        apply(new SuccessNotifyEvent(command.getId()));
    }

        SuccessNotification() {
    }


        @CommandHandler
        void  on(SuccessNotifyCommand command) {
        apply(new SuccessNotifyEvent(command.getId()));
    }


        @EventSourcingHandler
        public void on(SuccessNotifyEvent event) {
            this.id = event.getId();
        }
}

 Event:

	@EventHandler
	String on(SuccessNotifyEvent event) {
		return "world";
	}

 

最终结论:

   相对于烟囱式的方式,ddd对于开发者以及架构师要求更高,充当角色之一领域专家,需要对于聚合根理解透彻,才能更好地理解业务。

 

  • 基于DDD的微服务架构设计
            
    
    博客分类: JavaGeekeropensource架构Performance DDDAXONNETTY 
  • 大小: 206.1 KB
  • 基于DDD的微服务架构设计
            
    
    博客分类: JavaGeekeropensource架构Performance DDDAXONNETTY 
  • 大小: 125.9 KB
  • 基于DDD的微服务架构设计
            
    
    博客分类: JavaGeekeropensource架构Performance DDDAXONNETTY 
  • 大小: 215.9 KB
相关标签: DDD AXON NETTY