C#中设计一个对系统和服务器进行监测的逻辑思路是什么,

C#中设计一个对系统和服务器进行监测的逻辑思路是什么,,第1张

调用windowsAPI函数应该可以做到
1、首先申明using SystemRuntimeInteropServices命名空间
2、函数主体定义等:
/// <summary>
/// "DllImport"属性用来从不可控代码中调用一个方法,它指定了DLL的位置,该DLL中包含调用的外部方法;
/// "kernel32"设定了类库名;"public"指明函数的访问类型为公有的;"static"修饰符声明一个静态元素,
/// 而该元素属于类型本身而不是指定的对象;"extern"表示该方法将在工程外部执行,同时使用DllImport导
/// 入的方法必须使用"extern"修饰符;最后GetWindowsDirectory函数包含了两个参数,一个为StringBuilder类型的,
/// 另一个为int类型的,该方法返回的内容存在于StringBuilder类型的参数中。同时,因为我们在这里使用
/// 到了StringBuilder类,所以在程序的开始处,我们还得添加SystemText这个名称空间,方法同上。
/// </summary>
/// <param name="WinDir"></param>
/// <param name="count"></param>
[DllImport("kernel32")] ///获取Windows路径
public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);
[DllImport("kernel32")] ///获取系统路径
public static extern void GetSystemDirectory(StringBuilder SysDir,int count);
[DllImport("kernel32")] ///获取CPU相关信息
public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);
[DllImport("kernel32")] ///获取内存信息
public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);
[DllImport("kernel32")] ///获取系统时间
public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);
///定义CPU结构信息
[StructLayout(LayoutKindSequential)]
public struct CPU_INFO
{
public uint dwOemId;
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
///定义内存结构信息
[StructLayout(LayoutKindSequential)]
public struct MEMORY_INFO
{
public uint dwLength;
public uint dwMemoryLoad;
public uint dwTotalPhys;
public uint dwAvailPhys;
public uint dwTotalPageFile;
public uint dwAvailPageFile;
public uint dwTotalVirtual;
public uint dwAvailVirtual;
}
///定义系统时间结构信息
[StructLayout(LayoutKindSequential)]
public struct SYSTEMTIME_INFO
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
}
private void button1_Click(object sender, EventArgs e)
{
//调用GetWindowsDirectory和GetSystemDirectory函数分别取得Windows路径和系统路径
const int nChars = 128;
StringBuilder Buff = new StringBuilder(nChars);
GetWindowsDirectory(Buff, nChars);
WindowsDirectoryText = "Windows路径:" + BuffToString();
GetSystemDirectory(Buff, nChars);
SystemDirectoryText = "系统路径:" + BuffToString();
//调用GetSystemInfo函数获取CPU的相关信息
CPU_INFO CpuInfo;
CpuInfo = new CPU_INFO();
GetSystemInfo(ref CpuInfo);
NumberOfProcessorsText = "本计算机中有" + CpuInfodwNumberOfProcessorsToString() + "个CPU";
ProcessorLevelText = "CPU等级为" + CpuInfodwProcessorLevelToString();
OemIdText = "CPU的OEM ID为" + CpuInfodwOemIdToString();
PageSizeText = "CPU中的页面大小为" + CpuInfodwPageSizeToString();
//调用GlobalMemoryStatus函数获取内存的相关信息
MEMORY_INFO MemInfo;
MemInfo = new MEMORY_INFO();
GlobalMemoryStatus(ref MemInfo);
MemoryLoadText = MemInfodwMemoryLoadToString() + "%的内存正在使用";
TotalPhysText = "物理内存共有" + MemInfodwTotalPhysToString() + "字节";
AvailPhysText = "可使用的物理内存有" + MemInfodwAvailPhysToString() + "字节";
TotalPageFileText = "交换文件总大小为" + MemInfodwTotalPageFileToString() + "字节";
AvailPageFileText = "尚可交换文件大小为" + MemInfodwAvailPageFileToString() + "字节";
TotalVirtualText = "总虚拟内存有" + MemInfodwTotalVirtualToString() + "字节";
AvailVirtualText = "未用虚拟内存有" + MemInfodwAvailVirtualToString() + "字节";
//调用GetSystemTime函数获取系统时间信息
SYSTEMTIME_INFO StInfo;
StInfo = new SYSTEMTIME_INFO();
GetSystemTime(ref StInfo);
DateText = StInfowYearToString() + "年" + StInfowMonthToString() + "月" + StInfowDayToString() + "日";
TimeText = (StInfowHour + 8)ToString() + "点" + StInfowMinuteToString() + "分" + StInfowSecondToString() + "秒";
}

我们公司使用的就是微服务加分库分表,一般来说如果应用系统出现性能瓶颈或者业务代码耦合过重,可考虑使用微服务架构,而后端的数据库通常使用读写分离,双主互备或者是分库分表来实现性能的提升和数据服务的高可用。

在数据分布在不同的数据库服务器的带来良好性能的同时,新的问题也随之而来,比如说数据一致性的保证,性能监控,数据存取复杂等,而较为突出的就是数据跨库问题!数据分布在不同的节点上,导致原来的连接查询需要跨库,字段的主键难以保证唯一,跨库的事务处理复杂,下面逐一解决:

1,连接查询(join)问题:因为库表分布在不同的机器上,连接查询失效。

解决办法:

①,代码解决:根据某个字段进行hash的方式进行分库分表,保证落在一个库中的类似表中(比如aa_00t_user_0000和aa_00t_member_0000),然后基于这样的规则在代码中进行连接查询语句书写!

②,同步:将常用的,需要的字段同步到一个库中进行联合查询!

③,冗余:在一个库中冗余更多的连接查询需要的字段,保证全部数据都能查询到!

2,唯一主键:如果使用传统的自增等方式,多库中的主键id势必重复,所以需要对唯一性加以控制!

解决方法:UUID(根据机器ID,时间等),redis(单线程保证不重复),snowflake算法!

3,分布式事务:

1,TCC:try控制业务代码流程,Confirm确认事务的正确性,cancel取消失败的事务!

2,基于消息系统的一致性方案:单节点事务完成后,通过发送消息保证事务提交,如果失败可通过重试,任务补偿等方式保证数据一致性!

总的来说,分布式系统有着很多以往不存在的问题,还需要具体问题具体分析,可一起交流,更多的技术分享,敬请关注。。。

客户端 应保存一个版本文件,打开软件前 先判断是否和服务端的版本一致,不一致提示升级,同时返回 升级文件的路径

客户端 接受升级文件路径并下载文件,下载文件后 更改客户端版本文件与 服务端一致


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13447489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-08
下一篇 2023-08-08

发表评论

登录后才能评论

评论列表(0条)

保存