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); })); }