123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using Newtonsoft.Json;
- using Sers.Core.Module.Api.ApiDesc;
- using Sers.Gover.Base.Model;
- using Sers.Gover.Persistence;
- using Sers.ServiceCenter.Entity;
- using Vit.Core.Module.Log;
- using Vit.Core.Util.ConfigurationManager;
- using Vit.Extensions;
- namespace Sers.Gover.Base
- {
- [JsonObject(MemberSerialization.OptIn)]
- public class ApiStationMng
- {
- [JsonProperty]
- ConcurrentDictionary<string, ApiStationData> apiStations;
- GoverApiCenterService goverManage;
- public ApiStationMng()
- {
- }
- public ApiStationMng Init(GoverApiCenterService goverManage)
- {
- this.goverManage = goverManage;
- if (null == apiStations)
- {
- apiStations = new ConcurrentDictionary<string, ApiStationData>();
- }
- return this;
- }
- #region 查询
- public IEnumerable<SsApiDesc> ApiDesc_GetAll()
- {
- var apiServices = (from apiStation in apiStations.Values
- from apiService in apiStation.apiServices.Values
- select apiService);
- var res = apiServices.Select((apiService)=>
- {
- var apiDesc = apiService.apiDesc.ConvertBySerialize<SsApiDesc>();
- apiDesc.ext = new { apiService.counter};
- return apiDesc;
- });
- return res;
- }
- #endregion
- #region ApiStation
- [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
- public List<ApiStationData> ApiStation_GetAll()
- {
- return apiStations.Values.OrderBy(m=>m.stationName).ToList();
- }
-
- public bool ApiStation_Pause(string stationName)
- {
- lock (this)
- {
- if (!apiStations.TryGetValue(stationName, out var apiStationData))
- {
- return false;
- }
- if (apiStationData.eStatus == EServiceStationStatus.暂停)
- {
- return true;
- }
- apiStationData.eStatus=EServiceStationStatus.暂停;
- foreach (var apiNode in apiStationData.apiServices.Values.SelectMany((m) => m.apiNodes))
- {
- apiNode.StopReason_Add(goverManage.apiLoadBalancingMng, "stopByApiStation");
- }
- }
- return true;
- }
-
- public bool ApiStation_Start(string stationName)
- {
- lock (this)
- {
- if (!apiStations.TryGetValue(stationName, out var apiStationData))
- {
- return false;
- }
- if (apiStationData.eStatus == EServiceStationStatus.正常)
- {
- return true;
- }
- apiStationData.eStatus = EServiceStationStatus.正常;
- foreach (var apiNode in apiStationData.apiServices.Values.SelectMany((m)=>m.apiNodes))
- {
- apiNode.StopReason_Remove(goverManage.apiLoadBalancingMng, "stopByApiStation");
- }
- }
- return true;
- }
- ApiStationData ApiStation_Get(string route)
- {
- var stationName = route.Split('/')[1];
- if (apiStations.TryGetValue(stationName, out var apiStationData))
- {
- return apiStationData;
- }
- return null;
- }
- public ApiStationData ApiStation_GetOrAddByName(string stationName)
- {
- return apiStations.GetOrAdd(stationName, (n) => new ApiStationData() { stationName = n });
- }
- public ApiStationData ApiStation_GetOrAddByRoute(string route)
- {
- var stationName = route.Split('/')[1];
- return ApiStation_GetOrAddByName(stationName);
- }
- void ApiStation_Remove(ApiStationData apiStation)
- {
- apiStations.TryRemove(apiStation.stationName,out _);
- }
- #endregion
- #region ApiService
- /// <summary>
- /// 移除离线的ApiService
- /// </summary>
- public void ApiService_RemoveOffline()
- {
- List<ApiStationData> changedApiStationList;
-
- lock (this)
- {
- var apiServiceItems = (from apiStation in apiStations.Values
- from apiService in apiStation.apiServices.Values
- where apiService.apiNodeCount==0
- select (apiStation,apiService)).ToList();
- foreach (var (apiStation, apiService) in apiServiceItems)
- {
- apiStation.ApiService_Remove(apiService.apiDesc.ServiceKeyGet());
- }
- changedApiStationList = apiServiceItems.Select(m => m.apiStation).Distinct().ToList();
- foreach (var apiStation in changedApiStationList)
- {
- if (apiStation.apiServiceCount == 0)
- {
- ApiStation_Remove(apiStation);
- }
- }
- }
- #region 持久化对应ApiStation中的所有ApiDesc(异步执行)
- Task.Run(() =>
- {
- try
- {
- foreach (var apiStation in changedApiStationList)
- {
- Persistence_ApiDesc.ApiDesc_SaveApiStationToJsonFile(apiStation);
- }
- }
- catch (Exception ex)
- {
- Logger.Error(ex);
- }
- });
- #endregion
- }
- #endregion
- #region ApiNode
- static bool Config_ApiRegistEvent_Print = (false != ConfigurationManager.Instance.GetByPath<bool?>("Sers.ServiceCenter.ApiRegistEvent_Print"));
- void ApiNode_Add(string route, ApiNode apiNode)
- {
- try
- {
- if (Config_ApiRegistEvent_Print)
- {
- Logger.Info("[ApiCenterService]Add ApiNode", apiNode.apiDesc.ServiceKeyGet());
- }
-
- //ApiStation 添加ApiNode
- var apiStation = ApiStation_GetOrAddByRoute(route);
- apiStation.ApiNode_Add(apiNode);
- if (apiStation.IsActive())
- {
- apiNode.Start(goverManage.apiLoadBalancingMng);
- }
- }
- catch (Exception ex)
- {
- Logger.Error(ex);
- }
- }
- void ApiNode_Remove(ApiNode apiNode)
- {
- var route = apiNode?.apiDesc?.route;
- if (string.IsNullOrWhiteSpace(route)) return;
- if (Config_ApiRegistEvent_Print)
- {
- Logger.Info("[ApiCenterService]Remove ApiNode", apiNode.apiDesc.ServiceKeyGet());
- }
- var apiStation = ApiStation_Get(route);
- if (apiStation == null) return;
- //ApiStation 注销ApiNode
- apiStation.ApiNode_Remove(apiNode);
- //if (apiStation.apiNodeCount == 0)
- //{
- // ApiStation_Remove(apiStation);
- //}
- //ApiLoadBalancingMng 注销ApiNode
- apiNode.Stop(goverManage.apiLoadBalancingMng);
- }
-
- #endregion
- #region ServiceStation
- #region ServiceStation_Add
- public void ServiceStation_Add(ServiceStation serviceStation)
- {
- //注册apiNode
- lock (this)
- {
- foreach (var apiNode in serviceStation.apiNodes)
- {
- var route = apiNode?.apiDesc?.route;
- if (string.IsNullOrWhiteSpace(route)) continue;
- apiNode.serviceStation = serviceStation;
- ApiNode_Add(route, apiNode);
- }
- }
- #region 持久化对应ApiStation中的所有ApiDesc(异步执行)
- Task.Run(() =>
- {
- try
- {
- foreach (var apiStationName in serviceStation.ApiStationNames_Get())
- {
- if (apiStations.TryGetValue(apiStationName, out var apiStation))
- {
- Persistence_ApiDesc.ApiDesc_SaveApiStationToJsonFile(apiStation);
- }
- }
- }
- catch (Exception ex)
- {
- Logger.Error(ex);
- }
- });
- #endregion
- }
- #endregion
- #region ServiceStation_Remove
- public void ServiceStation_Remove(ServiceStation serviceStation)
- {
- lock (this)
- {
- //注销apiNode
- foreach (var apiNode in serviceStation.apiNodes)
- {
- ApiNode_Remove(apiNode);
- }
- }
- }
- #endregion
- #region ServiceStation_Pause
- public void ServiceStation_Pause(ServiceStation serviceStation)
- {
- lock (this)
- {
- foreach (var apiNode in serviceStation.apiNodes)
- {
- apiNode.StopReason_Add(goverManage.apiLoadBalancingMng, "stopByServiceStation");
- }
- }
- }
- #endregion
- #region ServiceStation_Start
- public void ServiceStation_Start(ServiceStation serviceStation)
- {
- lock (this)
- {
- foreach (var apiNode in serviceStation.apiNodes)
- {
- apiNode.StopReason_Remove(goverManage.apiLoadBalancingMng, "stopByServiceStation");
- }
- }
- }
- #endregion
- #endregion
- }
- }
|