public UrlTemplate GetUrlTemplate(MethodInfo methodInfo) { var serviceAttribute = methodInfo.DeclaringType.GetCustomAttribute <ConsulServiceAttribute>(); if (serviceAttribute != null) { var serviceName = serviceAttribute.ServiceName; var pathAttribute = methodInfo.GetCustomAttribute <ConsulPathAttribute>(); if (pathAttribute != null) { var urlPath = pathAttribute.Path; var httpMethod = pathAttribute.HttpMethod; var loadBalance = LoadBalanceRepository.GetLoadBalance(methodInfo.DeclaringType.FullName); var serviceInfo = _consulInfoProvider.GetServiceInfo(serviceName, loadBalance); if (serviceInfo == null) { throw new Exception($"Can't find {serviceName} in Consul"); } var host = serviceInfo.Address.StartsWith("http") ? serviceInfo.Address : $"http://{serviceInfo.Address}"; return(new UrlTemplate { Host = $"{host}:{serviceInfo.ServicePort}", HttpMethod = httpMethod, Url = urlPath }); } } return(HttpRequestUtil.BuildUrlTemplate(methodInfo)); }
public static void AddWebApiEasyInvoker(this IServiceCollection services, EasyInvokerConsulConfig consulConfig) { if (consulConfig == null) { throw new NullReferenceException("EasyInvokerConsulConfig is null"); } services.TryAddScoped <IUrlBuilder, UrlBuilderConsul>(); services.AddSingleton <IConsulServiceRefresh, ConsulServiceRefresh>(); services.AddSingleton <IConsulServiceInfoProvider, ConsulServiceInfoProvider>(); services.AddWebApiEasyInvoker(); var serviceRefresh = services.BuildServiceProvider().GetService <IConsulServiceRefresh>(); var serviceList = new List <string>(); var balanceDic = new Dictionary <string, ILoadBalance>(); foreach (var assembie in AppDomain.CurrentDomain.GetAssemblies()) { assembie.GetTypes().ToList().ForEach(t => { if (t.IsInterface && t.GetInterface("IWebApiInvoker`1", true) != null) { var attribute = t.GetCustomAttribute <ConsulServiceAttribute>(); if (attribute != null) { var balanceType = attribute.BalanceType; ILoadBalance loadBalance; switch (balanceType) { case BalanceType.First: loadBalance = new LoadBalanceFirst(); break; case BalanceType.Last: loadBalance = new LoadBalanceLast(); break; case BalanceType.Round: loadBalance = new LoadBalanceRound(); break; case BalanceType.Random: loadBalance = new LoadBalanceRandom(); break; case BalanceType.LeastConnection: loadBalance = new LoadBalanceLeastConnection(); break; default: loadBalance = new LoadBalanceFirst(); break; } balanceDic.Add(t.FullName, loadBalance); if (!serviceList.Contains(attribute.ServiceName)) { serviceList.Add(attribute.ServiceName); } } } }); } LoadBalanceRepository.LoadData(balanceDic); serviceRefresh.LoadServices(serviceList); serviceRefresh.Start(consulConfig); }