/// <summary>
        /// 是否是使用Consul
        /// </summary>
        /// <param name="discovery"></param>
        /// <returns></returns>
        private static bool EnableConsul(GrpcDiscoveryElement discovery, out string address)
        {
            address = string.Empty;
            var configPath = discovery?.Consul?.Path;

            if (string.IsNullOrWhiteSpace(configPath))
            {
                return(false);
            }

            if (!File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, discovery.Consul.Path)))
            {
                throw new Exception($"[{discovery.Consul.Path}] not exist at [{AppDomain.CurrentDomain.BaseDirectory}]");
            }

            var consulSection = ConfigBuilder.Build <ConsulServerSection>(Constants.ConsulServerSectionName, configPath);

            if (string.IsNullOrWhiteSpace(consulSection?.Service?.Address))
            {
                return(false);
            }

            address = consulSection?.Service?.Address;
            return(true);
        }
        /// <summary>
        /// 解析服务配置
        /// </summary>
        /// <param name="configFile"></param>
        /// <returns></returns>
        private static GrpcServiceElement ResolveServiceConfiguration(string configFile)
        {
            var grpcSection = ConfigBuilder.Build <GrpcClientSection>(Constants.GrpcClientSectionName, configFile);

            if (grpcSection == null || grpcSection.Service == null)
            {
                throw new ArgumentNullException($"service config error");
            }

            return(grpcSection.Service);
        }
        /// <summary>
        /// 解析Consul配置
        /// </summary>
        /// <returns></returns>
        private static string ResolveConsulConfiguration(ServiceElement service)
        {
            var configPath = service.Consul?.Path;

            if (string.IsNullOrWhiteSpace(configPath))
            {
                return(string.Empty);
            }

            var consulSection = ConfigBuilder.Build <ConsulServerSection>(Constants.ConsulServerSectionName, configPath);

            return(consulSection?.Service?.Address);
        }
        /// <summary>
        /// 解析配置
        /// </summary>
        /// <param name="configPath"></param>
        private static ServiceElement ResolveServiceConfiguration(GrpcOptions grpcOptions = null)
        {
            var sectionName = Constants.GrpcServerSectionName;
            var grpcSection = ConfigBuilder.Build <GrpcServerSection>(sectionName, grpcOptions?.ConfigPath);

            if (grpcSection == null)
            {
                throw new ArgumentNullException(sectionName);
            }

            var service = grpcSection.Service;

            if (service == null)
            {
                throw new ArgumentNullException($"service");
            }

            if (string.IsNullOrWhiteSpace(service.Name))
            {
                throw new ArgumentNullException("serviceName");
            }

            if (service.Port <= 0)
            {
                if (!string.IsNullOrWhiteSpace(grpcOptions.ListenAddress))
                {
                    var splits = grpcOptions.ListenAddress?.Split(":");
                    if (splits?.Length == 3 && int.TryParse(splits[2], out int port))
                    {
                        service.Port = port;
                    }
                }
                if (service.Port <= 0)
                {
                    throw new ArgumentNullException("servicePort");
                }
            }

            return(grpcSection.Service);
        }