ApiStationData.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Linq;
  4. using Newtonsoft.Json;
  5. using Sers.Core.Module.Api.ApiDesc;
  6. using Sers.Core.Module.Counter;
  7. using Sers.ServiceCenter.Entity;
  8. using Vit.Core.Util.Extensible;
  9. using Vit.Extensions;
  10. namespace Sers.Gover.Base.Model
  11. {
  12. [JsonObject(MemberSerialization.OptIn)]
  13. public class ApiStationData : Extensible
  14. {
  15. [JsonProperty]
  16. public string stationName;
  17. [JsonProperty]
  18. public int apiServiceCount => apiServices.Count;
  19. [JsonProperty]
  20. public int apiNodeCount => apiServices.Values.Sum((apiService=>apiService.apiNodeCount));
  21. [JsonProperty]
  22. public int activeApiNodeCount =>
  23. apiServices.Values.SelectMany(m => m.apiNodes).Count((apiNode) => apiNode.Status_Get() == EServiceStationStatus.正常);
  24. [JsonProperty]
  25. public EServiceStationStatus eStatus
  26. {
  27. get { return this.GetDataByConvert<EServiceStationStatus?>("status")??EServiceStationStatus.正常; }
  28. set { this.SetData("status", value); }
  29. }
  30. [JsonProperty]
  31. public string status => eStatus.ToString();
  32. public bool IsActive()
  33. {
  34. return eStatus == EServiceStationStatus.正常;
  35. }
  36. /// <summary>
  37. /// route ApiService
  38. /// </summary>
  39. [JsonIgnore]
  40. public ConcurrentDictionary<string, ApiService> apiServices = new ConcurrentDictionary<string, ApiService>();
  41. #region counter
  42. [JsonIgnore]
  43. private Counter _counter;
  44. [JsonProperty]
  45. public Counter counter { get => (_counter ?? (_counter = new Counter())); set => _counter = value; }
  46. #endregion
  47. #region QpsCacl
  48. /// <summary>
  49. ///
  50. /// </summary>
  51. [JsonProperty]
  52. public float qps { get; private set; } = 0;
  53. private DateTime? qps_TimeLast = null;
  54. private int qps_SumCountLast = 0;
  55. public void QpsCalc()
  56. {
  57. var curSumCount = counter.sumCount;
  58. var curTime = DateTime.Now;
  59. if (qps_TimeLast != null)
  60. {
  61. qps = ((int)(100000.0f * (curSumCount - qps_SumCountLast) / (curTime - qps_TimeLast.Value).TotalMilliseconds))/100f;
  62. }
  63. qps_TimeLast = curTime;
  64. qps_SumCountLast = curSumCount;
  65. }
  66. #endregion
  67. ApiService InitApiService(ApiService apiService)
  68. {
  69. apiService.counter.ReportTo(counter);
  70. return apiService;
  71. }
  72. public ApiService ApiService_Remove(string serviceKey)
  73. {
  74. if (apiServices.TryRemove(serviceKey, out var apiService)) return apiService;
  75. return null;
  76. }
  77. public ApiService ApiService_Get(string serviceKey)
  78. {
  79. if (apiServices.TryGetValue(serviceKey, out var apiService)) return apiService;
  80. return null;
  81. }
  82. public ApiService ApiService_GetOrAdd(SsApiDesc apiDesc)
  83. {
  84. var apiService = apiServices.GetOrAdd(apiDesc.ServiceKeyGet(), (n) => { return InitApiService(new ApiService { apiDesc = apiDesc }); });
  85. return apiService;
  86. }
  87. #region ApiNode
  88. public void ApiNode_Add(ApiNode apiNode)
  89. {
  90. var apiService = ApiService_GetOrAdd(apiNode.apiDesc);
  91. apiService.AddApiNode(apiNode);
  92. }
  93. public void ApiNode_Remove(ApiNode apiNode)
  94. {
  95. var apiService = apiNode.apiService;
  96. //if (!apiServices.TryGetValue(route, out var apiService))
  97. //{
  98. // return;
  99. //}
  100. if (null == apiService) return;
  101. apiService.RemoveApiNode(apiNode);
  102. //if (apiService.apiNodeCount == 0)
  103. //{
  104. // apiServices.TryRemove(route, out _);
  105. //}
  106. }
  107. #endregion
  108. }
  109. }