ApiStationMng.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Newtonsoft.Json;
  7. using Sers.Core.Module.Api.ApiDesc;
  8. using Sers.Gover.Base.Model;
  9. using Sers.Gover.Persistence;
  10. using Sers.ServiceCenter.Entity;
  11. using Vit.Core.Module.Log;
  12. using Vit.Core.Util.ConfigurationManager;
  13. using Vit.Extensions;
  14. namespace Sers.Gover.Base
  15. {
  16. [JsonObject(MemberSerialization.OptIn)]
  17. public class ApiStationMng
  18. {
  19. [JsonProperty]
  20. ConcurrentDictionary<string, ApiStationData> apiStations;
  21. GoverApiCenterService goverManage;
  22. public ApiStationMng()
  23. {
  24. }
  25. public ApiStationMng Init(GoverApiCenterService goverManage)
  26. {
  27. this.goverManage = goverManage;
  28. if (null == apiStations)
  29. {
  30. apiStations = new ConcurrentDictionary<string, ApiStationData>();
  31. }
  32. return this;
  33. }
  34. #region 查询
  35. public IEnumerable<SsApiDesc> ApiDesc_GetAll()
  36. {
  37. var apiServices = (from apiStation in apiStations.Values
  38. from apiService in apiStation.apiServices.Values
  39. select apiService);
  40. var res = apiServices.Select((apiService)=>
  41. {
  42. var apiDesc = apiService.apiDesc.ConvertBySerialize<SsApiDesc>();
  43. apiDesc.ext = new { apiService.counter};
  44. return apiDesc;
  45. });
  46. return res;
  47. }
  48. #endregion
  49. #region ApiStation
  50. public List<ApiStationData> ApiStation_GetAll()
  51. {
  52. return apiStations.Values.OrderBy(m=>m.stationName).ToList();
  53. }
  54. public bool ApiStation_Pause(string stationName)
  55. {
  56. lock (this)
  57. {
  58. if (!apiStations.TryGetValue(stationName, out var apiStationData))
  59. {
  60. return false;
  61. }
  62. if (apiStationData.eStatus == EServiceStationStatus.暂停)
  63. {
  64. return true;
  65. }
  66. apiStationData.eStatus=EServiceStationStatus.暂停;
  67. foreach (var apiNode in apiStationData.apiServices.Values.SelectMany((m) => m.apiNodes))
  68. {
  69. apiNode.StopReason_Add(goverManage.apiLoadBalancingMng, "stopByApiStation");
  70. }
  71. }
  72. return true;
  73. }
  74. public bool ApiStation_Start(string stationName)
  75. {
  76. lock (this)
  77. {
  78. if (!apiStations.TryGetValue(stationName, out var apiStationData))
  79. {
  80. return false;
  81. }
  82. if (apiStationData.eStatus == EServiceStationStatus.正常)
  83. {
  84. return true;
  85. }
  86. apiStationData.eStatus = EServiceStationStatus.正常;
  87. foreach (var apiNode in apiStationData.apiServices.Values.SelectMany((m)=>m.apiNodes))
  88. {
  89. apiNode.StopReason_Remove(goverManage.apiLoadBalancingMng, "stopByApiStation");
  90. }
  91. }
  92. return true;
  93. }
  94. ApiStationData ApiStation_Get(string route)
  95. {
  96. var stationName = route.Split('/')[1];
  97. if (apiStations.TryGetValue(stationName, out var apiStationData))
  98. {
  99. return apiStationData;
  100. }
  101. return null;
  102. }
  103. public ApiStationData ApiStation_GetOrAddByName(string stationName)
  104. {
  105. return apiStations.GetOrAdd(stationName, (n) => new ApiStationData() { stationName = n });
  106. }
  107. public ApiStationData ApiStation_GetOrAddByRoute(string route)
  108. {
  109. var stationName = route.Split('/')[1];
  110. return ApiStation_GetOrAddByName(stationName);
  111. }
  112. void ApiStation_Remove(ApiStationData apiStation)
  113. {
  114. apiStations.TryRemove(apiStation.stationName,out _);
  115. }
  116. #endregion
  117. #region ApiNode
  118. static bool Config_ApiRegistEvent_Print = (false != ConfigurationManager.Instance.GetByPath<bool?>("Sers.ServiceCenter.ApiRegistEvent_Print"));
  119. void ApiNode_Add(string route, ApiNode apiNode)
  120. {
  121. try
  122. {
  123. if (Config_ApiRegistEvent_Print)
  124. {
  125. Logger.Info("[ApiCenterService]Add ApiNode,serviceKey:" + apiNode.apiDesc.ServiceKeyGet());
  126. }
  127. //ApiStation 添加ApiNode
  128. var apiStation = ApiStation_GetOrAddByRoute(route);
  129. apiStation.ApiNode_Add(apiNode);
  130. if (apiStation.IsActive())
  131. {
  132. apiNode.Start(goverManage.apiLoadBalancingMng);
  133. }
  134. }
  135. catch (Exception ex)
  136. {
  137. Logger.Error(ex);
  138. }
  139. }
  140. void ApiNode_Remove(ApiNode apiNode)
  141. {
  142. var route = apiNode?.apiDesc?.route;
  143. if (string.IsNullOrWhiteSpace(route)) return;
  144. if (Config_ApiRegistEvent_Print)
  145. {
  146. Logger.Info("[ApiCenterService]Remove ApiNode,serviceKey:" + apiNode.apiDesc.ServiceKeyGet());
  147. }
  148. var apiStation = ApiStation_Get(route);
  149. if (apiStation == null) return;
  150. //ApiStation 注销ApiNode
  151. apiStation.ApiNode_Remove(apiNode);
  152. //if (apiStation.apiNodeCount == 0)
  153. //{
  154. // ApiStation_Remove(apiStation);
  155. //}
  156. //ApiLoadBalancingMng 注销ApiNode
  157. apiNode.Stop(goverManage.apiLoadBalancingMng);
  158. }
  159. #endregion
  160. #region ServiceStation
  161. #region ServiceStation_Add
  162. public void ServiceStation_Add(ServiceStation serviceStation)
  163. {
  164. //注册apiNode
  165. lock (this)
  166. {
  167. foreach (var apiNode in serviceStation.apiNodes)
  168. {
  169. var route = apiNode?.apiDesc?.route;
  170. if (string.IsNullOrWhiteSpace(route)) continue;
  171. apiNode.serviceStation = serviceStation;
  172. ApiNode_Add(route, apiNode);
  173. }
  174. }
  175. #region 持久化对应ApiStation中的所有ApiDesc(异步执行)
  176. Task.Run(() =>
  177. {
  178. try
  179. {
  180. foreach (var apiStationName in serviceStation.ApiStationNames_Get())
  181. {
  182. if (apiStations.TryGetValue(apiStationName, out var apiStation))
  183. {
  184. Persistence_ApiDesc.ApiDesc_SaveApiStationToJsonFile(apiStation);
  185. }
  186. }
  187. }
  188. catch (Exception ex)
  189. {
  190. Logger.Error(ex);
  191. }
  192. });
  193. #endregion
  194. }
  195. #endregion
  196. #region ServiceStation_Remove
  197. public void ServiceStation_Remove(ServiceStation serviceStation)
  198. {
  199. lock (this)
  200. {
  201. //注销apiNode
  202. foreach (var apiNode in serviceStation.apiNodes)
  203. {
  204. ApiNode_Remove(apiNode);
  205. }
  206. }
  207. }
  208. #endregion
  209. #region ServiceStation_Pause
  210. public void ServiceStation_Pause(ServiceStation serviceStation)
  211. {
  212. lock (this)
  213. {
  214. foreach (var apiNode in serviceStation.apiNodes)
  215. {
  216. apiNode.StopReason_Add(goverManage.apiLoadBalancingMng, "stopByServiceStation");
  217. }
  218. }
  219. }
  220. #endregion
  221. #region ServiceStation_Start
  222. public void ServiceStation_Start(ServiceStation serviceStation)
  223. {
  224. lock (this)
  225. {
  226. foreach (var apiNode in serviceStation.apiNodes)
  227. {
  228. apiNode.StopReason_Remove(goverManage.apiLoadBalancingMng, "stopByServiceStation");
  229. }
  230. }
  231. }
  232. #endregion
  233. #endregion
  234. }
  235. }