internal void OnProcessExit() { _ProcessExited = true; _logger?.LogInformation("等待IProcessExitHandler任务执行完毕"); List <Task> tasks = new List <Task>(); lock (_missions) { foreach (var action in _missions) { try { tasks.Add(Task.Run(action)); } catch { } } _missions.Clear(); } Task.WaitAll(tasks.ToArray()); _logger?.LogInformation("准备断开网关"); try { var client = new NetClient(_microServiceHost.MasterGatewayAddress); client.WriteServiceData(new GatewayCommand { Type = CommandType.UnRegisterSerivce, Content = _microServiceHost.Id }); client.ReadServiceObject <InvokeResult>(); } catch (Exception ex) { _logger?.LogError(ex, ex.Message); } _logger?.LogInformation("等待事务托管中心事务清零"); while (_transactionDelegateCenter.List.Count > 0) { Thread.Sleep(1000); } _logger?.LogInformation("停止所有定时任务"); _scheduleTaskManager.StopTasks(); _safeTaskFactory?.WaitAll(); _logger?.LogInformation("等待客户端请求数清零"); //等待客户连接处理完毕 while (_microServiceHost.ClientConnected > 0) { Thread.Sleep(1000); } _logger?.LogInformation("客户端请求数为零"); Thread.Sleep(1000); }
public void RemoveMicroService(RegisterServiceInfo service) { if (_refereeAddress == null) { return; } Task.Run(() => { try { using (NetClient client = new NetClient(_refereeAddress.Address, _refereeAddress.Port)) { client.WriteServiceData(new GatewayCommand { Type = CommandType.UnRegisterSerivce, Content = new RegisterServiceLocation { Host = service.Host, Port = service.Port }.ToJsonString() }); var cmd = client.ReadServiceObject <InvokeResult>(); } } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }); }
public void AddMicroService(RegisterServiceInfo service) { if (_refereeAddress == null) { return; } using (NetClient client = new NetClient(_refereeAddress)) { client.WriteServiceData(new GatewayCommand { Type = CommandType.RegisterSerivce, Content = new RegisterServiceLocation { Host = service.Host, Port = service.Port }.ToJsonString() }); var cmd = client.ReadServiceObject <InvokeResult>(); if (cmd.Success == false) { throw new Exception("not master"); } } }
private void CurrentDomain_ProcessExit(object sender, EventArgs e) { ProcessExited = true; _logger?.LogInformation("准备断开网关"); try { var client = new NetClient(_microServiceHost.MasterGatewayAddress); client.WriteServiceData(new GatewayCommand { Type = CommandType.UnRegisterSerivce, Content = _microServiceHost.Id }); client.ReadServiceObject <InvokeResult>(); } catch (Exception ex) { _logger?.LogError(ex, ex.Message); } _logger?.LogInformation("等待事务托管中心事务清零"); while (_transactionDelegateCenter.List.Count > 0) { Thread.Sleep(1000); } _logger?.LogInformation("停止所有定时任务"); _scheduleTaskManager.StopTasks(); _logger?.LogInformation("等待客户端请求数清零"); //等待客户连接处理完毕 while (_microServiceHost.ClientConnected > 0) { Thread.Sleep(1000); } _logger?.LogInformation("客户端请求数为零,当前进程退出"); Thread.Sleep(1000); }
public void Handle(NetClient client, GatewayCommand cmd) { try { _listeningFiles = cmd.Content.FromJson <string[]>(); while (true) { if (_changedFiles.Count == 0) { client.WriteServiceData(new InvokeResult { Success = true }); client.ReadServiceObject <InvokeResult>(); } else { string[] sendFiles = null; lock (_changedFiles) { sendFiles = _changedFiles.ToArray(); _changedFiles.Clear(); } foreach (var file in sendFiles) { string fullpath = $"{_root}/{file}"; if (File.Exists(fullpath)) { byte[] data = null; try { data = File.ReadAllBytes(fullpath); } catch (Exception ex) { _logger?.LogError(ex, ex.Message); continue; } client.WriteServiceData(new InvokeResult { Success = true, Data = file }); client.Write(data.Length); client.Write(data); client.ReadServiceObject <InvokeResult>(); } } } _waitObj.WaitOne(38000); } } catch (Exception ex) { throw; } finally { SystemEventCenter.ShareFileChanged -= SystemEventCenter_ShareFileChanged; } }
void toBeMaster() { /* * 申请成为master --> * 成为master --> 维持心跳 --> 心跳断开后 -->重新连接裁判机申请成为master * -->还是master ... * -->如果不再是master --> 断开连接的所有微服务 * 不能成为master --> 和master维持心跳 --> 心跳断开后 -->重新连接裁判机申请成为master */ NetAddress masterAddr = null; while (true) { try { if (!this.IsMaster) { _lockKeyManager.IsReady = false; } using (var client = new NetClient(_refereeAddress)) { client.WriteServiceData(new GatewayCommand { Type = CommandType.ApplyToBeMaster, Content = _gateway.Port.ToString() }); var ret = client.ReadServiceObject <InvokeResult <string> >(); _logger?.LogInformation("与裁判连接成功,裁判返回数据:{0}", ret.Data); if (ret.Success) { masterAddr = null; if (this.IsMaster == false) { _logger?.LogInformation("成为主网关"); _waitServiceList = ret.Data.FromJson <ConcurrentDictionary <string, RegisterServiceLocation> >(); this.IsMaster = true; //等待所有微服务上传locked key var timeout = _lockKeyManager.KeyTimeout / 1000; for (int i = 0; i < timeout && _waitServiceList.Count > 0; i++) { _logger?.LogInformation("还有{0}个微服务没有报到 {1}", _waitServiceList.Count, _waitServiceList.Keys.ToArray().ToJsonString()); Thread.Sleep(1000); } _lockKeyManager.IsReady = true; if (_waitServiceList.Count > 0) { _logger?.LogInformation("还有{0}个微服务没有报到,但被忽略了。", _waitServiceList.Count); } _logger?.LogInformation("lockKeyManager就绪"); _logger?.LogDebug("锁记录:{0}", _lockKeyManager.GetCaches().ToJsonString()); } client.KeepHeartBeating(); _logger?.LogInformation("与裁判的连接断开"); } else { if (this.IsMaster) { this.IsMaster = false; _lockKeyManager.IsReady = false; //不是主网关,需要断开所有微服务 var allservices = _gateway.OnlineMicroServices.ToArray(); foreach (var s in allservices) { s.Close(); } } //另一个网关成为主网关 masterAddr = ret.Data.FromJson <NetAddress>(); } } if (masterAddr != null) { _logger?.LogInformation("准备和主网关连接{0}", masterAddr.ToJsonString()); //连上主网关,直到连接出现问题,再申请成为主网关 using (var client = new NetClient(masterAddr)) { _logger?.LogInformation("与主网关连接心跳"); client.KeepHeartBeating(); Thread.Sleep(100); _logger?.LogInformation("与主网关连接断开"); } } } catch (SocketException) { Thread.Sleep(2000); } catch (Exception ex) { Thread.Sleep(2000); _logger?.LogError(ex, ex.Message); } } }