在下面的例子中,通过使用负荷均衡器LoadBalancer这个单例类,同时提供ServerI,ServerII,ServerIII,ServerIV,ServerV 5个服务进程。面对客户端的请求,负荷均衡器随机选择一个服务进程提供给客户端。负荷均衡器只能有一个,所以不管有多少个客户端要求服务,都只能用一个负荷均衡器来提供服务。
//Singleton设计模式
class MainApp
{
static void Main()
{
//生成负荷均衡器对象
LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
//取得负荷均衡器对象
LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
//取得负荷均衡器对象
LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
//取得负荷均衡器对象
LoadBalancer b4 = LoadBalancer.GetLoadBalancer();
// 判断是否是相同的负荷均衡器
if (b1 == b2 && b2 == b3 && b3 == b4)
{
Console.WriteLine("Same instance\n");
}
// 演示15次客户端的请求,每次请求,负荷均衡器随机提供一个服务进程Server。
LoadBalancer balancer = LoadBalancer.GetLoadBalancer();
for (int i = 0; i < 15; i++)
{
string server = balancer.Server;
Console.WriteLine("Dispatch Request to: " + server);
}
// Wait for user
Console.ReadKey();
}
}
/// 'Singleton'类:负荷均衡器类
class LoadBalancer
{
//静态成员变量,保存负荷均衡器类的实例对象。
private static LoadBalancer _instance;
//服务器进程队列。
private List_servers = new List ();
//随机数产生器,用来随机提供一个服务器进程
private Random _random = new Random();
// 同步对象
private static object syncLock = new object();
// 保护的构造函数,添加5个服务进程。
protected LoadBalancer()
{
//构建可用的服务
_servers.Add("ServerI");
_servers.Add("ServerII");
_servers.Add("ServerIII");
_servers.Add("ServerIV");
_servers.Add("ServerV");
}
//负荷均衡器的创建只能通过该函数生成。
public static LoadBalancer GetLoadBalancer()
{
//保证类的实例只有一个
if (_instance == null)
{
//保证类的生成和检测能一次执行完毕不受其他线程影响(支持多线程)
lock(syncLock)
{
//如果没有创建该实例则创建
if (_instance == null)
{
_instance = new LoadBalancer();
}
}
}
//返回类的实例。
return _instance;
}
// 随机取得一个服务进程。
public string Server
{
get
{
int r = _random.Next(_servers.Count);
return _servers[r].ToString();
}
}
}
执行结果(负荷均衡器随机从5个服务进程中选择一个提供给客户端的使用的原因,每次执行结果不一定相同):
Dispatch Request to: ServerII
Dispatch Request to: ServerII
Dispatch Request to: ServerII
Dispatch Request to: ServerII
Dispatch Request to: ServerV
Dispatch Request to: ServerIV
Dispatch Request to: ServerII
Dispatch Request to: ServerII
Dispatch Request to: ServerII
Dispatch Request to: ServerIV
Dispatch Request to: ServerV
Dispatch Request to: ServerIII
Dispatch Request to: ServerIII
Dispatch Request to: ServerIII
Dispatch Request to: ServerI
没有评论:
发表评论