Ejemplo n.º 1
0
        public override async Task Start(ServiceAddress serviceAddress)
        {
            _logger.Debug($"准备启动服务主机,监听地址:{serviceAddress}。");
            var bossGroup   = new MultithreadEventLoopGroup(1);
            var workerGroup = new MultithreadEventLoopGroup();//Default eventLoopCount is Environment.ProcessorCount * 2
            var bootstrap   = new ServerBootstrap();

            bootstrap
            .Group(bossGroup, workerGroup)
            .Channel <TcpServerSocketChannel>()
            .Option(ChannelOption.SoBacklog, 100)
            .ChildOption(ChannelOption.Allocator, PooledByteBufferAllocator.Default)
            .ChildHandler(new ActionChannelInitializer <ISocketChannel>(channel =>
            {
                var pipeline = channel.Pipeline;
                pipeline.AddLast(new LengthFieldPrepender(4));
                pipeline.AddLast(new LengthFieldBasedFrameDecoder(int.MaxValue, 0, 4, 0, 4));
                pipeline.AddLast(new MicroMessageHandler(_coderFactory.GetDecoder()));
                pipeline.AddLast(new ServerHandler(async(contenxt, message) =>
                {
                    var sender = new DotNettyServerSender(_coderFactory.GetEncoder(), contenxt);
                    await OnReceived(sender, message);
                }));
            }));
            var endPoint = serviceAddress.ToEndPoint();

            _channel = await bootstrap.BindAsync(endPoint);

            _logger.Info($"服务主机启动成功,监听地址:{serviceAddress}。");
        }
Ejemplo n.º 2
0
        /// <summary> 创建客户端 </summary>
        /// <param name="endPoint">终结点。</param>
        /// <returns>传输客户端实例。</returns>
        public IMicroClient CreateClient(EndPoint endPoint)
        {
            var key = endPoint;

            try
            {
                return(_clients.GetOrAdd(key, k => new Lazy <IMicroClient>(() =>
                {
                    _logger.Debug($"准备为服务端地址:{key}创建客户端。");
                    var bootstrap = _bootstrap;
                    var channel = bootstrap.ConnectAsync(k).Result;
                    var listener = new MessageListener();
                    var sender = new DotNettyClientSender(_coderFactory.GetEncoder(), channel);
                    channel.GetAttribute(OrigEndPointKey).Set(k);
                    channel.GetAttribute(ListenerKey).Set(listener);
                    channel.GetAttribute(SenderKey).Set(sender);
                    return new MicroClient(sender, listener, _microExecutor);
                }
                                                                           )).Value);
            }
            catch (Exception ex)
            {
                _logger.Error("创建客户端失败", ex);
                _clients.TryRemove(key, out _);
                throw;
            }
        }