DnsConfig.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Xml.Serialization;
  5. using Top.Api.Util;
  6. namespace Top.Api.Cluster
  7. {
  8. public class Weightable
  9. {
  10. public double Weight { get; set; }
  11. }
  12. public class ApiRule : Weightable
  13. {
  14. public string Name { get; set; }
  15. }
  16. public class ApiConfig
  17. {
  18. public string User { get; set; }
  19. public List<ApiRule> Rules { get; set; }
  20. }
  21. public class VipRule : Weightable
  22. {
  23. public string Vip { get; set; }
  24. }
  25. public class EnvConfig
  26. {
  27. public string Domain { get; set; }
  28. public string Protocol { get; set; }
  29. public List<VipRule> VipRules { get; set; }
  30. }
  31. public class DnsConfig
  32. {
  33. public IDictionary<string, string> GlobalDict { get; set; }
  34. public IDictionary<string, ApiConfig> ApiDict { get; set; }
  35. public IDictionary<string, List<EnvConfig>> EnvDict { get; set; }
  36. public IDictionary<string, IDictionary<string, string>> UserDict { get; set; }
  37. public static DnsConfig parse(string json)
  38. {
  39. DnsConfig dnsConfig = new DnsConfig();
  40. IDictionary root = TopUtils.JsonToObject(json) as IDictionary;
  41. foreach (string configType in root.Keys)
  42. {
  43. if ("config".Equals(configType))
  44. {
  45. dnsConfig.GlobalDict = new Dictionary<string, string>();
  46. IDictionary globalInfo = root[configType] as IDictionary;
  47. foreach (string key in globalInfo.Keys)
  48. {
  49. dnsConfig.GlobalDict[key] = globalInfo[key] as string;
  50. }
  51. }
  52. else if ("env".Equals(configType))
  53. {
  54. IDictionary envInfos = root[configType] as IDictionary;
  55. dnsConfig.EnvDict = new Dictionary<string, List<EnvConfig>>();
  56. foreach (string envName in envInfos.Keys)
  57. {
  58. IDictionary envInfo = envInfos[envName] as IDictionary;
  59. List<EnvConfig> envConfigs = new List<EnvConfig>();
  60. foreach (string domainName in envInfo.Keys)
  61. {
  62. IDictionary domainInfo = envInfo[domainName] as IDictionary;
  63. EnvConfig envConfig = new EnvConfig();
  64. envConfig.Domain = domainName as string;
  65. envConfig.Protocol = domainInfo["proto"] as string;
  66. IList vipInfos = domainInfo["vip"] as IList;
  67. List<VipRule> vipRules = new List<VipRule>();
  68. foreach (string vipInfo in vipInfos)
  69. {
  70. string[] vipInfoTmp = vipInfo.ToString().Split('|');
  71. VipRule vipRule = new VipRule();
  72. vipRule.Vip = vipInfoTmp[0];
  73. vipRule.Weight = double.Parse(vipInfoTmp[1]);
  74. vipRules.Add(vipRule);
  75. }
  76. envConfig.VipRules = vipRules;
  77. envConfigs.Add(envConfig);
  78. }
  79. dnsConfig.EnvDict[envName] = envConfigs;
  80. }
  81. }
  82. else if ("api".Equals(configType))
  83. {
  84. dnsConfig.ApiDict = new Dictionary<string, ApiConfig>();
  85. IDictionary apiInfos = root[configType] as IDictionary;
  86. foreach (string apiName in apiInfos.Keys)
  87. {
  88. IDictionary apiInfo = apiInfos[apiName] as IDictionary;
  89. ApiConfig apiConfig = new ApiConfig();
  90. apiConfig.User = apiInfo["user"] as string;
  91. List<ApiRule> apiRules = new List<ApiRule>();
  92. IList apiRuleInfos = apiInfo["rule"] as IList;
  93. foreach (string apiRuleInfo in apiRuleInfos)
  94. {
  95. string[] apiRuleInfoTmp = apiRuleInfo.ToString().Split('|');
  96. ApiRule apiRule = new ApiRule();
  97. apiRule.Name = apiRuleInfoTmp[0];
  98. apiRule.Weight = double.Parse(apiRuleInfoTmp[1]);
  99. apiRules.Add(apiRule);
  100. }
  101. apiConfig.Rules = apiRules;
  102. dnsConfig.ApiDict[apiName] = apiConfig;
  103. }
  104. }
  105. else if ("user".Equals(configType))
  106. {
  107. dnsConfig.UserDict = new Dictionary<string, IDictionary<string, string>>();
  108. IDictionary userInfos = root[configType] as IDictionary;
  109. foreach (string routeName in userInfos.Keys)
  110. {
  111. IDictionary envInfos = userInfos[routeName] as IDictionary;
  112. IDictionary<string, string> tags = new Dictionary<string, string>();
  113. foreach (string envName in envInfos.Keys)
  114. {
  115. IList tagInfos = envInfos[envName] as IList;
  116. foreach (string tagName in tagInfos)
  117. {
  118. tags.Add(tagName, envName);
  119. }
  120. }
  121. dnsConfig.UserDict[routeName] = tags;
  122. }
  123. }
  124. }
  125. return dnsConfig;
  126. }
  127. public string GetBestVipUrl(string serverUrl, string apiName, string session)
  128. {
  129. if (ApiDict.ContainsKey(apiName))
  130. {
  131. ApiConfig apiConfig = ApiDict[apiName];
  132. if (!string.IsNullOrEmpty(session) && apiConfig.User != null)
  133. {
  134. string flag = GetUserFlag(session);
  135. if (flag != null && UserDict.ContainsKey(apiConfig.User))
  136. {
  137. IDictionary<string, string> userEnvs = UserDict[apiConfig.User];
  138. if (userEnvs.ContainsKey(flag))
  139. {
  140. string userEnv = userEnvs[flag];
  141. if (EnvDict.ContainsKey(userEnv))
  142. {
  143. List<EnvConfig> envConfigs = EnvDict[userEnv];
  144. return GetEnvVipUrl(serverUrl, envConfigs);
  145. }
  146. }
  147. }
  148. }
  149. return GetApiVipUrl(serverUrl, apiConfig);
  150. }
  151. else
  152. {
  153. List<EnvConfig> envConfigs = EnvDict[GlobalDict["def_env"]];
  154. return GetEnvVipUrl(serverUrl, envConfigs);
  155. }
  156. }
  157. private string GetApiVipUrl(string serverUrl, ApiConfig apiConfig)
  158. {
  159. ApiRule apiRule = ClusterManager.GetElementByWeight(apiConfig.Rules);
  160. if (EnvDict.ContainsKey(apiRule.Name))
  161. {
  162. List<EnvConfig> envConfigs = EnvDict[apiRule.Name];
  163. return GetEnvVipUrl(serverUrl, envConfigs);
  164. }
  165. else
  166. {
  167. List<EnvConfig> envConfigs = EnvDict[GlobalDict["def_env"]];
  168. return GetEnvVipUrl(serverUrl, envConfigs);
  169. }
  170. }
  171. private string GetEnvVipUrl(string serverUrl, List<EnvConfig> envConfigs)
  172. {
  173. foreach (EnvConfig envConfig in envConfigs)
  174. {
  175. Uri uri = new Uri(serverUrl);
  176. if (uri.Host.Equals(envConfig.Domain, StringComparison.OrdinalIgnoreCase) && uri.Scheme.Equals(envConfig.Protocol, StringComparison.OrdinalIgnoreCase))
  177. {
  178. string vip = ClusterManager.GetElementByWeight<VipRule>(envConfig.VipRules).Vip;
  179. return serverUrl.Replace(envConfig.Domain, vip);
  180. }
  181. }
  182. return serverUrl;
  183. }
  184. private string GetUserFlag(string session)
  185. {
  186. if (!string.IsNullOrEmpty(session) && session.Length > 5)
  187. {
  188. if (session.StartsWith("6") || session.StartsWith("7"))
  189. {
  190. return session.Substring(session.Length - 1, 1);
  191. }
  192. else if (session.StartsWith("5") || session.StartsWith("8"))
  193. {
  194. return session.Substring(5, 1);
  195. }
  196. }
  197. return null;
  198. }
  199. public long GetVersion()
  200. {
  201. if (GlobalDict.ContainsKey("GlobalDict"))
  202. {
  203. return long.Parse(GlobalDict["GlobalDict"]);
  204. }
  205. else
  206. {
  207. return 0;
  208. }
  209. }
  210. public int GetRefreshInterval()
  211. {
  212. if (GlobalDict.ContainsKey("interval"))
  213. {
  214. return int.Parse(GlobalDict["interval"]);
  215. }
  216. else
  217. {
  218. return 30; // 默认半小时刷新一次
  219. }
  220. }
  221. }
  222. public class HttpdnsGetResponse : TopResponse
  223. {
  224. [XmlElement("result")]
  225. public string Result { get; set; }
  226. }
  227. public class HttpdnsGetRequest : BaseTopRequest<HttpdnsGetResponse>
  228. {
  229. public override string GetApiName()
  230. {
  231. return "taobao.httpdns.get";
  232. }
  233. public override IDictionary<string, string> GetParameters()
  234. {
  235. TopDictionary parameters = new TopDictionary();
  236. return parameters;
  237. }
  238. public override void Validate()
  239. {
  240. }
  241. }
  242. }