MetaServiceAspnetCore.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. namespace Grpc.Extension.BaseService
  11. {
  12. /// <summary>
  13. /// Grpc元数据服务
  14. /// </summary>
  15. public class MetaServiceAspnetCore : IGrpcBaseService
  16. {
  17. private readonly IServiceProvider _serviceProvider;
  18. public MetaServiceAspnetCore(IServiceProvider serviceProvider)
  19. {
  20. _serviceProvider = serviceProvider;
  21. }
  22. /// <summary>
  23. /// 服务基本信息
  24. /// </summary>
  25. public Task<InfoRS> Info(InfoRQ rq, ServerCallContext context)
  26. {
  27. return Task.Run(() =>
  28. {
  29. var methods = MetaModel.Methods.Select(q => q.FullName?.Trim()).ToList();
  30. if (!string.IsNullOrWhiteSpace(rq.MethodName))
  31. {
  32. methods = methods?.Where(q => q.ToLower().Contains(rq.MethodName.Trim().ToLower())).ToList();
  33. }
  34. var methodInfos = new List<GrpcMethodInfo>();
  35. foreach (var m in methods)
  36. {
  37. var info = new GrpcMethodInfo { Name = m };
  38. info.IsThrottled = ThrottleManager.Instance.IsThrottled(m);
  39. info.SaveResponseEnable = MonitorManager.Instance.SaveResponseMethodEnable(m);
  40. methodInfos.Add(info);
  41. }
  42. return new InfoRS
  43. {
  44. IpAndPort = $"{MetaModel.Ip}:{MetaModel.Port}",
  45. StartTime = MetaModel.StartTime.ToUnixTimestamp(),
  46. MethodInfos = methodInfos
  47. };
  48. });
  49. }
  50. /// <summary>
  51. /// 服务方法的详细信息
  52. /// </summary>
  53. public Task<MethodInfoRS> MethodInfo(MethodInfoRQ rq, ServerCallContext context)
  54. {
  55. return Task.Run(() =>
  56. {
  57. var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
  58. if (methodInfo == null)
  59. {
  60. return new MethodInfoRS();
  61. }
  62. return new MethodInfoRS
  63. {
  64. RequestJson = Activator.CreateInstance(methodInfo.RequestType).FillProp().ToJson(ignoreNullValue: false, isIndented: true),
  65. ResponseJson = Activator.CreateInstance(methodInfo.ResponseType).FillProp().ToJson(ignoreNullValue: false, isIndented: true)
  66. };
  67. });
  68. }
  69. /// <summary>
  70. /// 服务方法调用
  71. /// </summary>
  72. public Task<MethodInvokeRS> MethodInvoke(MethodInvokeRQ rq, ServerCallContext context)
  73. {
  74. return Task.Run(() =>
  75. {
  76. var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
  77. if (methodInfo == null)
  78. {
  79. return new MethodInvokeRS() { ResponseJson = $"not fount method by fullname:{rq.FullName}" };
  80. }
  81. var service = ActivatorUtilities.CreateInstance(_serviceProvider, methodInfo.ServiceType);
  82. var task = (Task)methodInfo.Handler.DynamicInvoke(service, rq.RequestJson?.Trim().FromJson(methodInfo.RequestType), context);
  83. task.Wait();
  84. dynamic result = task;
  85. return new MethodInvokeRS { ResponseJson = ((object)result.Result).ToJson(ignoreNullValue: false, isIndented: true) };
  86. });
  87. }
  88. }
  89. }