sunpengfei
2025-08-14 33b3aab9c26972d816ee41fa87059efa34e77a11
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs
@@ -1,4 +1,5 @@
using Consul;
using Azure;
using Consul;
using Furion;
using Furion.FriendlyException;
using Furion.HttpRemote;
@@ -44,8 +45,8 @@
            var jsonResourceModels = await distributedCache.GetStringAsync($"ResourceModel|{requestTypeFullName}");
            var resource = jsonResourceModels.JsonTo<ResourceModel>();
            var domain = await GetHealthyServiceDomain(resource);
            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), $"{domain}{resource.Route}");
            var url = await GetUrl(resource.ServiceName, resource.Route);
            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), url);
            if (resource.Method == EnumResourceMethod.Get)
                builder = builder.WithQueryParameters(request);
            else
@@ -56,22 +57,42 @@
            return response;
        }
        public async Task<string> SendHttpAsync(Resource resource, string request, IResourceHttpProvider provider = null)
        {
            var url = await GetUrl(resource.ServiceName, resource.Route);
            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), url);
            if (resource.Method == EnumResourceMethod.Get)
                builder = builder.WithQueryParameters(request);
            else
                builder = builder.SetJsonContent(request);
            provider = provider ?? new DefaultResourceHttpProvider();
            builder = provider.AddAuthentication(builder);
            var response = await provider.SendAsStringAsync(httpRemoteService, builder);
            return response;
        }
        public async Task<string> GetUrl(string serviceName, string route)
        {
            var domain = await GetHealthyServiceDomain(serviceName);
            return $"{domain}{route}";
        }
        /// <summary>
        /// 获取健康服务域名
        /// </summary>
        /// <param name="resource"></param>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public async Task<string> GetHealthyServiceDomain(ResourceModel resource)
        public async Task<string> GetHealthyServiceDomain(string serviceName)
        {
            var queryResult = await consulClient.Health.Service(resource.ServiceName, null, true);
            var queryResult = await consulClient.Health.Service(serviceName, null, true);
            if (queryResult.StatusCode != System.Net.HttpStatusCode.OK)
                throw Oops.Oh(EnumErrorCodeType.s404, $"微服务{resource.Service}");
                throw Oops.Oh(EnumErrorCodeType.s404, $"微服务{serviceName}");
            var domains = queryResult.Response
                .Select(s => $"http://{s.Service.Address}:{s.Service.Port}")
                .ToList();
            if (domains.IsNull())
                throw Oops.Oh(EnumErrorCodeType.s404, $"微服务{resource.Service}");
                throw Oops.Oh(EnumErrorCodeType.s404, $"微服务{serviceName}");
            // 轮询选择实例
            int randomIndex = new Random().Next(domains.Count);
            return domains[randomIndex];