欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

Nginx可以作为高性能的 昆山软件开发 应用服务器(e.g. openResty)

点击: 次  来源:宝鼎软件 时间:2017-09-29

原文出处: 徐靖峰

本日来简朴地聊聊事件驱动,其实写这篇文章挺令我挺苦恼的,因为事件驱动这个名词,我没有找到很好的定性表明,担忧本身的表述有误,而说到事件驱动大概立即遐想到如此浩瀚的观念:调查者模式,劳务派遣管理系统,宣布订阅模式,动静行列MQ,动静驱动,事件,EventSourcing…为了不发生歧义,笔者把本身所相识的这些迷糊其词的观念都列了出来,再开始本日的分享。

  • 在设计模式中,调查者模式可以算得上是一个很是经典的行为型设计模式,猫叫了,主人醒了,老鼠跑了,这一经典的例子,是事件驱动模子在设计层面的浮现。
  • 另一模式,宣布订阅模式往往被人们等同于调查者模式,但我的领略是两者独一区别,是宣布订阅模式需要有一个调治中心,而调查者模式不需要,譬喻调查者的列表可以直接由被调查者维护。不外两者纵然被混用,相互替代,凡是不影响表达。
  • MQ,中间件级此外动静行列(e.g. ActiveMQ,RabbitMQ),可以认为是宣布订阅模式的一个详细浮现。事件驱动->宣布订阅->MQ,从抽象到详细。
  • java和spring中都拥有Event的抽象,别离代表了语言级别和三方框架级别对事件的支持。
  • EventSourcing这个观念就要关联到规模驱动设计,DDD对事件驱动也长短常地青睐,规模工具的状态完全是由事件驱动来节制,由其衍生出了CQRS架构,详细实现框架有AxonFramework。
  • Nginx可以作为高机能的应用处事器(e.g. openResty),以及Nodejs事件驱动的特性,这些也是都是事件驱动的浮现。
  • 本文涵盖的内容主要是前面4点。

    Spring对Event的支持

    Spring的文档对Event的支持翻译之后描写如下:

    ApplicationContext通过ApplicationEvent类和ApplicationListener接口举办事件处理惩罚。 假如将实现ApplicationListener接口的bean注入到上下文中,则每次利用ApplicationContext宣布ApplicationEvent时,城市通知该bean。 本质上,这是尺度的调查者设计模式。

    而在spring4.2之后,提供了注解式的支持,我们可以利用任意的java工具共同注解到达同样的结果,首先来看看不合用注解如安在Spring中利用事件驱念头制。

    界说业务需求:用户注册后,系统需要给用户发送邮件奉告用户注册乐成,需要给用户初始化积分;隐含的设计需求,用户注册后,后续需求大概会添加其他操纵,如再发送一条短信等等,但愿措施具有扩展性,以及切合开闭原则。

    假如不利用事件驱动,代码大概会像这样子:

    public class UserService {
      
        @Autowired
        EmailService emailService;
        @Autowired
        ScoreService scoreService;
        @Autowired
        OtherService otherService;
        public void register(String name) {
            System.out.println("用户:" + name + " 已注册!");
            emailService.sendEmail(name);
            scoreService.initScore(name);
            otherService.execute(name);
        }
      
    }

    要说有什么短处,其实也不算有,因为大概大大都人在开拓中城市这么写,喜欢写同步代码。但这么写,实际上并不是出格的切合隐含的设计需求,假设增加更多的注册项service,我们需要修改register的要领,而且让UserService注入对应的Service。而实际上,register并不体贴这些“特别”的操纵,如何将这些多余的代码抽取出去呢?便可以利用Spring提供的Event机制。

    界说用户注册事件

    public class UserRegisterEvent extends ApplicationEvent{
        public UserRegisterEvent(String name) { //name即source
            super(name);
        }
    }

    ApplicationEvent是由Spring提供的所有Event类的基类,为了简朴起见,注册事件只通报了name(可以巨大的工具,但留意要相识清楚序列化机制)。

    界说用户注册处事(事件宣布者)

    @Service // <1>
    public class UserService implements ApplicationEventPublisherAware { // <2>
        public void register(String name) {
            System.out.println("用户:" + name + " 已注册!");
            applicationEventPublisher.publishEvent(new UserRegisterEvent(name));// <3>
        }
        private ApplicationEventPublisher applicationEventPublisher; // <2>
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { // <2>
            this.applicationEventPublisher = applicationEventPublisher;
        }
    }

    <1> 处事必需交给Spring容器托管
    <2> ApplicationEventPublisherAware是由Spring提供的用于为Service注入ApplicationEventPublisher事件宣布器的接口,利用这个接口,我们本身的Service就拥有了宣布事件的本领。
    <3> 用户注册后,不再是显示挪用其他的业务Service,软件开发,而是宣布一个用户注册事件。