示例#1
0
        public SnowflakeIdGenerationService(
            IOptions <NetworkOptions> networkOptions,
            ISchubertEnvironment schubertEnvironment,
            ILoggerFactory loggerFactory)
        {
            Guard.ArgumentNotNull(networkOptions, nameof(networkOptions));
            Guard.ArgumentNotNull(schubertEnvironment, nameof(schubertEnvironment));

            var logger     = loggerFactory?.CreateLogger <SnowflakeIdGenerationService>() ?? (ILogger)NullLogger.Instance;
            var lanOptions = networkOptions.Value.Lans.FirstOrDefault(x => x.DataCenterId == networkOptions.Value.DataCenterId);

            if ((networkOptions.Value.DataCenterId <= 0 || lanOptions == null) && !schubertEnvironment.IsDevelopmentEnvironment)
            {
                throw new InvalidOperationException($"未能从 Schubert:Network 中查找到合法的 DataCenterId," +
                                                    $"{nameof(NetworkOptions)}.{nameof(NetworkOptions.DataCenterId)} 必须使用 {nameof(NetworkOptions)}.{nameof(NetworkOptions.Lans)} 中配置过的数据中心 id。");
            }

            var serverId     = lanOptions?.GetServerId();
            var dataCenterId = networkOptions.Value.DataCenterId;

            if (!serverId.HasValue)
            {
                if (!schubertEnvironment.IsDevelopmentEnvironment)
                {
                    throw new SchubertException($"Snowflake 唯一 Id 生成配置错误,必须保证 {nameof(NetworkOptions)} 至少配置了一个{nameof(NetworkOptions.Lans)},且与本机 Id 地址匹配。");
                }
                else
                {
                    logger.WriteWarning($"无法获取当应用所在的数据中心和 ip 地址,Snowflake id 生成算法将使用省缺配置(datacenter:1,worker: 1)。");
                    serverId     = 1;
                    dataCenterId = 1;
                }
            }
            _worker = new SnowflakeWorker(serverId.Value - 1, dataCenterId - 1);
        }
示例#2
0
        ///// <summary>
        ///// 获取应用程序当前的运行时 Framework (暂时只支持判断 Microsoft 平台,Mono等平台可能显示为 Unknown)。
        ///// </summary>
        //public RuntimeFramework Framework
        //{
        //    get
        //    {
        //        if (this.FrameworkName == null)
        //        {
        //            return RuntimeFramework.Unknown;
        //        }
        //        switch (this.FrameworkName.Identifier)
        //        {
        //            case "DNXCore":
        //                return RuntimeFramework.DNXCore;
        //            case "DNX":
        //                return RuntimeFramework.DNX;
        //            case ".NetFramework":
        //                return RuntimeFramework.Net;
        //            default:
        //                return RuntimeFramework.Unknown;
        //        }
        //    }
        //}

        internal void LoadEnvironment(IServiceProvider serviceProvider)
        {
            Guard.ArgumentNotNull(serviceProvider, nameof(serviceProvider));

            ISchubertEnvironment hosting = serviceProvider.GetService <ISchubertEnvironment>();

            _environment       = hosting;
            this.FrameworkName = hosting.RuntimeFramework;
        }
示例#3
0
        public AppDataFolderRoot(IPathProvider pathProvider, ISchubertEnvironment environment, IOptions <SchubertOptions> options)
        {
            Guard.ArgumentNotNull(pathProvider, nameof(pathProvider));
            Guard.ArgumentNotNull(environment, nameof(environment));
            Guard.ArgumentNotNull(options, nameof(options));

            _environment  = environment;
            _pathProvider = pathProvider;
            _appName      = options.Value?.AppSystemName ?? "Unnamed App";
        }
示例#4
0
        private async Task LoadRemoteConfigurationAsync(ZookeeperClient client, bool firstLoad = false)
        {
            _firstLoaded = false;
            _logger      = (_logger ?? SchubertEngine.Current.GetService <ILoggerFactory>()?.CreateLogger(this.GetType().Name)) ?? NullLogger.Instance;
            _environment = (_environment ?? SchubertEngine.Current.GetRequiredService <ISchubertEnvironment>());

            string path = $"{this.RootNodePath.TrimEnd('/')}/{_nodeName}";

            if (await CheckNodeExistedAsync(client, path, firstLoad))
            {
                await LoadConfigurationDataAsync(client, firstLoad, path);
            }
        }
示例#5
0
        private static void LogEngineStarted(IServiceProvider provider)
        {
            ILoggerFactory loggerFactory = provider.GetService <ILoggerFactory>();
            ILogger        logger        = loggerFactory?.CreateLogger("Schubert") ?? NullLogger.Instance;

            ISchubertEnvironment schubertEnvironment = provider.GetRequiredService <ISchubertEnvironment>();

            StringBuilder builder = new StringBuilder();

            builder.AppendLine("Schubert engine was started.");
            var properties = schubertEnvironment.ToDictionary();

            foreach (var kv in properties)
            {
                builder.AppendLine($"{kv.Key}: {kv.Value}");
            }
            logger.WriteInformation(builder.ToString());
        }
示例#6
0
        public DefaultPathProvider(ISchubertEnvironment applicationEnvironment)
        {
            Guard.ArgumentNotNull(applicationEnvironment, nameof(applicationEnvironment));

            _applicationEnvironment = applicationEnvironment;
        }