| | |
| | | using Consul; |
| | | using Azure; |
| | | using Consul; |
| | | using Furion; |
| | | using Furion.FriendlyException; |
| | | using Furion.HttpRemote; |
| | |
| | | |
| | | 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 |
| | |
| | | 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]; |