Exemple #1
0
    /// <summary>
    /// 注册Grpc服务(跨微服务之间的同步通讯)
    /// </summary>
    /// <typeparam name="TRpcService">Rpc服务接口</typeparam>
    /// <param name="serviceName">在注册中心注册的服务名称,或者服务的Url</param>
    /// <param name="policies">Polly策略</param>
    protected virtual void AddGrpcClient <TGrpcClient>(string serviceName, List <IAsyncPolicy <HttpResponseMessage> > policies)
        where TGrpcClient : class
    {
        var addressNode = RpcAddressInfo.FirstOrDefault(x => x.Service.EqualsIgnoreCase(serviceName));

        if (addressNode is null)
        {
            throw new NullReferenceException(nameof(addressNode));
        }

        Services.TryAddScoped <CacheDelegatingHandler>();
        Services.TryAddScoped <TokenDelegatingHandler>();
        Services.TryAddScoped <ConsulDiscoverDelegatingHandler>();
        Services.TryAddScoped <TokenFactory>();

        var registeredType = Configuration.GetRegisteredType().ToLower();
        var switchName     = "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport";
        var switchResult   = AppContext.TryGetSwitch(switchName, out bool isEnabled);

        if (!switchResult || !isEnabled)
        {
            AppContext.SetSwitch(switchName, true);
        }

        var baseAddress = string.Empty;

        switch (registeredType)
        {
        case RegisteredTypeConsts.Direct:
        {
            var restBaseAddress = new Uri(addressNode.Direct);
            baseAddress = $"{restBaseAddress.Scheme}://{restBaseAddress.Host}:{restBaseAddress.Port + 1}";
            break;
        }

        case RegisteredTypeConsts.ClusterIP:
        {
            baseAddress = addressNode.CoreDns.Replace("http://", "dns://").Replace("https://", "dns://");
            break;
        }

        case RegisteredTypeConsts.Consul:
        {
            baseAddress = addressNode.Consul.Replace("http://", "consul://").Replace("https://", "consul://");
            Services.TryAddSingleton <ResolverFactory, ConsulGrpcResolverFactory>();
            break;
        }
        }

        Services.AddGrpcClient <TGrpcClient>(options => options.Address = new Uri(baseAddress))
        .ConfigureChannel(options =>
        {
            options.Credentials   = ChannelCredentials.Insecure;
            options.ServiceConfig = new ServiceConfig {
                LoadBalancingConfigs = { new RoundRobinConfig() }
            };
        })
        .AddHttpMessageHandler <TokenDelegatingHandler>()
        .AddPolicyHandlerICollection(policies);
    }
Exemple #2
0
    /// <summary>
    /// 注册Rest服务(跨微服务之间的同步通讯)
    /// </summary>
    /// <typeparam name="TRestClient">Rpc服务接口</typeparam>
    /// <param name="serviceName">在注册中心注册的服务名称,或者服务的Url</param>
    /// <param name="policies">Polly策略</param>
    protected virtual void AddRestClient <TRestClient>(string serviceName, List <IAsyncPolicy <HttpResponseMessage> > policies)
        where TRestClient : class
    {
        var addressNode = RpcAddressInfo.FirstOrDefault(x => x.Service.EqualsIgnoreCase(serviceName));

        if (addressNode is null)
        {
            throw new NullReferenceException(nameof(addressNode));
        }

        Services.TryAddScoped <CacheDelegatingHandler>();
        Services.TryAddScoped <TokenDelegatingHandler>();
        Services.TryAddScoped <ConsulDiscoverDelegatingHandler>();
        Services.TryAddScoped <TokenFactory>();

        var registeredType = Configuration.GetRegisteredType().ToLower();
        //注册RefitClient,设置httpclient生命周期时间,默认也是2分钟。
        var contentSerializer = new SystemTextJsonContentSerializer(SystemTextJson.GetAdncDefaultOptions());
        var refitSettings     = new RefitSettings(contentSerializer);
        var clientbuilder     = Services.AddRefitClient <TRestClient>(refitSettings)
                                .SetHandlerLifetime(TimeSpan.FromMinutes(2))
                                .AddPolicyHandlerICollection(policies)
                                //.UseHttpClientMetrics()
                                .AddHttpMessageHandler <CacheDelegatingHandler>()
                                .AddHttpMessageHandler <TokenDelegatingHandler>();

        switch (registeredType)
        {
        case RegisteredTypeConsts.Direct:
        {
            clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.Direct));
            break;
        }

        case RegisteredTypeConsts.ClusterIP:
        {
            clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.CoreDns));
            break;
        }

        case RegisteredTypeConsts.Consul:
        {
            clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.Consul))
            .AddHttpMessageHandler <ConsulDiscoverDelegatingHandler>();
            break;
        }
        }
    }