MetaServiceAspnetCore.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using Grpc.Core;
  6. using Grpc.Extension.BaseService.Model;
  7. using System.Linq;
  8. using Grpc.Extension.Common;
  9. using Microsoft.Extensions.DependencyInjection;
  10. using TEAMModelOS.SDK.Extension;
  11. using System.Text.Json;
  12. namespace Grpc.Extension.BaseService
  13. {
  14. /// <summary>
  15. /// Grpc元数据服务
  16. /// </summary>
  17. public class MetaServiceAspnetCore : IGrpcBaseService
  18. {
  19. private readonly IServiceProvider _serviceProvider;
  20. public MetaServiceAspnetCore(IServiceProvider serviceProvider)
  21. {
  22. _serviceProvider = serviceProvider;
  23. }
  24. /// <summary>
  25. /// 服务基本信息
  26. /// </summary>
  27. public Task<InfoRS> Info(InfoRQ rq, ServerCallContext context)
  28. {
  29. return Task.Run(() =>
  30. {
  31. var methods = MetaModel.Methods.Select(q => q.FullName?.Trim()).ToList();
  32. if (!string.IsNullOrWhiteSpace(rq.MethodName))
  33. {
  34. methods = methods?.Where(q => q.ToLower().Contains(rq.MethodName.Trim().ToLower())).ToList();
  35. }
  36. var methodInfos = new List<GrpcMethodInfo>();
  37. foreach (var m in methods)
  38. {
  39. var info = new GrpcMethodInfo { Name = m };
  40. info.IsThrottled = ThrottleManager.Instance.IsThrottled(m);
  41. info.SaveResponseEnable = MonitorManager.Instance.SaveResponseMethodEnable(m);
  42. methodInfos.Add(info);
  43. }
  44. return new InfoRS
  45. {
  46. IpAndPort = $"{MetaModel.Ip}:{MetaModel.Port}",
  47. StartTime = MetaModel.StartTime.ToUnixTimestamp(),
  48. MethodInfos = methodInfos
  49. };
  50. });
  51. }
  52. /// <summary>
  53. /// 服务方法的详细信息
  54. /// </summary>
  55. public Task<MethodInfoRS> MethodInfo(MethodInfoRQ rq, ServerCallContext context)
  56. {
  57. return Task.Run(() =>
  58. {
  59. var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
  60. if (methodInfo == null)
  61. {
  62. return new MethodInfoRS();
  63. }
  64. return new MethodInfoRS
  65. {
  66. RequestJson = Activator.CreateInstance(methodInfo.RequestType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false }),
  67. ResponseJson = Activator.CreateInstance(methodInfo.ResponseType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false })
  68. };
  69. });
  70. }
  71. //TODO 此段代碼後續檢視(重複方法)
  72. /// <summary>
  73. /// 服务方法调用
  74. /// </summary>
  75. //public Task<MethodInvokeRS> MethodInvoke(MethodInvokeRQ rq, ServerCallContext context)
  76. //{
  77. // return Task.Run(() =>
  78. // {
  79. // var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
  80. // if (methodInfo == null)
  81. // {
  82. // return new MethodInvokeRS() { ResponseJson = $"not fount method by fullname:{rq.FullName}" };
  83. // }
  84. // var service = ActivatorUtilities.CreateInstance(_serviceProvider, methodInfo.ServiceType);
  85. // var task = (Task)methodInfo.Handler.DynamicInvoke(service, rq.RequestJson?.Trim().FromJson(methodInfo.RequestType), context);
  86. // task.Wait();
  87. // dynamic result = task;
  88. // return new MethodInvokeRS { ResponseJson = ((object)result.Result).ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false });
  89. // });
  90. //}
  91. }
  92. }