예제 #1
0
        public override void PostInitialize()
        {
            IGrpcServerConfiguration grpcConfiguration = IocManager.Resolve <IGrpcServerConfiguration>();

            InitializeGrpcServer(grpcConfiguration);
            InitializeConsul(grpcConfiguration);
        }
예제 #2
0
        /// <summary>
        /// 初始化 Consul 服务
        /// </summary>
        /// <param name="config"></param>
        private void InitializeConsul(IGrpcServerConfiguration config)
        {
            if (!config.IsEnableConsul)
            {
                return;
            }

            var currentIpAddress = GetCurrentIpAddress(config);

            _consulClient = IocManager.Resolve <IConsulClientFactory>()
                            .Get(new ConsulRegistryConfiguration(config.ConsulAddress, config.ConsulPort, null));

            _agentServiceRegistration = new AgentServiceRegistration
            {
                ID      = Guid.NewGuid().ToString(),
                Name    = config.RegistrationServiceName,
                Address = currentIpAddress,
                Port    = config.GrpcBindPort,
                Tags    = new[] { "Grpc", $"urlprefix-/{config.RegistrationServiceName}" },
                Check   = new AgentServiceCheck
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                    Interval = TimeSpan.FromSeconds(10),
                    Status   = HealthStatus.Passing,
                    Timeout  = TimeSpan.FromSeconds(5),
                    HTTP     = $"http://{currentIpAddress}:{config.ConsulHealthCheckPort}/health/check"
                }
            };

            _consulClient.Agent.ServiceRegister(_agentServiceRegistration).Wait();
        }
예제 #3
0
        /// <summary>
        /// 初始化 Grpc 服务
        /// </summary>
        /// <param name="config">Grpc 配置项</param>
        private void InitializeGrpcServer(IGrpcServerConfiguration config)
        {
            var options = new MagicOnionOptions();

            options.IsReturnExceptionStackTraceInErrorDetail = true;

            var serviceLocator = new CasteWindsorServiceLocatorBridge(IocManager);

            options.ServiceLocator = serviceLocator;

            // 构建 gRpc 服务。
            MagicOnionServiceDefinition serviceDefine = null;

            if (config.GrpcAssemblies != null)
            {
                serviceDefine = MagicOnionEngine.BuildServerServiceDefinition(config.GrpcAssemblies.ToArray(), options);
            }

            // 注入 gRpc 服务到 IoC 容器当中。
            IocManager.IocContainer.Register(Component.For <MagicOnionServiceDefinition>().Instance(serviceDefine).LifestyleSingleton());
            IocManager.IocContainer.Register(Component.For <IHostedService>().Instance(new PackageMagicOnionServerService(serviceDefine, new[]
            {
                new ServerPort(config.GrpcBindAddress, config.GrpcBindPort, ServerCredentials.Insecure)
            }, null)).LifestyleSingleton());

            AsyncHelper.RunSync(() => IocManager.Resolve <IHostedService>().StartAsync(CancellationToken.None));
        }
예제 #4
0
        /// <summary>
        /// 初始化 Grpc 服务
        /// </summary>
        /// <param name="config">Grpc 配置项</param>
        private void InitializeGrpcServer(IGrpcServerConfiguration config)
        {
            _grpcServer = new GrpcServer
            {
                Ports    = { new ServerPort(config.GrpcBindAddress, config.GrpcBindPort, ServerCredentials.Insecure) },
                Services =
                {
                    MagicOnionEngine.BuildServerServiceDefinition(config.GrpcAssemblies.ToArray(),
                                                                  new MagicOnionOptions(true))
                }
            };

            _grpcServer.Start();
        }
예제 #5
0
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(typeof(AbpGrpcServerModule).Assembly);

            // TODO: 此处为了防止在 Grpc 服务器启动前 Client 开始调用服务,所以放在 Initialize 进行初始化服务器
            IGrpcServerConfiguration grpcConfiguration = IocManager.Resolve <IGrpcServerConfiguration>();

            InitializeGrpcServer(grpcConfiguration);

            if (grpcConfiguration.IsEnableConsul)
            {
                InitializeConsul(grpcConfiguration);
            }
        }
예제 #6
0
        /// <summary>
        /// 获得当前主机的 IP 地址
        /// </summary>
        /// <exception cref="AbpInitializationException">当无法正常获得当前主机 IP 地址的时候会抛出本异常</exception>
        /// <returns>IP 地址的字符串表现形式</returns>
        private string GetCurrentIpAddress(IGrpcServerConfiguration config)
        {
            if (!string.IsNullOrEmpty(config.ConsulHealthCheckAddress))
            {
                return(config.ConsulHealthCheckAddress);
            }

            IPAddress localAddress = Dns.GetHostAddresses(Dns.GetHostName()).FirstOrDefault();

            if (localAddress == null)
            {
                throw new AbpInitializationException("无法初始化项目,无法获取到当前服务器的地址.");
            }
            return(localAddress.ToString());
        }
예제 #7
0
        public GrpcServiceProvider(IGrpcServerConfiguration grpcServerConfiguration, IGrpcClientConfiguration grpcClientConfiguration)
        {
            _grpcServerConfiguration = grpcServerConfiguration;
            _grpcClientConfiguration = grpcClientConfiguration;
            //if (grpcServerConfiguration.GrpcAssemblies == null || grpcServerConfiguration.GrpcAssemblies.Count == 0)
            //{
            //    throw new ArgumentNullException("GrpcAssemblies of grpcServerConfiguration can not be null ,are you missing AddRpcServiceAssembly ?");
            //}
            //var types = new List<Type>();
            //foreach (var assembly in grpcServerConfiguration.GrpcAssemblies)
            //{
            //    var interfaceType = assembly.GetTypes().Where(o => o.IsInterface && o.CustomAttributes.Any(c => c.AttributeType == typeof(MagicOnionGrpcAttribute)));
            //    types.AddIfNotContains(interfaceType);
            //}
            //_needProxyTypes = types.ToArray();

            //var clientTypes = new List<Type>();
            //foreach (var assembly in grpcClientConfiguration.GrpcClientAssemblies)
            //{
            //    var interfaceType = assembly.GetTypes().Where(o => o.IsInterface && o.CustomAttributes.Any(c => c.AttributeType == typeof(MagicOnionGrpcAttribute)));
            //    clientTypes.AddIfNotContains(interfaceType);
            //}
            //_needProxyClientInterfaceTypes = clientTypes.ToArray();
        }