確保物件的唯一性——單例模式 (二)

Liuwei-Sunny發表於2012-04-02

3.3 負載均衡器的設計與實現

       Sunny軟體公司承接了一個伺服器負載均衡(Load Balance)軟體的開發工作,該軟體執行在一臺負載均衡伺服器上,可以將併發訪問和資料流量分發到伺服器叢集中的多臺裝置上進行併發處理,提高系統的整體處理能力,縮短響應時間。由於叢集中的伺服器需要動態刪減,且客戶端請求需要統一分發,因此需要確保負載均衡器的唯一性,只能有一個負載均衡器來負責伺服器的管理和請求的分發,否則將會帶來伺服器狀態的不一致以及請求分配衝突等問題。如何確保負載均衡器的唯一性是該軟體成功的關鍵。

      Sunny公司開發人員通過分析和權衡,決定使用單例模式來設計該負載均衡器,結構圖如圖3-3所示:

        在圖3-3中,將負載均衡器LoadBalancer設計為單例類,其中包含一個儲存伺服器資訊的集合serverList,每次在serverList中隨機選擇一臺伺服器來響應客戶端的請求,實現程式碼如下所示:
import java.util.*;

//負載均衡器LoadBalancer:單例類,真實環境下該類將非常複雜,包括大量初始化的工作和業務方法,考慮到程式碼的可讀性和易理解性,只列出部分與模式相關的核心程式碼
class LoadBalancer {
	//私有靜態成員變數,儲存唯一例項
	private static LoadBalancer instance = null;
	//伺服器集合
	private List serverList = null;
	
	//私有建構函式
	private LoadBalancer() {
		serverList = new ArrayList();
	}
	
	//公有靜態成員方法,返回唯一例項
	public static LoadBalancer getLoadBalancer() {
		if (instance == null) {
			instance = new LoadBalancer();
		}
		return instance;
	}
	
	//增加伺服器
	public void addServer(String server) {
		serverList.add(server);
	}
	
	//刪除伺服器
	public void removeServer(String server) {
		serverList.remove(server);
	}
	
	//使用Random類隨機獲取伺服器
	public String getServer() {
		Random random = new Random();
		int i = random.nextInt(serverList.size());
		return (String)serverList.get(i);
	}
}
      編寫如下客戶端測試程式碼:
class Client {
	public static void main(String args[]) {
        //建立四個LoadBalancer物件
		LoadBalancer balancer1,balancer2,balancer3,balancer4;
		balancer1 = LoadBalancer.getLoadBalancer();
		balancer2 = LoadBalancer.getLoadBalancer();
		balancer3 = LoadBalancer.getLoadBalancer();
		balancer4 = LoadBalancer.getLoadBalancer();
		
		//判斷伺服器負載均衡器是否相同
		if (balancer1 == balancer2 && balancer2 == balancer3 && balancer3 == balancer4) {
			System.out.println("伺服器負載均衡器具有唯一性!");
		}
		
		//增加伺服器
		balancer1.addServer("Server 1");
		balancer1.addServer("Server 2");
		balancer1.addServer("Server 3");
		balancer1.addServer("Server 4");
		
		//模擬客戶端請求的分發
		for (int i = 0; i < 10; i++) {
            String server = balancer1.getServer();
			System.out.println("分發請求至伺服器: " + server);
      }
	}
}
        編譯並執行程式,輸出結果如下:

伺服器負載均衡器具有唯一性!

分發請求至伺服器:  Server 1

分發請求至伺服器:  Server 3

分發請求至伺服器:  Server 4

分發請求至伺服器:  Server 2

分發請求至伺服器:  Server 3

分發請求至伺服器:  Server 2

分發請求至伺服器:  Server 3

分發請求至伺服器:  Server 4

分發請求至伺服器:  Server 4

分發請求至伺服器:  Server 1

        雖然建立了四個LoadBalancer物件,但是它們實際上是同一個物件,因此,通過使用單例模式可以確保LoadBalancer物件的唯一性。

【作者:劉偉  http://blog.csdn.net/lovelion

相關文章