AppManagerComponent学习笔记
请大家关注我的微博:@NormanLin_BadPixel坏像素
private readonly Dictionary<int, Process> processes = new Dictionary<int, Process>();
看来是管理Process的工具。.Net用Process来提供对本地和远程进程的访问权限并使你能够启动和停止本地系统进程。官方文档
关于后面的StartProcess里面,我们看到用Process.Start启动了一个名为dotnet的进程,并且第一个参数是App.dll。这个用法到底能做什么呢?请看官方文档。有关点NET Core 命令行接口 (CLI) 工具。大家别忘了,我们这个应用程序的入口就在App.dll里面的Program里面。
我们看看作者对这个组件作用的注释。
/// <summary>
/// 监控启动的进程,如果进程挂掉了,重新拉起
/// </summary>
private async void WatchProcessAsync()
这是怎么做到的呢?
首先,我们得知道,都有那些服务添加了AppManagerComponent。在Program文件里,我们看到,只有AppType.Manager的服务才会添加这个组件。
string[] ips = NetHelper.GetAddressIPs();
StartConfig[] startConfigs = Game.Scene.GetComponent<StartConfigComponent>().GetAll();
我们快速的进NetHelper看一下。
public static class NetHelper
{
public static string[] GetAddressIPs()
{
//获取本地的IP地址
List<string> addressIPs = new List<string>();
foreach (IPAddress address in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (address.AddressFamily.ToString() == "InterNetwork")
{
addressIPs.Add(address.ToString());
}
}
return addressIPs.ToArray();
}
}
如作者注释的,获取本地的IP地址。(
IP 版本 4 地址。)AddressFamily官方文档。之后,获取所有的服务配置信息。
如果除了自己(自己是AppType.Manager因为这个组件只有这个服务才会有。)还有其他服务的配置信息,则会尝试去启动其他服务。
首先得判断,其他服务的配置信息里面的IP地址是不是在本地,如果不是,则说明这个服务不是在本地启动的。如果是,则通过StartProcess服务启动该服务并且收进processes字典里面监控管理。
这样做的好处是什么呢?
如果我们把多个服务分布在不同的服务器上,我们只要在每个服务器上启动AppType.Manager服务就可以把所有其他服务都启动了,前提是我们得保证配置信息的一致。而不用手动的去启动每个服务。