Ejemplo n.º 1
0
        public async Task <string> GetApiUrl(long version)
        {
            string appId  = _setting.AppId;
            string secret = _setting.AppSercet;

            var path = $"/configs/{_setting.AppId}/{_setting.NamespaceName}";

            var query = $"version={version}";

            var sign = $"appId={appId}&appSecret={secret}&namespaceName={_setting.NamespaceName}";

            var pathAndQuery = $"{path}?{query}&env={_setting.Env}&sign=" + SecureHelper.SHA256(sign);

            if (_setting.UseServiceDiscovery)
            {
                var _loadBalancerHouse = _serviceProvider.GetRequiredService <ILoadBalancerHouse>();
                var _balancer          = await _loadBalancerHouse.Get(_setting.ServiceName, "RoundRobin");

                var HostAndPort = await _balancer.Lease();

                _setting.ServerUrl = $"{HostAndPort.ToUri()}";
            }

            return($"{_setting.ServerUrl.TrimEnd('/')}{pathAndQuery}");
        }
Ejemplo n.º 2
0
        private string AssembleQueryConfigUrl(string url)
        {
            // 配置请求地址
            string appId  = _setting.AppId;
            string secret = _setting.AppSercet;

            var uri   = $"{url.TrimEnd('/')}/configs/{_setting.AppId}/{_setting.NamespaceName}";
            var query = $"version={_config.Version}";
            var sign  = $"appId={appId}&appSecret={secret}&namespaceName={_setting.NamespaceName}";

            return($"{uri}?{query}&sign=" + SecureHelper.SHA256(sign));
        }
Ejemplo n.º 3
0
        public string GetApiUrl(long version)
        {
            string appId  = _setting.AppId;
            string secret = _setting.AppSercet;

            var path = $"/configs/{_setting.AppId}/{_setting.NamespaceName}";

            var query = $"version={version}";

            var sign = $"appId={appId}&appSecret={secret}&namespaceName={_setting.NamespaceName}";

            var pathAndQuery = $"{path}?{query}&env={_setting.Env}&sign=" + SecureHelper.SHA256(sign);

            return($"{_setting.ServerUrl.TrimEnd('/')}{pathAndQuery}");
        }
Ejemplo n.º 4
0
        private string GetApiUrl()
        {
            string appId = _options.AppId;

            string secret = _options.AppSercet;

            var path = $"/configs/{_options.AppId}/{_options.NamespaceName}";

            var query = $"version=0";

            var sign = $"appId={appId}&appSecret={secret}&namespaceName={_options.NamespaceName}";

            var pathAndQuery = $"{path}?{query}&env={_options.Env}&sign=" + SecureHelper.SHA256(sign);

            return($"{_options.ServerUrl.TrimEnd('/')}{pathAndQuery}");
        }
Ejemplo n.º 5
0
        private string AssembleQueryConfigUrl()
        {
            string url = string.Empty;

            if (_setting.UseServiceDiscovery && _loadBalancerHouse != null)
            {
                var _load       = _loadBalancerHouse.Get(_setting.ServiceName, "RoundRobin").GetAwaiter().GetResult();
                var HostAndPort = _load.Lease().GetAwaiter().GetResult();
                url = $"{HostAndPort.ToUri()}";
            }
            else
            {
                url = _setting.ServerUrl;
            }
            string appId  = _setting.AppId;
            string secret = _setting.AppSercet;

            var uri   = $"{url.TrimEnd('/')}/configs/{_setting.AppId}/{_setting.NamespaceName}";
            var query = $"version={_config.Version}";
            var sign  = $"appId={appId}&appSecret={secret}&namespaceName={_setting.NamespaceName}";

            return($"{uri}?{query}&sign=" + SecureHelper.SHA256(sign));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 查询项目配置信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <QueryConfigOutput> QueryConfig(QueryConfigInput input)
        {
            // 验证
            if (input.AppId.IsEmpty())
            {
                throw new BucketException("config_001", "AppId不能为空");
            }
            if (input.Sign.IsEmpty())
            {
                throw new BucketException("config_002", "签名不能为空");
            }
            if (input.NamespaceName.IsEmpty())
            {
                throw new BucketException("config_005", "NamespaceName不能为空");
            }
            // 返回结果
            var result = new QueryConfigOutput()
            {
                KV = new Dictionary <string, string>(), Version = input.Version
            };
            // 项目与签名验证
            var project = await _dbContext.Queryable <AppInfo>().Where(it => it.AppId == input.AppId).FirstAsync();

            if (project == null)
            {
                throw new BucketException("config_003", "项目不存在");
            }
            var signstr = $"version={input.Version}&env={input.Env}&appId={project.AppId}&appSecret={project.Secret}&namespaceName={input.NamespaceName}";
            var sign    = Bucket.Utility.Helpers.Encrypt.SHA256(signstr);

            sign = SecureHelper.SHA256(signstr);
            if (sign.ToLower() != input.Sign)
            {
                throw new BucketException("config_004", "签名错误");
            }
            // 环境库
            Enum.TryParse <Env>(input.Env.SafeString().ToLower(), out var env);
            var tableName = "tb_appconfig_test";

            switch (env)
            {
            case Env.dev:
                tableName = $"tb_appconfig_{Env.dev.ToString()}";
                break;

            case Env.pro:
                tableName = $"tb_appconfig_{Env.pro.ToString()}";
                break;

            case Env.prepro:
                tableName = $"tb_appconfig_{Env.prepro.ToString()}";
                break;

            case Env.uat:
                tableName = $"tb_appconfig_{Env.uat.ToString()}";
                break;

            default:
                throw new BucketException("config_06", "环境不存在");
            }
            // 配置查询
            var namespaceList = await _dbContext.Queryable <AppNamespaceInfo>()
                                .Where(it => it.AppId == project.AppId && it.IsDeleted == false && it.IsPublic == true)
                                .Select(it => new { it.Name })
                                .ToListAsync();

            var namespaceKeyList = namespaceList.Select(it => it.Name).ToList();

            namespaceKeyList.Add(input.NamespaceName);
            if (namespaceKeyList.Count > 0)
            {
                var config = await _dbContext.Queryable <AppConfigInfo>().AS(tableName)
                             .Where(it => it.ConfigAppId == project.AppId && it.IsDeleted == false && namespaceKeyList.Contains(it.ConfigNamespaceName) && it.Version > input.Version)
                             .ToListAsync();

                if (config.Count > 0)
                {
                    result.Version = config.Max(it => it.Version);
                    config.ForEach(p =>
                    {
                        result.KV.Add(p.ConfigKey, p.ConfigValue);
                    });
                }
            }
            result.AppName = project.Name;
            return(result);
        }