diff --git a/src/Grpc.Extension/Internal/AutoChannelCallInvoker.cs b/src/Grpc.Extension/Internal/AutoChannelCallInvoker.cs index 412231d..062e7e5 100644 --- a/src/Grpc.Extension/Internal/AutoChannelCallInvoker.cs +++ b/src/Grpc.Extension/Internal/AutoChannelCallInvoker.cs @@ -12,12 +12,12 @@ namespace Grpc.Extension.Internal /// internal class AutoChannelCallInvoker : CallInvoker { - private ChannelManager _channelManager; + private ChannelPool _channelManager; /// /// 自动负载Channel的CallInvoker /// - public AutoChannelCallInvoker(ChannelManager channelManager) + public AutoChannelCallInvoker(ChannelPool channelManager) { this._channelManager = channelManager; } diff --git a/src/Grpc.Extension/Internal/ChannelManager.cs b/src/Grpc.Extension/Internal/ChannelPool.cs similarity index 97% rename from src/Grpc.Extension/Internal/ChannelManager.cs rename to src/Grpc.Extension/Internal/ChannelPool.cs index ade3712..5b682ef 100644 --- a/src/Grpc.Extension/Internal/ChannelManager.cs +++ b/src/Grpc.Extension/Internal/ChannelPool.cs @@ -13,7 +13,7 @@ namespace Grpc.Extension.Internal /// /// Channel统一管理 /// - internal class ChannelManager + internal class ChannelPool { private ConcurrentDictionary _channels = new ConcurrentDictionary(); private IServiceDiscovery _serviceDiscovery; @@ -25,7 +25,7 @@ internal class ChannelManager /// /// /// - public ChannelManager(IServiceDiscovery serviceDiscovery, ILoadBalancer loadBalancer,IMemoryCache memoryCache) + public ChannelPool(IServiceDiscovery serviceDiscovery, ILoadBalancer loadBalancer,IMemoryCache memoryCache) { this._serviceDiscovery = serviceDiscovery; this._loadBalancer = loadBalancer; @@ -99,7 +99,7 @@ private Channel GetChannelCore(string endpoint,ChannelConfig config) private ChannelInfo CreateChannel(string endPoint, ChannelConfig config) { - var channel = new Channel(endPoint, ChannelCredentials.Insecure); + var channel = new Channel(endPoint, ChannelCredentials.Insecure, config.ChannelOptions); var tryCount = 0;//重试计数 //检查channel状态 diff --git a/src/Grpc.Extension/Internal/GrpcClientManager.cs b/src/Grpc.Extension/Internal/GrpcClientManager.cs index cc6ce77..55aa1af 100644 --- a/src/Grpc.Extension/Internal/GrpcClientManager.cs +++ b/src/Grpc.Extension/Internal/GrpcClientManager.cs @@ -35,7 +35,7 @@ public GrpcClientManager(IServiceProvider serviceProvider, IEnumerable public T GetGrpcClient() where T : ClientBase { - var channelManager = GrpcExtensions.ServiceProvider.GetService(); + var channelManager = GrpcExtensions.ServiceProvider.GetService(); var bindFlags = BindingFlags.Static | BindingFlags.NonPublic; var grpcServiceName = typeof(T).DeclaringType.GetFieldValue("__ServiceName", bindFlags); diff --git a/src/Grpc.Extension/Internal/ServerBuilder.cs b/src/Grpc.Extension/Internal/ServerBuilder.cs index ecc8db0..07de88d 100644 --- a/src/Grpc.Extension/Internal/ServerBuilder.cs +++ b/src/Grpc.Extension/Internal/ServerBuilder.cs @@ -201,7 +201,7 @@ private void CheckUseJaeger() /// public Server Build() { - Server server = new Server(); + Server server = new Server(GrpcServerOptions.Instance.ChannelOptions); //使用拦截器 var serviceDefinitions = ApplyInterceptor(_serviceDefinitions, _interceptors); //添加服务定义 diff --git a/src/Grpc.Extension/Model/ChannelConfig.cs b/src/Grpc.Extension/Model/ChannelConfig.cs index 79d78d1..4c6550e 100644 --- a/src/Grpc.Extension/Model/ChannelConfig.cs +++ b/src/Grpc.Extension/Model/ChannelConfig.cs @@ -1,4 +1,5 @@ -using System; +using Grpc.Core; +using System.Collections.Generic; namespace Grpc.Extension.Model { @@ -7,14 +8,34 @@ namespace Grpc.Extension.Model /// internal class ChannelConfig { + /// + /// Discovery的服务器地址 + /// public string DiscoveryUrl { get; set; } + /// + /// Discovery上客户端服务名字 + /// public string DiscoveryServiceName { get; set; } + /// + /// 直接服务地址,不用服务现 + /// public string DirectEndpoint { get; set; } + /// + /// 是否使用直接服务地址 + /// public bool UseDirect { get; set; } - public string GrpcServiceName { get; set; } + /// + /// ChannelOption + /// + public IEnumerable ChannelOptions { get; set; } + + /// + /// GrpcServiceName + /// + internal string GrpcServiceName { get; set; } } } diff --git a/src/Grpc.Extension/Options/GrpcServerOptions.cs b/src/Grpc.Extension/Options/GrpcServerOptions.cs index 2372fd7..e384616 100644 --- a/src/Grpc.Extension/Options/GrpcServerOptions.cs +++ b/src/Grpc.Extension/Options/GrpcServerOptions.cs @@ -1,4 +1,5 @@ -using System; +using Grpc.Core; +using System; using System.Collections.Generic; using System.Text; @@ -45,6 +46,11 @@ internal static GrpcServerOptions Instance /// public int DefaultErrorCode { get; set; } = 1; + /// + /// ChannelOption + /// + public IEnumerable ChannelOptions { get; set; } + #region 兼容老版本 /* /// diff --git a/src/Grpc.Extension/ServiceCollectionExtensions.cs b/src/Grpc.Extension/ServiceCollectionExtensions.cs index 297cd2b..b4e3d4e 100644 --- a/src/Grpc.Extension/ServiceCollectionExtensions.cs +++ b/src/Grpc.Extension/ServiceCollectionExtensions.cs @@ -54,7 +54,7 @@ public static IServiceCollection AddGrpcClientExtensions(this IServiceCollection services.AddSingleton(); services.AddSingleton(); //添加Channel的Manager - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); //默认使用轮询负载策略,在外面可以注入其它策略 @@ -88,20 +88,22 @@ public static IServiceCollection AddGrpcClientExtensions(this IServiceCollection /// /// /// - /// - /// + /// Discovery的服务器地址 + /// Discovery上客户端服务名字 + /// ChannelOption /// - public static IServiceCollection AddGrpcClient(this IServiceCollection services, string discoveryUrl, string discoveryServiceName) where T : ClientBase + public static IServiceCollection AddGrpcClient(this IServiceCollection services, string discoveryUrl, string discoveryServiceName, IEnumerable channelOptions = null) where T : ClientBase { services.AddSingleton(); var channelConfig = new ChannelConfig { DiscoveryUrl = discoveryUrl, - DiscoveryServiceName = discoveryServiceName + DiscoveryServiceName = discoveryServiceName, + ChannelOptions = channelOptions }; var bindFlags = BindingFlags.Static | BindingFlags.NonPublic; channelConfig.GrpcServiceName = typeof(T).DeclaringType.GetFieldValue("__ServiceName", bindFlags); - ChannelManager.Configs.Add(channelConfig); + ChannelPool.Configs.Add(channelConfig); return services; }