转载自:http://blog.csdn.net/lovelion 作者:刘伟
负载均衡器的设计与实现
Sunny公司开发人员通过分析和权衡,决定使用单例模式来设计该负载均衡器,结构图如图3-3所示:
在图中,将负载均衡器LoadBalancer设计为单例类,其中包含一个存储服务器信息的集合serverList,
每次在serverList中随机选择一台服务器来响应客户端的请求,实现代码如下所示:
LoadBalance:
1 namespace SingletonPattern 2 { 3 /// <summary> 4 /// 负载均衡器器(单例模式) 5 /// </summary> 6 public class LoadBalance 7 { 8 private static LoadBalance _instance = null; //保存当前类的唯一实例 9 private List<String> ServerList = null; //服务器列表 10 11 private LoadBalance() 12 { 13 ServerList = new List<string>(); 14 } 15 //供外部调用,用于返回当前类的唯一实例 16 public static LoadBalance GetInstance() 17 { 18 if (_instance == null) 19 { 20 _instance = new LoadBalance(); 21 } 22 return _instance; 23 } 24 25 //增加服务器 26 public void AddServer(string server) 27 { 28 ServerList.Add(server); 29 } 30 31 //删除服务器 32 public void RemoveServer(string server) 33 { 34 ServerList.Remove(server); 35 } 36 //随机获取一个服务器,来实现负载均衡器 37 public String GetRandomServer() 38 { 39 if (ServerList.Count > 0) 40 { 41 //使用随机数时,需要进行沿时,否则容易产生随机生成一堆相同的数据 42 Thread.Sleep(10); 43 Random random = new Random(); 44 int index = random.Next(0, ServerList.Count); 45 return ServerList[index]; 46 } 47 return null; 48 } 49 } 50 }
Program:
1 namespace SingletonPattern 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //实例化四个对象进行测试 8 LoadBalance balance1, balance2, balance3, balance4; 9 balance1 = LoadBalance.GetInstance(); 10 balance2 = LoadBalance.GetInstance(); 11 balance3 = LoadBalance.GetInstance(); 12 balance4 = LoadBalance.GetInstance(); 13 14 //判断下这四个对象是否是同一个对象? 15 //如果不相同,就违法了单例模式 16 //相同的话,就符合单例模式 17 if(balance1.Equals(balance2) || balance1.Equals(balance3) || balance1.Equals(balance4)) 18 Console.WriteLine("对象1与所有对象都相同,符合单例模式"); 19 else 20 Console.WriteLine("对象1与其它对象不相同,不符合单例模式"); 21 22 //增加服务器 23 balance1.AddServer("服务器1:127.0.0.1"); 24 balance1.AddServer("服务器2:222,222,222,222"); 25 balance1.AddServer("服务器3:333,333,333,333"); 26 balance1.AddServer("服务器4:444,444,444,444"); 27 28 //模拟客户端请求的分发,随机获取一个服务器 29 for (int i = 0; i < 10; i++) 30 { 31 Console.WriteLine("分发请求:" + balance1.GetRandomServer()); 32 } 33 Console.Read(); 34 } 35 } 36 }
输出结果: