在『伺服器部署 Vue 和 Django 項目的全記錄』一文中,介紹了在伺服器中使用 Nginx 部署前後端項目的過程。然而,當 Web 應用流量增多時,需要考慮負載均衡、流量分發、容災等情況,原生的部署方式通常難以滿足需求。此時,引入 Docker 部署多節點,能夠在單台高性能伺服器或伺服器集群中... ...
思想
策略思想
解決的問題:一類對象,不同對象有不同的處理
實現
頂級介面
-
定義規範,面向介面編程
抽象策略
-
定義一套模板,不同的交給不同的策略實現
具體策略
-
枚舉 對象標識 --具體策略
-
策略集合-對象標識
觀察者思想
解決的問題:當一個對象狀態發生改變時,所有依賴他的對象將得到通知並自動更新
常見場景:
-
spring事件
-
消息隊列
-
我們不用去關心依賴的對象,只用把自己的事情做好
實現:
-
充分解耦
-
可實現一對一和廣播
頂級事件介面
具體事件
頂級訂閱者介面
具體訂閱者
事件發佈中心
上下文思想
解決的問題:當一個參數在需要四處傳遞,可設置上下文,從上下文中取
實現:
-
spring提供了一系列獲取容器對象的介面ApplicationContextAware....
上下文頂級介面,定義規範
具體上下文
-
保證全局唯一
-
並非容器
池化思想
線程池
-
復用線程,減少系統資源的消耗
-
便於管理線程
-
快速的響應
合理的線程池:根據不同場景,情況去構建合適的線程池,保證效率和資源消耗
場景:流程發佈,構建流程軌跡
實現
CAS鎖控制控制線程池唯一,只有一個線程能夠進行調度(提交任務)
private AtomicBoolean started = new AtomicBoolean(false);
private AtomicBoolean scheduler = new AtomicBoolean(false);
自定義阻塞隊列,存放任務
private BlockingQueue<ProcessDefinition> queue = new LinkedBlockingQueue<>(512);
單個線程迴圈處理,allowCoreThreadTimeOut回收線程節約資源
this.executor.allowCoreThreadTimeOut(true);
try {
ProcessDefinition definition;
while ((definition = queue.poll()) != null) {
handler(definition);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
scheduler.compareAndSet(true, false);
if (!queue.isEmpty()) {
scheduler();
}
}
設計思想
並不是絕對的,靈活變通
-
構建合理的類結構,便於擴展,理解
-
單一職責模式
一個類只做一個事情,可通過依賴建立聯繫
優點:職責分明,結構清晰,便於修改
前:
後:
開閉原則
實現不改變這個類的情況下進行擴展
實現:策略模式
前:
後:
里氏替換原則
通過繼承來進行擴展
依賴倒置原則
面向介面編程
合成復用原則
多用組合代替繼承
-
一般來說,如果兩個類之間是"Has-A"關係,則使用組合/聚合;如果是"Is-A"關係,則使用繼承。
迪米特法則
中間類
介面隔離原則
介面隔離原則和單一職責都是為了提高類的內聚性、降低它們之間的耦合性,體現了封裝的思想,但兩者是不同的:
-
單一職責原則註重的是職責,而介面隔離原則註重的是對介面依賴的隔離。
-
單一職責原則主要是約束類,它針對的是程式中的實現和細節;介面隔離原則主要約束介面,主要針對抽象和程式整體框架的構建。
介面拆分