架构模式是软件架构中给定环境中经常遇到的问题的通用的、可重用的解决方案。与软件设计模式类似但覆盖面更广,它专门针对软件工程中的不同问题,例如计算机硬件性能约束、高可用性和业务风险最小化。一些架构模式是在软件框架中实现的。-维基百科显示架构模式有很多种,本文只讨论工作中用的比较多的:分层架构流水线架构事件驱动架构有MVC等,通过分层将职责划分到某一层,与层次清晰,结构清晰。我们以MVC为例:controller->service->dao@RestController@RequestMapping("/order")publicclassOrderController{@AutowiredprivateOrderServiceorderService;/***Addorder*@paramorder*@return*/@PostMapping("/add")publicResponseaddOrder(Orderorder){orderService.add(order);returnResponse.success();}}publicinterfaceOrderService{/***添加订单*@paramorder*@return*/booleanadd(Orderorder);}publicinterfaceOrderRepository{intsave(Orderorder);}根据依赖方向,上层依次依赖下层,每一层处理不同的逻辑。上一篇文章讨论了通过依赖倒置来改变依赖,从而减少耦合。流水线架构Pipelinearchitecturalmode流水线架构也称为流水线或流水线架构。处理流程是线性的,每个环节都有对应的组件处理,从前到后依次执行。概念说明:source:数据源,通常使用流式数据作为源,如:KafkaSource;channel:通道或管道,用于处理或转换数据,如:JsonChannel;Sink:数据落地,通常用于数据的存储或转发,如:DbSink、KafkaSink;Component:Component,用来执行逻辑的最小单元,source、channel、sink都是Component;Pipeline:流水线或流水线,一个Pipeline由以上组件组成,不同的业务可以组装成不同的Pipeline;代码实现:数字数据源->累加->转换为字符串->登陆/***component*/publicinterfaceComponent{/***组件名*@return*/StringgetName();/***获取下游components*@return*/CollectiongetDownStrems();/***组件执行*/voidexecute(To);}publicabstractclassAbstractComponentimplementsComponent{@Overridepublicvoidexecute(To){//当前组件执行rr=doExecute(o);System.out.println(getName()+"receive"+o+"return"+r);//获取下游组件并执行CollectiondownStreams=getDownStrems();if(!CollectionUtils.isEmpty(downStreams)){downStreams.forEach(c->c.execute(r));}}protectedabstractRdoExecute(To);}/***数据源*/publicabstractclassSourceextendsAbstractComponent{}/***管道/通道*@param<T>*/publicabstractclassChannelextendsAbstractComponent{}/***数据落地*@param*/publicabstractclassSinkextendsAbstractComponent{}publicclassIntegerSourceextendsSource<整数,整数>{@OverrideprotectedIntegerdoExecute(Integero){returno;}@OverridepublicStringgetName(){return"Integer-Source";}@OverridepublicCollectiongetDownStrems(){returnCollections.singletonList(newIncrChannel());}}publicclassIncrChannelextendsChannel{@OverrideprotectedIntegerdoExecute(Integero){returno+1;}@OverridepublicStringgetName(){return"Incr-Channel";}@OverridepublicCollectiongetDownStrems(){returnCollections.singletonList(newStringChannel());}}publicclassStringChannelextendsChannel<整数,字符串>{@OverrideprotectedStringdoExecute(Integero){return"str"+o;}@OverridepublicStringgetName(){return"String-Channel";}@OverridepublicCollectiongetDownStrems(){returnCollections.singletonList(newStringSink());}}publicclassStringSinkextendsSink{@OverrideprotectedVoiddoExecute(Stringo){returnnull;}@OverridepublicStringgetName(){返回“String-Sink”;}@OverridepublicCollectiongetDownStrems(){returnnull;}}/***Pipeline*/publicclassPipeline{/***数据源*/privateSourcesource;publicPipeline(Sourcesource){this.source=source;}/***start*/publicvoidstart(){source.execute(1);}}测试:publicclassPipelineTest{@Testpublicvoidtest(){Pipelinepipeline=newPipeline(newIntegerSource());pipeline.start();}}执行结果:Integer-Sourcereceive1return1Incr-Channelreceive1return2String-Channelreceive2returnstr2Stringull2String-SinkreEvent-drivenarchitectureEvent-drivenmode事件驱动是以特定的事件作为触发条件,所以在整个处理流程中,事件驱动通常属于发布-订阅模式或者观察者模式,用于异步处理g和解耦业务逻辑。具体实现有进程内和分布式两种方式,如:EventBus、MQ等。代码示例:publicclassOrderEventListenerimplementsListener{@OverridepublicvoidonEvent(OrderEventevent){System.out.println("receiveevent:"+event);}}publicclassEventBus{privatefinalstaticListlisteners=newArrayList<>();*@paramlistener*/publicstaticvoidregisterListener(Listenerlistener){listeners.add(listener);}/***publishevent*@paramevent*/publicvoidpublishEvent(Eventevent){//接收并处理事件listeners.forEach(l->{l.onEvent(event);});}}测试:publicclassEventBusTest{@Testpublicvoidpublish(){OrderEventevent=newOrderEvent("order_2",OrderState.PENDING_PAYMENT);EventBus.registerListener(newOrderEventListener());EventBuseventBus=newEventBus();event.publishEvent(event);}}Spring也有事件发布和监听(深入讲解Spring/SpringBoot事件监听机制):@ComponentpublicclassOrderEventListener{@Async@EventListener(OrderEvent.class)publicvoidonEvent(OrderEventevent){System.out.println("receiveevent:"+event);}}publicclassEventTest{@AutowiredprivateApplicationContextcontext;@TestpublicvoidpublishEvent(){OrderEventevent=newOrderEvent("order_1",OrderState.PENDING_PAYMENT);context.publishEvent(event);}}总结以上代码示例简要说明了工作中常用的架构模式,但模式并不固定,大家可以在工作中结合实际情况按需使用