예제 #1
0
        static void Main(string[] args)
        {
            HostingEnvironment = GetHostingEnvironment();
            Configuration      = GetConfiguration(HostingEnvironment, args);

            var siloHostBuilder = new SiloHostBuilder()
                                  .SetClusteringEnvironment()
                                  .Configure <ClusterOptions>(options => {
                options.ClusterId = Configuration["Orleans:ClusterId"];
                options.ServiceId = Configuration["Orleans:ServiceId"];
            })
                                  .Configure <EndpointOptions>(options => {
                options.AdvertisedIPAddress = IPAddress.Loopback;
            })
                                  .ConfigureApplicationParts(parts => {
                parts.AddApplicationPart(typeof(Grains.Posts.BlogPostGrain).Assembly).WithReferences();
            })

                                  .ConfigureLogging(logging => {
                logging
                .AddConfiguration(Configuration)
                .AddConsole();
            })

                                  .ConfigureServices(ConfigureServices);

            if (Configuration.GetValue <bool>("OrleansDashboard:Enabled", false))
            {
                siloHostBuilder = siloHostBuilder.UseDashboard(options => {
                    options.Host = Configuration["OrleansDashboard:Host"];
                    options.Port = Configuration.GetValue <int>("OrleansDashboard:Port");

                    options.Username = Configuration["OrleansDashboard:Username"];
                    options.Password = Configuration["OrleansDashboard:Password"];

                    options.CounterUpdateIntervalMs = Configuration.GetValue <int>("OrleansDashboard:UpdateInterval", 1000);
                });
            }

            var siloHost = siloHostBuilder.Build();

            siloHost.StartAsync()

            .ContinueWith(task => {
                Console.WriteLine("CoreBlog SiloHost is running...");

                return(task);
            });

            resetEvent.WaitOne();
        }
        /// <summary>
        /// 启动Silo
        /// </summary>
        /// <param name="assemblys"></param>
        /// <returns></returns>
        private static async Task <ISiloHost> StartSilo(params Assembly[] assemblys)
        {
            var orleansConfig = OrleansConfig.ReadConfig();

            // define the cluster configuration
            var builder = new SiloHostBuilder()
                          .UseLocalhostClustering()
                          .Configure <ClusterOptions>(options =>
            {                //群集标识
                options.ClusterId = "dev";
                options.ServiceId = "OrleansBasics";
            })
                          .Configure <EndpointOptions>(options =>
            {                //网关设置
                //options.AdvertisedIPAddress = IPAddress.Parse("127.0.0.1");//监听外网地址
                options.AdvertisedIPAddress = IPAddress.Parse(orleansConfig.GatewayAddress);
                options.SiloPort            = orleansConfig.SiloPort;
                options.GatewayPort         = orleansConfig.GatewayPort;
            })
                          .ConfigureApplicationParts(
                parts =>
            {
                foreach (var assembly in assemblys)
                {                        //注入程序集
                    parts.AddApplicationPart(assembly).WithReferences();
                }
            }
                )
                          .ConfigureLogging(logging => logging.AddConsole());

            if (orleansConfig.UseDashboard)
            {//使用监控
                builder.UseDashboard();
            }

            var host = builder.Build();
            await host.StartAsync();

            return(host);
        }
예제 #3
0
        private static async Task <ISiloHost> StartSilo(SiloHostConfig config)
        {
            var builder = new SiloHostBuilder()
                          .UseAdoNetClustering(op =>
            {
                op.ConnectionString = config.ClusteringDbConnectionString;
                op.Invariant        = config.ClusteringDbInvariant;
            })
                          .Configure <ClusterOptions>(options =>
            {
                options.ClusterId = config.ClusterId;
                options.ServiceId = config.ServiceId;
            })
                          .Configure <EndpointOptions>(options =>
            {
                options.AdvertisedIPAddress = IPAddress.Parse(config.AdvertisedIPAddress);
                options.SiloPort            = config.SiloPort;
                options.GatewayPort         = config.GatewayPort;
            })
                          .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences())
                          .ConfigureLogging(logging => logging.AddDebug());

            if (config.Dashboard != null && config.Dashboard.UseDashboard)
            {
                builder = builder.UseDashboard(options =>
                {
                    options.Username = config.Dashboard.Username;
                    options.Password = config.Dashboard.Password;
                    options.Host     = config.Dashboard.Host;
                    options.Port     = config.Dashboard.Port;
                    options.HostSelf = config.Dashboard.HostSelf;
                    options.CounterUpdateIntervalMs = config.Dashboard.CounterUpdateIntervalMs;
                });
            }

            var host = builder.Build();
            await host.StartAsync();

            return(host);
        }
        private ISiloHost CreateSiloHost()
        {
            var builder = new SiloHostBuilder();

            if (_dashboardOptions.Value.Enable)
            {
                builder.UseDashboard(options =>
                {
                    options.Port = _dashboardOptions.Value.Port;
                });
            }

            builder.Configure <ClusterOptions>(options =>
            {
                options.ClusterId = _siloOptions.Value.ClusterId;
                options.ServiceId = _siloOptions.Value.ServiceId;
            });

            if (string.IsNullOrEmpty(_siloOptions.Value.AdvertisedIp) || "*".Equals(_siloOptions.Value.AdvertisedIp))
            {
                builder.ConfigureEndpoints(_siloOptions.Value.SiloPort, _siloOptions.Value.GatewayPort,
                                           listenOnAnyHostAddress: _siloOptions.Value.ListenOnAnyHostAddress);
            }
            else
            {
                var ip = IPAddress.Parse(_siloOptions.Value.AdvertisedIp);

                builder.ConfigureEndpoints(ip, _siloOptions.Value.SiloPort, _siloOptions.Value.GatewayPort,
                                           listenOnAnyHostAddress: _siloOptions.Value.ListenOnAnyHostAddress);
            }

            if (_providerOptions.Value.DefaultProvider == "MongoDB")
            {
                var mongoDbOption = _providerOptions.Value.MongoDB;
                builder.UseMongoDBClustering(options =>
                {
                    var clusterOption = mongoDbOption.Cluster;

                    options.ConnectionString = clusterOption.DbConn;
                    options.DatabaseName     = clusterOption.DbName;

                    // see:https://github.com/OrleansContrib/Orleans.Providers.MongoDB/issues/54
                    options.CollectionPrefix = clusterOption.CollectionPrefix;
                })
                .UseMongoDBReminders(options =>
                {
                    var reminderOption = mongoDbOption.Reminder;

                    options.ConnectionString = reminderOption.DbConn;
                    options.DatabaseName     = reminderOption.DbName;

                    if (!string.IsNullOrEmpty(reminderOption.CollectionPrefix))
                    {
                        options.CollectionPrefix = reminderOption.CollectionPrefix;
                    }
                })
                .AddMongoDBGrainStorageAsDefault(options =>
                {
                    var storageOption = mongoDbOption.Storage;

                    options.ConnectionString = storageOption.DbConn;
                    options.DatabaseName     = storageOption.DbName;

                    if (!string.IsNullOrEmpty(storageOption.CollectionPrefix))
                    {
                        options.CollectionPrefix = storageOption.CollectionPrefix;
                    }
                });
            }

            builder.ConfigureServices(services =>
            {
                services
                .AddLogging(loggingBuilder => loggingBuilder.AddSerilog())
                .AddTransient <GameHost>()
                .AddTransient <LeaderBoard>()
                .AddTransient <Player>();
            })
            .ConfigureApplicationParts(parts => { parts.AddFromApplicationBaseDirectory().WithReferences(); })
            .ConfigureLogging(logging => { logging.AddSerilog(dispose: true); });

            return(builder.Build());
        }
        private ISiloHostBuilder InitBuilder()
        {
            var hostBuilder = new SiloHostBuilder();

            hostBuilder.Configure <SerializationProviderOptions>(options =>
            {
                options.SerializationProviders.Add(typeof(OrleansCustomSerialization));

                // A workaround for an Orleans issue
                // to ensure the stack trace properly de/serialized
                // Gigya.Microdot.UnitTests.Serialization.ExceptionSerializationTests
                options.SerializationProviders.Add(typeof(NonSerializedExceptionsSerializer));

                options.FallbackSerializationProvider = typeof(OrleansCustomSerialization);
            })
            .UsePerfCounterEnvironmentStatistics()
            // We paid attention that AddFromApplicationBaseDirectory making issues of non-discovering grain types.
            .ConfigureApplicationParts(parts => parts.AddFromAppDomain())
            .Configure <SiloOptions>(options => options.SiloName = _appInfo.Name);

            if (_orleansConfig.Dashboard.Enable)
            {
                hostBuilder.UseDashboard(o =>
                {
                    o.Port = _endPointDefinition.SiloDashboardPort;
                    o.CounterUpdateIntervalMs = (int)TimeSpan.Parse(_orleansConfig.Dashboard.WriteInterval).TotalMilliseconds;
                    o.HideTrace = _orleansConfig.Dashboard.HideTrace;
                });
            }

            SetGrainCollectionOptions(hostBuilder);

            hostBuilder.Configure <PerformanceTuningOptions>(options =>
            {
                options.DefaultConnectionLimit = ServicePointManager.DefaultConnectionLimit;
            });
            hostBuilder.AddMemoryGrainStorage(ProviderConstants.DEFAULT_STORAGE_PROVIDER_NAME, options => options.NumStorageGrains = 10);
            hostBuilder.Configure <TelemetryOptions>(o => o.AddConsumer <MetricsStatisticsConsumer>());
            hostBuilder.Configure <SchedulingOptions>(options =>
            {
                options.PerformDeadlockDetection = true;
                options.AllowCallChainReentrancy = true;
                options.MaxActiveThreads         = Process.GetCurrentProcess().ProcessorAffinityList().Count();
            });

            hostBuilder.Configure <ClusterMembershipOptions>(options =>
            {
            });

            if (_orleansConfig.EnableTls)
            {
                var localCertificate = _certificateLocator.GetCertificate("Service");
                hostBuilder.UseTls(localCertificate, tlsOptions =>
                {
                    tlsOptions.LocalCertificate      = localCertificate;
                    tlsOptions.ClientCertificateMode = RemoteCertificateMode.AllowCertificate;
                    tlsOptions.RemoteCertificateMode = RemoteCertificateMode.AllowCertificate;

                    tlsOptions.SslProtocols = SslProtocols.Tls12;

                    tlsOptions.OnAuthenticateAsClient = OnAuthenticateAsClient;
                });
            }

            SetReminder(hostBuilder);
            SetSiloSource(hostBuilder);

            hostBuilder.Configure <StatisticsOptions>(o =>
            {
                o.LogWriteInterval          = TimeSpan.FromDays(1);
                o.PerfCountersWriteInterval = TimeSpan.Parse(_orleansConfig.MetricsTableWriteInterval);
            });

            return(hostBuilder);
        }
예제 #6
0
        /// <summary>
        ///     Starts the silo host.
        /// </summary>
        /// <returns>An <see cref="ISiloHost" />.</returns>
        private ISiloHost StartSilo()
        {
            var databaseConfig     = this.configuration.GetSection("Database");
            var connectionSettings = new MqttDatabaseConnectionSettings();

            databaseConfig.Bind(connectionSettings);

            DashboardOptions dashboardOptions = null;

            if (this.configuration.GetSection("Orleans").GetSection("DashboardOptions").Exists())
            {
                dashboardOptions = new DashboardOptions();
                this.configuration.GetSection("Orleans").Bind("DashboardOptions", dashboardOptions);
            }

            // ReSharper disable ImplicitlyCapturedClosure
            var builder = new SiloHostBuilder().ConfigureServices(
                s =>
            {
                s.Configure <MqttDatabaseConnectionSettings>(databaseConfig);
                s.AddSingleton <IEventLogRepository>(r => new EventLogRepository(connectionSettings));
                s.AddSingleton <IBlacklistRepository>(u => new BlacklistRepository(connectionSettings));
                s.AddSingleton <IDatabaseVersionRepository>(u => new DatabaseVersionRepository(connectionSettings));
                s.AddSingleton <IPublishMessageRepository>(a => new PublishMessageRepository(connectionSettings));
                s.AddSingleton <IUserRepository>(u => new UserRepository(connectionSettings));
                s.AddSingleton <IWhitelistRepository>(u => new WhitelistRepository(connectionSettings));
                s.AddSingleton <IMqttValidator>(new MqttValidator());
            }).UseAdoNetClustering(
                options =>
            {
                options.Invariant        = "Npgsql";
                options.ConnectionString = connectionSettings.ToConnectionString();
            }).UseAdoNetReminderService(
                options =>
            {
                options.Invariant        = "Npgsql";
                options.ConnectionString = connectionSettings.ToConnectionString();
            }).Configure <ClusterOptions>(options => { this.configuration.GetSection("Orleans").Bind("ClusterOptions", options); }).Configure <EndpointOptions>(
                options =>
            {
                var opt = new SiloEndpointOptions();
                this.configuration.GetSection("Orleans").Bind("EndpointOptions", opt);
                opt.Bind(options);
            }).ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(MqttRepositoryGrain).Assembly).WithReferences()).ConfigureLogging(
                logging =>
            {
                logging.ClearProviders();
                logging.AddSerilog(dispose: true, logger: this.logger);
            });

            if (dashboardOptions != null)
            {
                builder.UseDashboard(
                    o =>
                {
                    o.HostSelf = true;
                    o.CounterUpdateIntervalMs = dashboardOptions.CounterUpdateIntervalMs;
                    o.Port = dashboardOptions.Port;
                });
            }

            builder.AddSimpleMessageStreamProvider("SMSProvider").AddMemoryGrainStorage("PubSubStore");

            var host = builder.Build();

            return(host);
        }