偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺談常用的架構(gòu)模式

開(kāi)發(fā) 架構(gòu)
架構(gòu)模式有很多種,本文只討論工作中使用較多的幾種:分層架構(gòu),Pipeline架構(gòu),事件驅(qū)動(dòng)架構(gòu)。

架構(gòu)模式是軟件架構(gòu)中在給定環(huán)境下常遇到問(wèn)題的通用的、可重用的解決方案。類(lèi)似于軟件設(shè)計(jì)模式但覆蓋范圍更廣,致力于軟件工程中不同問(wèn)題,如計(jì)算機(jī)硬件性能限制、高可用性、業(yè)務(wù)風(fēng)險(xiǎn)極小化。一些架構(gòu)模式在軟件框架被實(shí)現(xiàn)。- 維基百科

說(shuō)明

架構(gòu)模式有很多種,本文只討論工作中使用較多的幾種:

  • 分層架構(gòu)
  • Pipeline架構(gòu)
  • 事件驅(qū)動(dòng)架構(gòu)

分層架構(gòu)

 

淺談常用的架構(gòu)模式
分層架構(gòu)模式

分層架構(gòu)模式工作中用的比較多,常見(jiàn)的有MVC等,通過(guò)分層將職責(zé)劃分到某一層上,層次清晰,架構(gòu)明了。

我們以MVC來(lái)舉例說(shuō)明:controller -> service -> dao

 

  1. @RestController 
  2. @RequestMapping("/order"
  3. public class OrderController { 
  4.     @Autowired 
  5.     private OrderService orderService; 
  6.  
  7.     /** 
  8.      * 新增訂單 
  9.      * @param order 
  10.      * @return 
  11.      */ 
  12.     @PostMapping("/add"
  13.     public Response addOrder(Order order) { 
  14.         orderService.add(order); 
  15.         return Response.success(); 
  16.     } 
  17.  
  18. public interface OrderService { 
  19.     /** 
  20.      *  添加訂單 
  21.      * @param order 
  22.      * @return 
  23.      */ 
  24.     boolean add(Order order); 
  25.  
  26. public interface OrderRepository { 
  27.  
  28.     int save(Order order); 

按照依賴(lài)方向,上層依次依賴(lài)下層,每一層處理不同到邏輯。

之前到文章有討論過(guò)通過(guò)依賴(lài)反轉(zhuǎn)來(lái)改變依賴(lài)關(guān)系,從而更少到減少耦合。

Pipeline架構(gòu)

 

淺談常用的架構(gòu)模式
Pipeline架構(gòu)模式

Pipeline架構(gòu)也稱(chēng)為管道或流水線(xiàn)架構(gòu),處理流程成線(xiàn)性,各個(gè)環(huán)節(jié)有相應(yīng)到組件處理,從前到后順序執(zhí)行。

概念說(shuō)明:

  • source: 數(shù)據(jù)源,通常使用流數(shù)據(jù)為源,比如:KafkaSource;
  • channel:信道或管道,用于處理或轉(zhuǎn)換數(shù)據(jù),比如:JsonChannel;
  • Sink:數(shù)據(jù)落地,通常用于數(shù)據(jù)存儲(chǔ)或轉(zhuǎn)發(fā),比如:DbSink, KafkaSink;
  • Component: 組件,用于執(zhí)行邏輯的最小單元,source,channel,sink都是一個(gè)Component;
  • Pipeline: 管道或流水線(xiàn),一個(gè)Pipeline由上面的組件組成,不同的業(yè)務(wù)可以組裝成不同的Pipeline;
  • 代碼實(shí)現(xiàn):數(shù)字?jǐn)?shù)據(jù)源 -> 累加 -> 轉(zhuǎn)成字符串 -> 落地

 

  1. /** 
  2.  *  組件 
  3.  */ 
  4. public interface Component<T> { 
  5.     /** 
  6.      *  組件名稱(chēng) 
  7.      * @return 
  8.      */ 
  9.     String getName(); 
  10.  
  11.     /** 
  12.      *  獲取下游組件 
  13.      * @return 
  14.      */ 
  15.     Collection<Component> getDownStrems(); 
  16.  
  17.     /** 
  18.      *  組件執(zhí)行 
  19.      */ 
  20.     void execute(T o); 
  21.  
  22. public abstract class AbstractComponent<T, R> implements Component<T>{ 
  23.  
  24.     @Override 
  25.     public void execute(T o) { 
  26.         // 當(dāng)前組件執(zhí)行 
  27.         R r = doExecute(o); 
  28.         System.out.println(getName() + " receive " + o + " return " + r); 
  29.         // 獲取下游組件,并執(zhí)行 
  30.         Collection<Component> downStreams = getDownStrems(); 
  31.         if (!CollectionUtils.isEmpty(downStreams)) { 
  32.             downStreams.forEach(c -> c.execute(r)); 
  33.         } 
  34.     } 
  35.  
  36.     protected abstract R doExecute(T o); 
  37.  
  38. /** 
  39.  *  數(shù)據(jù)來(lái)源 
  40.  */ 
  41. public abstract class Source<T, R> extends AbstractComponent<T, R>{ 
  42.  
  43.  
  44. /** 
  45.  *  管道/信道 
  46.  * @param <T> 
  47.  */ 
  48. public abstract class Channel<T, R> extends AbstractComponent<T, R> { 
  49.  
  50.  
  51. /** 
  52.  *  數(shù)據(jù)落地 
  53.  * @param <T> 
  54.  */ 
  55. public abstract class Sink<T, R> extends AbstractComponent<T, R> { 
  56.  
  57.  
  58. public class IntegerSource extends Source<Integer,  Integer>{ 
  59.  
  60.     @Override 
  61.     protected Integer doExecute(Integer o) { 
  62.         return o; 
  63.     } 
  64.  
  65.     @Override 
  66.     public String getName() { 
  67.         return "Integer-Source"
  68.     } 
  69.  
  70.     @Override 
  71.     public Collection<Component> getDownStrems() { 
  72.         return Collections.singletonList(new IncrChannel()); 
  73.     } 
  74.  
  75.  
  76. public class IncrChannel extends Channel<IntegerInteger> { 
  77.  
  78.     @Override 
  79.     protected Integer doExecute(Integer o) { 
  80.         return o + 1; 
  81.     } 
  82.  
  83.     @Override 
  84.     public String getName() { 
  85.         return "Incr-Channel"
  86.     } 
  87.  
  88.     @Override 
  89.     public Collection<Component> getDownStrems() { 
  90.         return Collections.singletonList(new StringChannel()); 
  91.     } 
  92.  
  93.  
  94. public class StringChannel extends Channel<Integer, String> { 
  95.  
  96.     @Override 
  97.     protected String doExecute(Integer o) { 
  98.         return "str" + o; 
  99.     } 
  100.  
  101.     @Override 
  102.     public String getName() { 
  103.         return "String-Channel"
  104.     } 
  105.  
  106.     @Override 
  107.     public Collection<Component> getDownStrems() { 
  108.         return Collections.singletonList(new StringSink()); 
  109.     } 
  110.  
  111.  
  112. public class StringSink extends Sink<String, Void>{ 
  113.  
  114.     @Override 
  115.     protected Void doExecute(String o) { 
  116.         return null
  117.     } 
  118.  
  119.     @Override 
  120.     public String getName() { 
  121.         return "String-Sink"
  122.     } 
  123.  
  124.     @Override 
  125.     public Collection<Component> getDownStrems() { 
  126.         return null
  127.     } 
  128.  
  129.  
  130. /** 
  131.  *  流水線(xiàn) 
  132.  */ 
  133. public class Pipeline { 
  134.     /** 
  135.      *  數(shù)據(jù)源 
  136.      */ 
  137.     private Source source; 
  138.  
  139.     public Pipeline(Source source) { 
  140.         this.source = source; 
  141.     } 
  142.  
  143.     /** 
  144.      *  啟動(dòng) 
  145.      */ 
  146.     public void start() { 
  147.         source.execute(1); 
  148.     } 

測(cè)試:

 

  1. public class PipelineTest { 
  2.  
  3.     @Test 
  4.     public void test() { 
  5.         Pipeline pipeline = new Pipeline(new IntegerSource()); 
  6.         pipeline.start(); 
  7.     } 

執(zhí)行結(jié)果:

 

  1. Integer-Source receive 1 return 1  
  2. Incr-Channel receive 1 return 2  
  3. String-Channel receive 2 return str2  
  4. String-Sink receive str2 return null 

事件驅(qū)動(dòng)架構(gòu)

 

淺談常用的架構(gòu)模式
事件驅(qū)動(dòng)模式

事件驅(qū)動(dòng)是以某個(gè)具體事件為觸發(fā)條件,從而貫穿這個(gè)處理流程。通常事件驅(qū)動(dòng)屬于發(fā)布訂閱模式或觀察者模式, 用于異步處理,解耦業(yè)務(wù)邏輯。具體實(shí)現(xiàn)有進(jìn)程內(nèi)的和分布式的方式,比如:EventBus, MQ等等。

代碼舉例:

 

  1. public class OrderEventListener implements Listener<OrderEvent> { 
  2.  
  3.     @Override 
  4.     public void onEvent(OrderEvent event) { 
  5.         System.out.println("receive event: " + event); 
  6.     } 
  7.  
  8. public class EventBus { 
  9.  
  10.     private final static List<Listener> listeners = new ArrayList<>(); 
  11.  
  12.     /** 
  13.      *  注冊(cè)監(jiān)聽(tīng)器 
  14.      * @param listener 
  15.      */ 
  16.     public static void registerListener(Listener listener) { 
  17.         listeners.add(listener); 
  18.     } 
  19.  
  20.     /** 
  21.      *  發(fā)布事件 
  22.      * @param event 
  23.      */ 
  24.     public void publishEvent(Event event) { 
  25.         // 收到并處理事件 
  26.         listeners.forEach(l -> { 
  27.             l.onEvent(event); 
  28.         }); 
  29.     } 

測(cè)試:

 

  1. public class EventBusTest { 
  2.  
  3.     @Test 
  4.     public void publish() { 
  5.         OrderEvent event = new OrderEvent("order_2", OrderState.PENDING_PAYMENT); 
  6.         EventBus.registerListener(new OrderEventListener()); 
  7.         EventBus eventBus = new EventBus(); 
  8.         eventBus.publishEvent(event); 
  9.     } 

Spring中也有事件發(fā)布和監(jiān)聽(tīng)(深入淺出Spring/SpringBoot 事件監(jiān)聽(tīng)機(jī)制):

 

  1. @Component 
  2. public class OrderEventListener  { 
  3.  
  4.     @Async 
  5.     @EventListener(OrderEvent.class) 
  6.     public void onEvent(OrderEvent event) { 
  7.         System.out.println("receive event: " + event); 
  8.     } 
  9.  
  10. public class EventTest { 
  11.     @Autowired 
  12.     private ApplicationContext context; 
  13.  
  14.     @Test 
  15.     public void publishEvent() { 
  16.         OrderEvent event = new OrderEvent("order_1", OrderState.PENDING_PAYMENT); 
  17.         context.publishEvent(event); 
  18.     } 

總結(jié)

以上通過(guò)代碼實(shí)例簡(jiǎn)單說(shuō)明了工作中常用到的架構(gòu)模式,但是模式不是固定的,工作中需結(jié)合實(shí)際情況按需使用即可。

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-07-23 11:35:49

架構(gòu)運(yùn)維技術(shù)

2023-06-16 13:34:00

軟件架構(gòu)模式

2012-01-13 10:45:56

企業(yè)應(yīng)用架構(gòu)

2024-02-05 08:11:30

架構(gòu)模式單體

2020-02-26 09:00:00

Chatbot架構(gòu)模型聊天機(jī)器人

2018-05-24 11:38:17

2023-07-27 06:51:46

Android架構(gòu)模式

2022-06-14 11:01:37

架構(gòu)模式開(kāi)發(fā)

2020-06-28 10:15:39

架構(gòu)模式軟件

2022-09-21 10:05:09

架構(gòu)模式

2017-09-14 09:30:38

軟件架構(gòu)模式

2020-10-08 18:20:54

前端后端架構(gòu)

2021-12-15 10:05:25

軟件開(kāi)發(fā) 技術(shù)

2021-07-02 06:54:45

軟件架構(gòu)模式

2019-12-31 10:08:35

架構(gòu)模式軟件

2022-04-02 23:32:42

數(shù)據(jù)網(wǎng)格架構(gòu)

2024-11-08 09:41:02

2020-02-24 21:23:41

跨平臺(tái)想法嘗試

2024-01-05 13:25:00

架構(gòu)架構(gòu)模式開(kāi)發(fā)

2024-09-18 09:04:33

架構(gòu)模式查詢(xún)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)