目录
应用需求
单例模式设计服务器负载均衡器
1、创建控制台应用程序
2、模拟 LB 创建类对象
3、构建单例对象构造器
4、通过单例对象构造器创建 LB 实例对象
5、启动 ConsoleApp1 项目运行
6、单例对象构造器另一种使用
说起单例模式,想必大家都不陌生,在创建型模式中应该是最常用的设计模式之一了。此时就不再过多叙述,可以查看《单例模式》的文章。
单例模式
单例模式,https://blog.csdn.net/ChaITSimpleLove/article/details/80439631
应用需求某软件公司承接了一个服务器负载均衡(LB,Load Balance
)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。
分析:对于上面的需求场景,问题的关键是如何确保 LB
的 唯一性 ?
接下来我们尝试使用【单例模式】设计服务器负载均衡器。
1、创建控制台应用程序使用 vs 创建【控制台应用程序】,命名为:ConsoleApp1
,或者使用 cli
命令:
dotnet new console -n ConsoleApp1
2、模拟 LB 创建类对象
using System.Collections;
namespace ConsoleApp1;
///
/// 模拟负载均衡器
///
internal class LoadBalancer
{
//私有静态成员变量,存储唯一实例
private static LoadBalancer? instance = null;
//服务器集合
private static readonly ArrayList? serverList = null;
//静态构造函数
static LoadBalancer()
{
serverList = new ArrayList();
}
//增加服务器
public void AddServer(string server)
{
serverList?.Add(server);
}
//删除服务器
public void RemoveServer(string server)
{
serverList?.Remove(server);
}
//使用Random类随机获取服务器
public string GetServer()
{
int i = Random.Shared.Next(serverList.Count); //随机选一台服务器
return serverList[i].ToString();
}
}
3、构建单例对象构造器
namespace ConsoleApp1;
///
/// 单例对象构造器
///
///
public class SingletonConstructor where T : class, new()
{
private static T? _Instance;
private readonly static object _lockObj = new();
///
/// 获取单例对象的实例
///
///
public static T GetInstance()
{
if (_Instance != null) return _Instance;
lock (_lockObj)
{
if (_Instance == null)
{
var item = Activator.CreateInstance();
System.Threading.Interlocked.Exchange(ref _Instance, item);
}
}
return _Instance;
}
}
4、通过单例对象构造器创建 LB 实例对象
在 Main
方法中,添加如下代码:
static void Main(string[] args)
{
// 1. 使用单例对象构造器(SingletonConstructor)创建 LB 实例对象
var balancer1 = SingletonConstructor.GetInstance();
var balancer2 = SingletonConstructor.GetInstance();
var balancer3 = SingletonConstructor.GetInstance();
if (balancer1.Equals(balancer2) && balancer2.Equals(balancer3))
{
Console.WriteLine("服务器负载均衡器(LB)实例对象具有唯一性!");
}
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?