public void BackupRestoreTest()
        {
            IConfiguration configuration        = ObjectFactory.CreateAppSettingConfiguration();
            var            configurationSource  = ObjectFactory.CreateDefaultConfigurationSource(0, "App.config", configuration);
            var            configurationManager = ObjectFactory.CreateDefaultConfigurationManager(configurationSource);

            string managerId      = "soa";
            string loadBalancerId = MethodInfo.GetCurrentMethod().Name;
            string fileName       = configuration.GetPropertyValue("soa.ribbon.local-cache.data-folder") + "\\" + managerId + "." + loadBalancerId;

            try
            {
                var loadBalancerConfig  = new LoadBalancerConfig(new TruePing(), new DefaultServerSource(new Server[0]));
                var loadBalancerManager = LoadBalancerManager.GetManager(managerId, new LoadBalancerManagerConfig(configurationManager));
                var lbContext           = new DefaultLoadBalancerContext(loadBalancerManager, loadBalancerId, loadBalancerConfig);

                var manager = new DefaultServerSourceManager(lbContext);
                List <ServerGroup> serverGroups = new List <ServerGroup>();
                for (int i = 0; i < 10; i++)
                {
                    var server = new Server("Server_" + i, i % 2 == 0);
                    serverGroups.Add(new ServerGroup(server.ServerId, i, new List <Server>()
                    {
                        server
                    }));
                }
                var expected = new List <LoadBalancerRoute>()
                {
                    new LoadBalancerRoute("default", serverGroups)
                };
                manager.Backup(expected);
                var actual = manager.Restore();
                CollectionAssert.AreEqual(expected, actual);
            }
            finally
            {
                File.Delete(fileName);
            }
        }
Beispiel #2
0
        private void Initialize(LoadBalancerConfig loadBalancerConfig)
        {
            InitializeMinAvailableServerCountProperty();

            _loadBalancerRuleFactoryManager = new DefaultLoadBalancerRuleFactoryManager(this);
            if (loadBalancerConfig.RuleFactory != null)
            {
                _loadBalancerRuleFactoryManager.RegisterLoadBalancerRuleFactory(loadBalancerConfig.RuleFactory);
            }
            ServerSourceFilter  = new DefaultServerSourceFilter(this);
            ServerSourceManager = new DefaultServerSourceManager(this);
            ServerSourceMonitor = new DefaultServerSourceMonitor(this);
            LoadBalancer        = new DefaultLoadBalancer(this);

            ServerSourceFilter.OnChange += (o, e) =>
            {
                ServerSourceManager.Backup(ServerSourceFilter.LoadBalancerRoutes);
            };
            ServerSourceMonitor.ServerStatusChange += (o, e) =>
            {
                ServerSourceFilter.Refresh();
                ServerSourceManager.Backup(ServerSourceFilter.LoadBalancerRoutes);
            };

            if (ServerSource is IDynamicServerSource)
            {
                ((IDynamicServerSource)ServerSource).OnChange += (o, e) =>
                {
                    ServerSourceFilter.LoadBalancerRoutes = ServerSource.LoadBalancerRoutes;
                };
            }

            if (loadBalancerConfig.ServerSourceRestoreEventHandler != null)
            {
                ServerSourceManager.OnServerSourceRestore += loadBalancerConfig.ServerSourceRestoreEventHandler;
            }

            if (loadBalancerConfig.SeekRouteEventHandler != null)
            {
                ServerSourceFilter.OnSeekRoute += loadBalancerConfig.SeekRouteEventHandler;
            }

            var routes  = ServerSource.LoadBalancerRoutes;
            var servers = new List <Server>();

            if (routes != null)
            {
                routes.ForEach(route => servers.AddRange(route.Servers));
            }
            if (servers.Count == 0)
            {
                routes = ServerSourceManager.Restore();
                routes.ForEach(route => servers.AddRange(route.Servers));
                var localCache = string.Join("\n", servers);
                _logger.Warn("Server list is null! Load server list from local cache." + localCache, AdditionalInfo);
            }
            if (servers.Count != 0)
            {
                ServerSourceManager.Backup(ServerSourceFilter.LoadBalancerRoutes);
            }
            ServerSourceFilter.LoadBalancerRoutes = routes;

            ServerSourceMonitor.MonitorServers();
        }