/// <summary> /// 服务请求 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="serviceScheme">服务名称:(http/https)</param> /// <param name="serviceName">服务名称</param> /// <param name="requirePath">服务路径</param> /// <returns></returns> public async Task <T> GetAsync <T>(string serviceScheme, string serviceName, string requirePath) { // 1. 获取服务 var serviceList = await _serviceDiscovery.Discovery(serviceName); if (serviceList == null || serviceList.Count == 0) { throw new Exception($"没有找到 {serviceName} 的可用服务。"); } // 2. 负载均衡服务 var service = _loadBalance.Select(serviceList); // 3. 请求服务 var httpClient = _httpClientFactory.CreateClient("ConsulHttpClient"); //var response = await httpClient.GetAsync($"{service.Url}{requirePath}");//TODO:Ocelot结合Consul会出错,注意Scheme. var response = await httpClient.GetAsync($"{serviceScheme}://{service.Url}{requirePath}"); // 3.1 响应结果,json转换为对象 if (response.StatusCode == HttpStatusCode.OK) { var json = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject <T>(json); return(result); } else { throw new Exception($"{serviceName}服务调用异常"); } }
/// <summary> /// Get方法 /// </summary> /// <typeparam name="T"></typeparam> /// param name="ServiceSchme">服务名称:(http/https)</param> /// <param name="ServiceName">服务名称</param> /// <param name="serviceLink">服务路径</param> /// <returns></returns> public async Task <T> GetAsync <T>(string Serviceshcme, string ServiceName, string serviceLink) { // 1、获取服务 IList <ServiceUrl> serviceUrls = await serviceDiscovery.Discovery(ServiceName); // 2、负载均衡服务 ServiceUrl serviceUrl = loadBalance.Select(serviceUrls); // 3、建立请求 Console.WriteLine($"请求路径:{Serviceshcme} +'://'+{serviceUrl.Url} + {serviceLink}"); HttpClient httpClient = httpClientFactory.CreateClient("mrico"); // HttpResponseMessage response = await httpClient.GetAsync(serviceUrl.Url + serviceLink); HttpResponseMessage response = await httpClient.GetAsync(Serviceshcme + "://" + serviceUrl.Url + serviceLink); // 3.1json转换成对象 if (response.StatusCode == HttpStatusCode.OK) { string json = await response.Content.ReadAsStringAsync(); return(JsonConvert.DeserializeObject <T>(json)); } else { // 3.2、进行自定义异常处理,这个地方进行了降级处理 throw new Exception($"{ServiceName}服务调用错误:{response.Content.ReadAsStringAsync()}"); } }
/// <summary> /// 重选,先从非selected的列表中选择,没有在从selected列表中选择. /// </summary> /// <param name="loadbalance"></param> /// <param name="invocation"></param> /// <param name="invokers"></param> /// <param name="selected"></param> /// <param name="availablecheck"></param> /// <returns></returns> private URL reselect(ILoadBalance loadbalance, IInvocation invocation, IList <URL> invokers, IList <URL> selected, bool availablecheck) { //预先分配一个,这个列表是一定会用到的. List <URL> reselectInvokers = new List <URL>(invokers.Count > 1 ? (invokers.Count - 1) : invokers.Count); //先从非select中选 if (availablecheck) { //选isAvailable 的非select foreach (var invoker in invokers) { if (selected == null || !selected.Contains(invoker)) { reselectInvokers.Add(invoker); } } if (reselectInvokers.Count > 0) { return(loadbalance.Select(reselectInvokers, invocation)); } } else { //选全部非select foreach (var invoker in invokers) { if (selected == null || !selected.Contains(invoker)) { reselectInvokers.Add(invoker); } } if (reselectInvokers.Count > 0) { return(loadbalance.Select(reselectInvokers, invocation)); } } //最后从select中选可用的. { if (selected != null) { foreach (var invoker in selected) { if (!reselectInvokers.Contains(invoker)) { reselectInvokers.Add(invoker); } } } if (reselectInvokers.Count > 0) { return(loadbalance.Select(reselectInvokers, invocation)); } } return(null); }
/// <summary> /// Get 方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="serviceSchme">服务名称(http/https)</param> /// <param name="serviceName">服务名称</param> /// <param name="serviceLink">服务路径</param> /// <returns></returns> public async Task <T> GetAsync <T>(string serviceSchme, string serviceName, string serviceLink , Func <T, T> filterFunc = null) { //获取服务 IList <ServiceUrl> serviceUrls = await _serviceDiscovery.Discovery(serviceName); //负载均衡服务 ServiceUrl serviceUrl = _loadBalance.Select(serviceUrls); //建立请求 HttpClient httpClient = _httpClientFactory.CreateClient("fcdtwin"); HttpResponseMessage httpResponse = await httpClient.GetAsync(serviceUrl.Url + serviceLink); //json转换成对象 if (httpResponse.StatusCode == HttpStatusCode.OK) { string json = await httpResponse.Content.ReadAsStringAsync(); T data = JsonConvert.DeserializeObject <T>(json); if (filterFunc != null) { data = filterFunc.Invoke(data); } return(data); } else { throw new Exception($"{serviceName}服务调用错误"); } }
public IDbConnection CreateRead(string name) { DatabaseSetting database; if (!_databases.TryGetValue(name, out database)) { throw new Exception("Create database connection fail, because database not exists which keyed [{0}]".FormatWith(name)); } var connectionString = _loadBalance.Select(database.Reads); return(this.Connect(connectionString)); }
protected virtual ServiceProxy <TService> Open() { var meta = _loadBalance.Select <ServiceMetadata>(_weightCalculator, _metadatas, _serviceIdentity); if (meta == null) { throw new ServiceMetadataNotFoundException(typeof(TService)); } var binding = this.GetBinding(meta); var address = new EndpointAddress(meta.Address); return(new ServiceProxy <TService>(binding, address)); }
private URL doselect(ILoadBalance loadbalance, IInvocation invocation, IList <URL> invokers, IList <URL> selected) { if (invokers == null || invokers.Count == 0) { return(null); } if (invokers.Count == 1) { return(invokers[0]); } // 如果只有两个invoker,退化成轮循 if (invokers.Count == 2 && selected?.Count > 0) { return(selected[0] == invokers[0] ? invokers[1] : invokers[0]); } var invoker = loadbalance.Select(invokers, invocation); //如果 selected中包含(优先判断) 或者 不可用&&availablecheck=true 则重试. if ((selected != null && selected.Contains(invoker)) || availablecheck) { try { var rinvoker = reselect(loadbalance, invocation, invokers, selected, availablecheck); if (rinvoker != null) { invoker = rinvoker; } else { //看下第一次选的位置,如果不是最后,选+1位置. int index = invokers.IndexOf(invoker); try { //最后在避免碰撞 invoker = index < invokers.Count - 1 ? invokers[index + 1] : invoker; } catch (Exception e) { Logger().LogWarning(e, e.Message + " may because invokers list dynamic change, ignore."); } } } catch (Exception t) { Logger().LogError(t, $"clustor relselect fail reason is :{t.Message} if can not slove ,you can set cluster.availablecheck=false in url"); } } return(invoker); }
public string GetMiddleUrl(string urlScheme, string serviceName) { //1.获取服务url IList <ServiceNode> serviceNodes = _serviceDiscovery.Discovery(serviceName); if (serviceNodes.Count == 0) { throw new FrameException($"{serviceName} 服务不存在"); } //2.url负载均衡 var serviceNode = _loadBalance.Select(serviceNodes); return(urlScheme + "://" + serviceNode.Url); }
public string GetMiddleUrl(string urlShcme, string serviceName) { // 1、获取服务url IList <ServiceNode> serviceUrls = serviceDiscovery.Discovery(serviceName); // 2、url负载均衡 ServiceNode serviceUrl = loadBalance.Select(serviceUrls); // 3、创建url StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(urlShcme); stringBuilder.Append("://"); stringBuilder.Append(serviceUrl.Url); return(stringBuilder.ToString()); }
public string GetMiddleUrl(string urlShcme, string serviceName) { // 1、获取服务url IList <ServiceNode> serviceUrls = serviceDiscovery.Discovery(serviceName); if (serviceUrls.Count == 0) { throw new FrameException($"{serviceName} 服务不存在"); } // 2、url负载均衡 ServiceNode serviceUrl = loadBalance.Select(serviceUrls); // 3、创建url StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(urlShcme); stringBuilder.Append("://"); stringBuilder.Append(serviceUrl.Url); return(stringBuilder.ToString()); }
/// <summary> /// Get方法 /// </summary> /// <typeparam name="T"></typeparam> /// param name="ServiceSchme">服务名称:(http/https)</param> /// <param name="ServiceName">服务名称</param> /// <param name="serviceLink">服务路径</param> /// <returns></returns> public async Task <T> GetAsync <T>(string Serviceshcme, string ServiceName, string serviceLink) { // 1、获取服务 IList <ServiceUrl> serviceUrls = await serviceDiscovery.Discovery(ServiceName); // 2、负载均衡服务 ServiceUrl serviceUrl = loadBalance.Select(serviceUrls); // 3、建立请求 HttpClient httpClient = httpClientFactory.CreateClient("consul"); HttpResponseMessage response = await httpClient.GetAsync(serviceUrl.Url + serviceLink); // 3.1json转换成对象 if (response.StatusCode == HttpStatusCode.OK) { string json = await response.Content.ReadAsStringAsync(); return(JsonConvert.DeserializeObject <T>(json)); } else { throw new Exception($"{ServiceName}服务调用错误"); } }
public async Task <IList <Team> > GetTeams() { // 1、获取服务 IList <ServiceUrl> serviceUrls = await serviceDiscovery.Discovery(ServiceName); // 2、负载均衡服务 ServiceUrl serviceUrl = loadBalance.Select(serviceUrls); // 3、建立请求 HttpClient httpClient = httpClientFactory.CreateClient(); HttpResponseMessage response = await httpClient.GetAsync(serviceUrl.Url + serviceLink); // 3.1json转换成对象 IList <Team> teams = null; if (response.StatusCode == HttpStatusCode.OK) { string json = await response.Content.ReadAsStringAsync(); teams = JsonConvert.DeserializeObject <List <Team> >(json); } return(teams); }
internal static T Select <T>(this ILoadBalance loadBalance, List <T> items) { var weightCalculator = new EmptyWeightCalculator <T>(); return(loadBalance.Select(weightCalculator, items, "database-dispatch")); }