public override void PostInitialize() { IGrpcServerConfiguration grpcConfiguration = IocManager.Resolve <IGrpcServerConfiguration>(); InitializeGrpcServer(grpcConfiguration); InitializeConsul(grpcConfiguration); }
/// <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(); }
/// <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)); }
/// <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(); }
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); } }
/// <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()); }
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(); }