public IActionResult reportServerChanged([FromRoute] string id, [FromBody] proxyNettyServer server) { if (localRunServer.Instance.ownServer.id != id) { return(FailedMsg("错误的Id,与请求服务器不符")); } if (localRunServer.Instance.zoneRole != ServerRoleEnum.zoneMaster) { return(FailedMsg("I am not a master server")); } var oldserver = localRunServer.Instance.ownCluster.getzoneServerById(server.id); if (oldserver == null) { if (localRunServer.Instance.ownCluster.slave == null) { localRunServer.Instance.ownCluster.setSlave(server); } else { localRunServer.Instance.ownCluster.addRepetion(server); } } else { oldserver = server; } var o = new { Actiondo = (int)enum_Actiondo.needRsycOneServer, url = localRunServer.Instance.ownServer.serviceUrl, region = localRunServer.Instance.region, zone = localRunServer.Instance.zone, id = server.id }; actionMessage am = new actionMessage(enum_Actiondo.needNoticeServer, localRunServer.Instance.ownServer.id, localRunServer.Instance.region, "", "", JsonConvert.SerializeObject(o)); localRunServer.Instance.addActions(am); return(SuccessMsg()); }
/// <summary> /// 代理服务器监测转发服务组 /// </summary> private void checkMapGroup(proxyNettyServer server) { if (server.checkMapGroupChange()) { actionMessage am = new actionMessage(enum_Actiondo.ServerChanged, ownServer.id, region, "", "", JsonConvert.SerializeObject(new { url = ownServer.serviceUrl, region = region, zone = zoneclusterId, id = server.id })); addActions(am); } }
public IActionResult NoticeServer([FromRoute] string id, [FromBody] actionMessage am) { if (localRunServer.Instance.ownServer.id != id) { return(FailedMsg("错误的Id,与请求服务器不符")); } else { localRunServer.Instance.addActions(am); return(SuccessMsg("ok")); } }
public void addActions(actionMessage am) { if (am.action == enum_Actiondo.ServerChanged) { var count = (from x in messagesNeedAction where x.action == enum_Actiondo.ServerChanged select x).Count(); if (count > 0) { return; } } messagesNeedAction.Add(am); }
public void noticeServerWithMessage(string url, string noticeId, actionMessage am) { var respone = hclient.doAsycHttpRequest(string.Format(zoneMasterNoticeUrl, url, noticeId), JObject.FromObject(am), false, url.ToLower().StartsWith("https")); if (respone.IsSuccessStatusCode) { return; } else { FrmLib.Log.commLoger.runLoger.Error(string.Format("server {0} noticeServerWithMessage {1} error ,resopne:{2}", ownServer.id, url, respone.ToString())); } }
/// <summary> /// 检查单台服务器,失联时间超过remove时间,移除并不在检查;小于移除时间大于失效时间,设置失效状态,但进行检查 /// </summary> /// <param name="server"></param> private void checkOneProxyServer(proxyNettyServer server) { if (server == null) { return; } if (server.id == ownServer.id) { return; } if (server.status == serverStatusEnum.Disable) { return; } var ts = (DateTime.Now - server.lastLive).TotalSeconds; var oldstatus = server.status; if (ts > this.serverRemoveTimes) { //should remove server Console.WriteLine("checkOneProxyServer server set Disable "); server.setStatus(serverStatusEnum.Disable); } else { if (ts > this.serverFailTimes) { var sid = _rsycClient.getEchoServerId(server.serviceUrl); if (sid == server.id) { Console.WriteLine("checkOneProxyServer server set ready "); server.lastLive = DateTime.Now; server.setStatus(serverStatusEnum.Ready); } else { Console.WriteLine("checkOneProxyServer server set fail "); server.setStatus(serverStatusEnum.Fail); } } } if (oldstatus != server.status) { Console.WriteLine("checkOneProxyServer server add actions "); actionMessage am = new actionMessage(enum_Actiondo.ServerChanged, ownServer.id, region, "", "", JsonConvert.SerializeObject(new { url = ownServer.serviceUrl, region = region, zone = zoneclusterId, id = server.id })); addActions(am); } }
/// <summary> /// 通知服务器列表重新设置集群主服务器 /// </summary> /// <param name="noticeList">被通知列表</param> /// <param name="masterServer">集群主服务器</param> public void noticeZoneSetMaster(IList <proxyNettyServer> noticeList, proxyNettyServer masterServer) { foreach (var one in noticeList) { if (one.id == ownServer.id) { continue; } var jobj = (new JObject()); jobj.Add("url", masterServer.serviceUrl); actionMessage am = new actionMessage(enum_Actiondo.noticeToRsycZoneMaster, ownServer.id, this.region, one.id, this.region, jobj.ToString()); var respone = hclient.doAsycHttpRequest(string.Format(zoneMasterNoticeUrl, one.serviceUrl, one.id), JObject.FromObject(am), false, one.serviceUrl.ToLower().StartsWith("https")); if (respone.IsSuccessStatusCode) { continue; } else { FrmLib.Log.commLoger.runLoger.Error(string.Format("server {0} noticeZoneSetMaster {1} error ,resopne:{2}", ownServer.id, one.serviceUrl, respone.ToString())); } } }
/// <summary> /// actionMessage 处理器 /// </summary> /// <param name="state"></param> /// <param name="e"></param> private void triggerActionMessageProcesser(Object state, System.Timers.ElapsedEventArgs e) { if (actionPNowDo) { return; } lock (actionLockobj) { if (!actionPNowDo) { actionPNowDo = true; } } IList <actionMessage> processlist; lock (messagesNeedAction) { processlist = messagesNeedAction; messagesNeedAction = new List <actionMessage>(); } try { while (processlist.Count > 0) { var one = processlist[0]; switch (one.action) { case (enum_Actiondo.noticeToRsycZoneMaster): break; case (enum_Actiondo.noticeToRsycRegionMaster): break; case (enum_Actiondo.broadcastFromRegionMaster): break; case (enum_Actiondo.resetZoneMasterServer): break; case (enum_Actiondo.resetZoneServers): break; case (enum_Actiondo.resetRegionMasterServer): break; case (enum_Actiondo.resetRegionServers): break; case (enum_Actiondo.resetRegionZones): break; case (enum_Actiondo.serverAdd): case (enum_Actiondo.ServerChanged): if (zoneRole != ServerRoleEnum.zoneMaster) { _rsycClient.reportMyChangeToMaster(); } break; case (enum_Actiondo.serverRemove): break; case (enum_Actiondo.needNoticeServer): if (zoneRole == ServerRoleEnum.zoneMaster) { actionMessage am = new actionMessage(enum_Actiondo.needRsycOneServer, ownServer.id, region, null, null, one.messageParam); if (ownCluster.slave != null) { _rsycClient.noticeServerWithMessage(ownCluster.slave.serviceUrl, ownCluster.slave.id, am); } foreach (var obj in ownCluster.repetionList) { _rsycClient.noticeServerWithMessage(obj.serviceUrl, obj.id, am); } } break; case (enum_Actiondo.needRsycOneServer): if (zoneRole != ServerRoleEnum.zoneMaster) { var jobj = JObject.Parse(one.messageParam); var url = jobj["url"].ToString(); var region = jobj["region"].ToString(); var zone = jobj["zone"].ToString(); var id = jobj["id"].ToString(); var newserver = _rsycClient.getServer(url, id, region, zone); if (newserver == null || newserver.id == ownServer.id) { return; } var oldserver = ownCluster.getzoneServerById(newserver.id); if (oldserver != null) { oldserver = newserver; } else { if (ownCluster.slave == null) { ownCluster.setSlave(newserver); } else { ownCluster.addRepetion(newserver); } } } break; } processlist.Remove(one); } } catch (Exception ex) { } finally { actionPNowDo = false; } }