using Grpc.Extension.Abstract; using Grpc.Extension.Common.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using OpenTracing; using OpenTracing.Util; using System; namespace Grpc.Extension.Client { /// /// GrpcClient启动类 /// public class GrpcClientApp { private readonly GrpcClientOptions _grpcClientOptions; private readonly ILoggerFactory _loggerFactory; /// /// GrpcClientApp /// /// /// /// public GrpcClientApp(IServiceProvider serviceProvider, IOptions grpcClientOptions, ILoggerFactory loggerFactory) { ServiceProviderAccessor.SetServiceProvider(serviceProvider); _grpcClientOptions = grpcClientOptions.Value; _loggerFactory = loggerFactory; this.UseLoggerFactory()//使用LoggerFactory .UseJaeger(); } /// /// 注入Grpc,Discovery配制 /// /// /// public GrpcClientApp UseGrpcOptions(Action options) { options(_grpcClientOptions); return this; } /// /// 使用LoggerFactory /// /// private GrpcClientApp UseLoggerFactory() { var _logger = _loggerFactory.CreateLogger(); var _loggerAccess = _loggerFactory.CreateLogger("grpc.access"); LoggerAccessor.Instance.LoggerError += (ex, type) => _logger.LogError(ex.ToString()); LoggerAccessor.Instance.LoggerMonitor += (msg, type) => _loggerAccess.LogInformation(msg); return this; } /// /// 配制日志(默认使用LoggerFactory) /// /// /// public GrpcClientApp UseLogger(Action action) { action(LoggerAccessor.Instance); return this; } /// /// 有Jaeger配制就使用Jaeger /// private void UseJaeger() { var jaeger = _grpcClientOptions.Jaeger; if (jaeger?.CheckConfig() == true) { var tracer = ServiceProviderAccessor.GetService(); if (tracer != null) GlobalTracer.Register(tracer); } } /// /// 启动 /// public void Run() { //检查服务发现配制 if (string.IsNullOrWhiteSpace(_grpcClientOptions.DiscoveryUrl)) throw new ArgumentException("GrpcClient:DiscoveryUrl is null"); } } }