/// <summary>
        /// 依据服务和负载均衡策略查找可调用的服务
        /// </summary>
        /// <param name="service"></param>
        /// <param name="serviceName">要查找的服务名称</param>
        /// <param name="balanceMethd">所用的负载均衡算法</param>
        /// <param name="httpclientName">polly客户端名称,除非存在多个,否则用more你的就好</param>
        /// <returns></returns>
        public static async Task <HttpClient?> Find(this IConsulDiscoveryService service, string serviceName, LoadBalanceMethod balanceMethd = LoadBalanceMethod.Random, string httpclientName = "micro")
        {
            if (string.IsNullOrEmpty(serviceName))
            {
                throw new ArgumentException("message", nameof(serviceName));
            }
            try
            {
                var factory  = service.ServiceProvider.GetService <IHttpClientFactory>();
                var cataglog = await service.FindBalance(balanceMethd, serviceName);

                if (cataglog != null)
                {
                    var client = factory.CreateClient(httpclientName ?? "micro");
                    client.BaseAddress = new Uri(cataglog.ServiceAddress + ":" + cataglog.ServicePort);
                    return(client);
                }
                else
                {
                    return(null);
                }
            }
            catch (Exception err)
            {
                Debug.WriteLine(err.Message);
                return(null);
            }
        }
        /// <summary>
        /// 查找并使用负载均衡器过滤
        /// </summary>
        /// <param name="service"></param>
        /// <param name="method"></param>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public static async Task <CatalogService?> FindBalance(this IConsulDiscoveryService service, LoadBalanceMethod method, string serviceName)
        {
            if (string.IsNullOrEmpty(serviceName))
            {
                throw new ArgumentException("message", nameof(serviceName));
            }

            var clients = await service.FindAll(serviceName);

            if (clients != null)
            {
                var selector = service.ServiceProvider.GetRequiredService <ILoadBalanceSelector>();
                if (selector == null)
                {
                    return(null);
                }
                var temp = selector.Select(method);
                if (temp != null)
                {
                    return(temp.Select(clients));
                }
                return(null);
            }
            else
            {
                return(null);
            }
        }
示例#3
0
 public PollingConsulDiscoverer(PollingConsulDiscovererOption option, ILogger <PollingConsulDiscoverer> logger, IDistributedCache <List <MicroService> > serviceCache, IConsulDiscoveryService consulDiscoveryService)
 {
     Option                 = option;
     Logger                 = logger;
     ServiceCache           = serviceCache;
     ConsulDiscoveryService = consulDiscoveryService;
 }
        /// <summary>
        /// 查找并使用负载均衡器过滤
        /// </summary>
        /// <param name="service"></param>
        /// <param name="method"></param>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public static async Task <CatalogService> FindBalance(this IConsulDiscoveryService service, LoadBalanceMethod method, string serviceName)
        {
            if (string.IsNullOrEmpty(serviceName))
            {
                throw new ArgumentException("message", nameof(serviceName));
            }

            var clients = await service.FindAll(serviceName);

            var selector = service.ServiceProvider.GetService <ILoadBalanceSelector>();
            var catalog  = selector.Select(method).Select(clients);

            return(catalog);
        }
        /// <summary>
        /// 查找服务
        /// </summary>
        /// <param name="service"></param>
        /// <param name="serviceName">服务名称</param>
        /// <returns></returns>
        public static async Task <IReadOnlyList <CatalogService> > FindAll(this IConsulDiscoveryService service, string serviceName)
        {
            if (service is null)
            {
                throw new ArgumentNullException(nameof(service));
            }

            if (string.IsNullOrEmpty(serviceName))
            {
                throw new ArgumentException("message", nameof(serviceName));
            }

            var clients = await service.ConsulClient.Catalog.Service(serviceName);

            return(clients.Response);
        }
 public WeatherForecastController(ILogger <WeatherForecastController> logger, IConsulDiscoveryService consulDiscoveryService)
 {
     _logger = logger;
     this.consulDiscoveryService = consulDiscoveryService;
 }