private static async Task ServiceDiscoveryAsync(
            this IServiceProvider provider, HttpApiConsulOptions options)
        {
            IConsulClient consul = provider.GetRequiredService <IConsulClient>();

            if (consul == null)
            {
                throw new InvalidOperationException(
                          "没有找到 Consul 客户端,请使用 service.AddConsulClient(); 注入");
            }

            QueryResult <CatalogService[]> service = await consul.Catalog.Service(options.ConsulServiceName);

            if (service.StatusCode == HttpStatusCode.OK && service.Response.Length > 0)
            {
                Random random = new Random(Environment.TickCount);

                int index = random.Next(service.Response.Length);

                CatalogService catalog = service.Response[index];

                UriBuilder builder = new UriBuilder(catalog.ServiceAddress)
                {
                    Port = catalog.ServicePort,
                };

                options.HttpHost = builder.Uri;
            }
        }
        public static IHttpClientBuilder AddHttpApiClient <THttpApi>(
            this IServiceCollection services,
            Action <HttpApiConsulOptions, IServiceProvider> configureOptions)
            where THttpApi : class
        {
            string name = typeof(THttpApi).FullName;

            services
            .AddHttpApi()
            .AddOptions <HttpApiConsulOptions>(name)
            .Configure(configureOptions);

            return(services
                   .AddHttpClient(name)
                   .AddTypedClient((client, provider) =>
            {
                HttpApiConsulOptions options = provider
                                               .GetRequiredService <IOptionsMonitor <HttpApiConsulOptions> >()
                                               .Get(name);

                provider.ServiceDiscoveryAsync(options).Wait();

                return HttpApi.Create <THttpApi>(client, provider, options);
            }));
        }