/// <summary> /// Create status service /// </summary> /// <param name="clientConfiguration"></param> /// <param name="invoker"></param> /// <returns></returns> private IStatusService CreateStatusService(GrpcClientConfiguration clientConfiguration, CallInvoker invoker) { // get build method var methodBuild = typeof(GrpcClientFactoryUtil). GetMethod(nameof(GrpcClientFactoryUtil.Create), BindingFlags.Static | BindingFlags.NonPublic).MakeGenericMethod(typeof(IStatusService)); // create status service with custom invoker var statusService = (IStatusService)methodBuild.Invoke(null, new object[] { invoker, clientConfiguration }); // return return(statusService); }
/// <summary> /// Build client /// </summary> /// <typeparam name="TService"></typeparam> /// <param name="invoker"></param> /// <param name="configuration"></param> /// <returns></returns> internal static TService Create <TService>(CallInvoker invoker, GrpcClientConfiguration configuration) where TService : class { // protofiles generated client if (typeof(TService).GetInheritanceHierarchy().Any(t => t == typeof(ClientBase))) { return(CreateProtoClient <TService>(invoker, configuration.Name)); } else { // internally build client from interface return(CreateInterfaceClient <TService>(invoker, configuration.Name)); } }
/// <summary> /// Constructor /// </summary> /// <param name="logger"></param> /// <param name="clientConfiguration"></param> /// <param name="connectionInfoList"></param> /// <param name="channelCustomSelector"></param> public ManagedCallInvoker(ILogger logger, GrpcClientConfiguration clientConfiguration, List <GrpcChannelConnectionData> connectionInfoList, Func <object, string, string, string> channelCustomSelector = null) { // set properteis _configuration = clientConfiguration; _logger = logger; _channelCustomSelector = channelCustomSelector; // create invoke bundles Invokers = connectionInfoList.Select(options => { var ch = new Channel(options.Url, options.Port, ChannelCredentials.Insecure); var inv = new DefaultCallInvoker(ch); var bundle = new InvokerBundle(ch, inv, options); return(bundle); }).ToList(); // setup round robin _roundRobin = new RoundRobinPolicy <InvokerBundle>(Invokers, GetScore); }
/// <summary> /// Constructor /// </summary> /// <param name="clientConfiguration"></param> /// <param name="serviceProvider"></param> internal GrpcClientManager(GrpcClientConfiguration clientConfiguration, IServiceProvider serviceProvider) { // save cofniguration _clientConfiguration = clientConfiguration; // create call invoker var logger = serviceProvider.GetService <ILoggerFactory>()?.CreateLogger("GrpcClientRequests"); _callInvoker = new ManagedCallInvoker(logger, clientConfiguration, _clientConfiguration.Hosts, StatusServiceChannelCustomSelector); // create status service client if required if (_clientConfiguration.Options.StatusServiceEnabled) { _statusService = CreateStatusService(clientConfiguration, _callInvoker); } // reset channels ResetChannels(); // run monitor RunMonitor(); }