示例#1
0
        static DynamicPolicyPlugin()
        {
            _policyServiceUrl = ConfigurationManager.AppSettings[PolicyServiceUrlSettingKey];
            if (string.IsNullOrWhiteSpace(_policyServiceUrl))
            {
                if (!AntFxConfigWebServiceUtils.Enabled)
                {
                    return;
                }

                SyncPolicyServiceUrl();
                if (string.IsNullOrWhiteSpace(_policyServiceUrl))
                {
                    AntFxConfigWebServiceUtils.SubscribeFxWebServiceConfigUpdateEvent(SyncPolicyServiceUrl);
                }
            }

            Enabled = true;

            string policyServiceSyncIntervalSetting = ConfigurationManager.AppSettings[PolicyServiceSyncIntervalSettingKey];

            if (!string.IsNullOrWhiteSpace(policyServiceSyncIntervalSetting))
            {
                int.TryParse(policyServiceSyncIntervalSetting, out PolicyServiceSyncInterval);
                if (PolicyServiceSyncInterval < MinPolicyServiceSyncInterval)
                {
                    PolicyServiceSyncInterval = MinPolicyServiceSyncInterval;
                }
            }
        }
示例#2
0
        private static void SyncPolicyServiceUrl()
        {
            if (!string.IsNullOrWhiteSpace(_policyServiceUrl))
            {
                return;
            }

            string value = AntFxConfigWebServiceUtils.GetConfigItemValue(FxConfigWebServicePolicyServiceUrlSettingKey);

            if (!string.IsNullOrWhiteSpace(value))
            {
                _policyServiceUrl = value.Trim();
            }
        }
示例#3
0
 public static void SyncGlobalSetting()
 {
     try
     {
         string value   = AntFxConfigWebServiceUtils.GetConfigItemValue(FxConfigWebServiceSOAServiceCircuitBreakerTimeoutSettingKey);
         int    timeout = 0;
         int.TryParse(value, out timeout);
         TimeSpan globalTimeout = TimeSpan.FromMilliseconds(timeout);
         if (globalTimeout >= MinGlobalDefaultCircuitBreakerTimeoutSetting)
         {
             GlobalDefaultCircuitBreakerTimeoutSetting = globalTimeout;
         }
     }
     catch
     {
     }
 }
示例#4
0
        void SyncDynamicSettings(object sender, ElapsedEventArgs e)
        {
            if (_isPolicySyncRunning)
            {
                return;
            }

            _isPolicySyncRunning = true;
            try
            {
                if (string.IsNullOrWhiteSpace(_policyServiceUrl))
                {
                    AntFxConfigWebServiceUtils.SyncConfig();
                }

                if (string.IsNullOrWhiteSpace(_policyServiceUrl))
                {
                    return;
                }

                if (_policyServiceClient == null)
                {
                    _policyServiceClient                       = PolicyServiceClient.GetInstance(_policyServiceUrl);
                    _policyServiceClient.Format                = _dataTransferFormat;//"json"
                    _policyServiceClient.Timeout               = TimeSpan.FromSeconds(100);
                    _policyServiceClient.ReadWriteTimeout      = TimeSpan.FromSeconds(300);
                    _policyServiceClient.EnableCHystrixSupport = false;
                }

                foreach (ServiceMetadata metadata in EndpointHost.Config.MetadataMap.Values)
                {
                    if (!_serviceEnabledMap[metadata.ServicePath])
                    {
                        continue;
                    }

                    //获取每个服务的配置 一般都是一个服务
                    GetServiceSettingsResponseType policySyncResponse = null;
                    try
                    {
                        policySyncResponse = _policyServiceClient.GetServiceSettings(new GetServiceSettingsRequestType()
                        {
                            ServiceName      = metadata.ServiceName,
                            ServiceNamespace = metadata.ServiceNamespace
                        });
                    }
                    catch (Exception ex)
                    {
                        _log.Error(SyncErrorTitle, ex, new Dictionary <string, string>
                        {
                            { "ErrorCode", "FXD300014" },
                            { "ServiceName", metadata.ServiceName },
                            { "ServiceNamespace", metadata.ServiceNamespace }
                        });
                        continue;
                    }

                    try
                    {
                        metadata.LogErrorWithRequestInfo   = policySyncResponse.ServiceSettings.LogErrorWithRequestInfo;
                        metadata.LogCommonRequestInfo      = policySyncResponse.ServiceSettings.LogCommonRequestInfo;
                        metadata.CircuitBreakerForceClosed = policySyncResponse.ServiceSettings.CircuitBreakerForceClosed;

                        Dictionary <string, TimeSpan> timeoutSettings = GenerateOperationTimeoutDictionary(policySyncResponse.ServiceSettings.OperationTimeoutSettings);
                        foreach (Operation operation in metadata.Operations)
                        {
                            //把每个方法的电路设置为连接的状态
                            operation.HystrixCommand.Properties.CircuitBreakerForceClosed.Set(metadata.CircuitBreakerForceClosed);
                            string operationName = operation.Name.ToLower();
                            if (timeoutSettings.ContainsKey(operationName))
                            {
                                operation.HystrixCommand.Properties.ExecutionIsolationThreadTimeout.Set(timeoutSettings[operationName]);
                            }
                        }

                        foreach (IPlugin plugin in EndpointHost.Plugins)
                        {
                            if (plugin is WhiteListPlugin)
                            {
                                bool          enabled;
                                List <string> newWhiteList;
                                if (plugin is AppIdWhiteListPlugin)
                                {
                                    enabled      = policySyncResponse.ServiceSettings.EnableAppIdWhiteListCheck;
                                    newWhiteList = policySyncResponse.ServiceSettings.AppIdWhiteList;
                                }
                                else if (plugin is IPWhiteListPlugin)
                                {
                                    enabled      = policySyncResponse.ServiceSettings.EnableIPWhiteListCheck;
                                    newWhiteList = policySyncResponse.ServiceSettings.IPWhiteList;
                                }
                                else
                                {
                                    continue;
                                }

                                WhiteListPlugin whiteListPlugin = plugin as WhiteListPlugin;
                                whiteListPlugin.Refresh(metadata.ServicePath, enabled, newWhiteList);
                            }
                            else if (plugin is BlackListPlugin)
                            {
                                bool          enabled;
                                List <string> newBlackList;
                                if (plugin is AppIdBlackListPlugin)
                                {
                                    enabled      = policySyncResponse.ServiceSettings.EnableAppIdBlackListCheck;
                                    newBlackList = policySyncResponse.ServiceSettings.AppIdBlackList;
                                }
                                else if (plugin is IPBlackListPlugin)
                                {
                                    enabled      = policySyncResponse.ServiceSettings.EnableIPBlackListCheck;
                                    newBlackList = policySyncResponse.ServiceSettings.IPBlackList;
                                }
                                else
                                {
                                    continue;
                                }

                                BlackListPlugin blackListPlugin = plugin as BlackListPlugin;
                                blackListPlugin.Refresh(metadata.ServicePath, enabled, newBlackList);
                            }
                            else if (plugin is RateLimitingPlugin)
                            {
                                bool enabled;
                                int  rateLimit;
                                if (plugin is RateLimitingWithMapPlugin)
                                {
                                    Dictionary <string, int> rateLimitMap;
                                    if (plugin is AppIdRateLimitingPlugin)
                                    {
                                        enabled      = policySyncResponse.ServiceSettings.EnableAppIdRateLimitingCheck;
                                        rateLimit    = policySyncResponse.ServiceSettings.AppIdRateLimit;
                                        rateLimitMap = policySyncResponse.ServiceSettings.AppIdRateLimitSettings.ToDictionary(item => item.AppId, item => item.RateLimit);
                                    }
                                    else if (plugin is IPRateLimitingPlugin)
                                    {
                                        enabled      = policySyncResponse.ServiceSettings.EnableIPRateLimitingCheck;
                                        rateLimit    = policySyncResponse.ServiceSettings.IPRateLimit;
                                        rateLimitMap = policySyncResponse.ServiceSettings.IPRateLimitSettings.ToDictionary(item => item.IP, item => item.RateLimit);
                                    }
                                    else
                                    {
                                        continue;
                                    }

                                    RateLimitingWithMapPlugin rateLimitingPlugin = plugin as RateLimitingWithMapPlugin;
                                    rateLimitingPlugin.Refresh(metadata.ServicePath, enabled, rateLimit, rateLimitMap);

                                    continue;
                                }
                                else
                                {
                                    if (plugin is ServiceRateLimitingPlugin)
                                    {
                                        enabled   = policySyncResponse.ServiceSettings.EnableServiceRateLimitingCheck;
                                        rateLimit = policySyncResponse.ServiceSettings.ServiceRateLimit;
                                    }
                                    else if (plugin is OperationRateLimitingPlugin)
                                    {
                                        enabled = policySyncResponse.ServiceSettings.EnableOperationRateLimitingCheck;
                                        Dictionary <string, int> operationRateLimitMap = policySyncResponse.ServiceSettings.OperationRateLimitSettings
                                                                                         .ToDictionary(i => i.OperationName.Trim().ToLower(), i => i.RateLimit);
                                        OperationRateLimitingPlugin operationRateLimitPlugin = plugin as OperationRateLimitingPlugin;
                                        operationRateLimitPlugin.Refresh(metadata.ServicePath, enabled, operationRateLimitMap);

                                        continue;
                                    }
                                    else
                                    {
                                        continue;
                                    }

                                    RateLimitingPlugin rateLimitingPlugin = plugin as RateLimitingPlugin;
                                    rateLimitingPlugin.Refresh(metadata.ServicePath, enabled, rateLimit);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        try
                        {
                            _log.Fatal(
                                "Regression Bug",
                                ex,
                                new Dictionary <string, string>
                            {
                                { "ErrorCode", "FXD300015" },
                                { "ServiceName", metadata.ServiceName },
                                { "ServiceNamespace", metadata.ServiceNamespace },
                                { "Dynamic Policy Response", TypeSerializer.SerializeToString(policySyncResponse) }
                            });
                        }
                        catch
                        {
                        }
                    }
                }
            }
            catch { }
            finally
            {
                _isPolicySyncRunning = false;
            }
        }
示例#5
0
        //After configure called
        public static void AfterInit()
        {
            StartedAt = DateTime.UtcNow;

            if (Config.EnableFeatures != Feature.All)
            {
                if ((Feature.Xml & Config.EnableFeatures) != Feature.Xml)
                {
                    Config.IgnoreFormatsInMetadata.Add("xml");
                }
                if ((Feature.Json & Config.EnableFeatures) != Feature.Json)
                {
                    Config.IgnoreFormatsInMetadata.Add("json");
                }
                if ((Feature.Jsv & Config.EnableFeatures) != Feature.Jsv)
                {
                    Config.IgnoreFormatsInMetadata.Add("jsv");
                }
                if ((Feature.Csv & Config.EnableFeatures) != Feature.Csv)
                {
                    Config.IgnoreFormatsInMetadata.Add("csv");
                }
                if ((Feature.Html & Config.EnableFeatures) != Feature.Html)
                {
                    Config.IgnoreFormatsInMetadata.Add("html");
                }
            }

            if ((Feature.Html & Config.EnableFeatures) != Feature.Html)
            {
                Plugins.RemoveAll(x => x is HtmlFormat);
            }

            if ((Feature.PredefinedRoutes & Config.EnableFeatures) != Feature.PredefinedRoutes)
            {
                Plugins.RemoveAll(x => x is PredefinedRoutesFeature);
            }

            if ((Feature.Metadata & Config.EnableFeatures) != Feature.Metadata)
            {
                Plugins.RemoveAll(x => x is MetadataFeature);
            }

            if ((Feature.RequestInfo & Config.EnableFeatures) != Feature.RequestInfo)
            {
                Plugins.RemoveAll(x => x is RequestInfoFeature);
            }

            if ((Feature.HystrixInfo & Config.EnableFeatures) != Feature.HystrixInfo)
            {
                Plugins.RemoveAll(x => x is HystrixInfoFeature);
            }

            if ((Feature.ProtoBuf & Config.EnableFeatures) != Feature.ProtoBuf)
            {
                Plugins.RemoveAll(x => x is IProtoBufPlugin); //external
            }
            if ((Feature.MsgPack & Config.EnableFeatures) != Feature.MsgPack)
            {
                Plugins.RemoveAll(x => x is IMsgPackPlugin);  //external
            }
            if (ExceptionHandler == null)
            {
                // This is where all framework exceptions are centrally handled
                ExceptionHandler = (httpReq, httpRes, ex) =>
                {
                    //httpRes.WriteToResponse always calls .Close in its finally statement so
                    //if there is a problem writing to response, by now it will be closed
                    if (!httpRes.IsClosed)
                    {
                        httpRes.WriteErrorToResponse(httpReq, httpReq.ResponseContentType, ex);
                    }
                };
            }

            if (!Plugins.Exists(p => p is DynamicPolicyPlugin))
            {
                Plugins.Add(new DynamicPolicyPlugin());
            }

            if (Config.UseConsulDiscovery && !Plugins.Exists(p => p is ConsulFeature))
            {
                Plugins.Add(new ConsulFeature());
            }

            if (!Plugins.Exists(p => p is SwaggerServicePlugin))
            {
                Plugins.Add(new SwaggerServicePlugin());
            }

            //这里先预留 留着获取动态配置用的
            if (AntFxConfigWebServiceUtils.Enabled)
            {
                HystrixCommandHelper.SyncGlobalSetting();
                AntFxConfigWebServiceUtils.SubscribeFxWebServiceConfigUpdateEvent(HystrixCommandHelper.SyncGlobalSetting);
            }

            ConfigurePlugins();

            AppHost.LoadPlugin(Plugins.ToArray());
            pluginsLoaded = true;

            AfterPluginsLoaded();

            foreach (KeyValuePair <string, string> item in ContentTypeFilter.ContentTypeFormats)
            {
                SupportedFormats[item.Key] = item.Value;
            }

            if (AppHost.AfterInitCallbacks != null && AppHost.AfterInitCallbacks.Count > 0)
            {
                AppHost.AfterInitCallbacks.ForEach(t => t.Invoke(AppHost));
            }

            ReadyAt = DateTime.UtcNow;
        }