GrpcClientApp.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Grpc.Extension.Abstract;
  2. using Grpc.Extension.Common.Internal;
  3. using Microsoft.Extensions.Configuration;
  4. using Microsoft.Extensions.Logging;
  5. using Microsoft.Extensions.Options;
  6. using OpenTracing;
  7. using OpenTracing.Util;
  8. using System;
  9. namespace Grpc.Extension.Client
  10. {
  11. /// <summary>
  12. /// GrpcClient启动类
  13. /// </summary>
  14. public class GrpcClientApp
  15. {
  16. private readonly GrpcClientOptions _grpcClientOptions;
  17. private readonly ILoggerFactory _loggerFactory;
  18. /// <summary>
  19. /// GrpcClientApp
  20. /// </summary>
  21. /// <param name="serviceProvider"></param>
  22. /// <param name="grpcClientOptions"></param>
  23. /// <param name="loggerFactory"></param>
  24. public GrpcClientApp(IServiceProvider serviceProvider, IOptions<GrpcClientOptions> grpcClientOptions, ILoggerFactory loggerFactory)
  25. {
  26. ServiceProviderAccessor.SetServiceProvider(serviceProvider);
  27. _grpcClientOptions = grpcClientOptions.Value;
  28. _loggerFactory = loggerFactory;
  29. this.UseLoggerFactory()//使用LoggerFactory
  30. .UseJaeger();
  31. }
  32. /// <summary>
  33. /// 注入Grpc,Discovery配制
  34. /// </summary>
  35. /// <param name="options"></param>
  36. /// <returns></returns>
  37. public GrpcClientApp UseGrpcOptions(Action<GrpcClientOptions> options)
  38. {
  39. options(_grpcClientOptions);
  40. return this;
  41. }
  42. /// <summary>
  43. /// 使用LoggerFactory
  44. /// </summary>
  45. /// <returns></returns>
  46. private GrpcClientApp UseLoggerFactory()
  47. {
  48. var _logger = _loggerFactory.CreateLogger<GrpcClientApp>();
  49. var _loggerAccess = _loggerFactory.CreateLogger("grpc.access");
  50. LoggerAccessor.Instance.LoggerError += (ex, type) => _logger.LogError(ex.ToString());
  51. LoggerAccessor.Instance.LoggerMonitor += (msg, type) => _loggerAccess.LogInformation(msg);
  52. return this;
  53. }
  54. /// <summary>
  55. /// 配制日志(默认使用LoggerFactory)
  56. /// </summary>
  57. /// <param name="action"></param>
  58. /// <returns></returns>
  59. public GrpcClientApp UseLogger(Action<LoggerAccessor> action)
  60. {
  61. action(LoggerAccessor.Instance);
  62. return this;
  63. }
  64. /// <summary>
  65. /// 有Jaeger配制就使用Jaeger
  66. /// </summary>
  67. private void UseJaeger()
  68. {
  69. var jaeger = _grpcClientOptions.Jaeger;
  70. if (jaeger?.CheckConfig() == true)
  71. {
  72. var tracer = ServiceProviderAccessor.GetService<ITracer>();
  73. if (tracer != null) GlobalTracer.Register(tracer);
  74. }
  75. }
  76. /// <summary>
  77. /// 启动
  78. /// </summary>
  79. public void Run()
  80. {
  81. //检查服务发现配制
  82. if (string.IsNullOrWhiteSpace(_grpcClientOptions.DiscoveryUrl))
  83. throw new ArgumentException("GrpcClient:DiscoveryUrl is null");
  84. }
  85. }
  86. }