Esempio n. 1
0
        /// <inheritdoc />
        /// <summary> 创建客户端 </summary>
        /// <param name="serviceAddress">终结点。</param>
        /// <returns>传输客户端实例。</returns>
        public IMicroClient CreateClient(ServiceAddress serviceAddress)
        {
            //_logger.Debug($"准备为服务端地址:{endPoint}创建客户端。");
            try
            {
                var lazyClient = _clients.GetOrAdd(serviceAddress.ToString(), k => new Lazy <IMicroClient>(() =>
                {
                    _logger.LogDebug($"创建客户端:{serviceAddress}创建客户端。");
                    var bootstrap = _bootstrap;
                    var channel   = bootstrap.ConnectAsync(serviceAddress.ToEndPoint(false)).Result;
                    var listener  = new MessageListener();
                    var sender    = new DotNettyClientSender(_codecFactory.GetEncoder(), channel);
                    channel.GetAttribute(ListenerKey).Set(listener);
                    channel.GetAttribute(SenderKey).Set(sender);

                    channel.GetAttribute(ServiceAddressKey).Set(serviceAddress);
                    return(new MicroClient(_logger, sender, listener, _microExecutor));
                }
                                                                                                           ));
                return(lazyClient.Value);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "创建客户端失败");
                _clients.TryRemove(serviceAddress.ToString(), out _);
                throw;
            }
        }
Esempio n. 2
0
        /// <inheritdoc />
        /// <summary> 创建客户端 </summary>
        /// <param name="serviceAddress">终结点。</param>
        /// <returns>传输客户端实例。</returns>
        protected override async Task <IMicroClient> Create(ServiceAddress serviceAddress)
        {
            var bootstrap = CreateBootstrap(serviceAddress);
            var channel   = await bootstrap.ConnectAsync(serviceAddress.ToEndPoint(false));

            var listener = new MessageListener();
            var codec    = Provider.GetClientCodec(serviceAddress.Codec);
            var sender   = new DotNettyClientSender(codec, channel, serviceAddress);

            channel.GetAttribute(ListenerKey).Set(listener);
            channel.GetAttribute(SenderKey).Set(sender);
            channel.GetAttribute(ServiceAddressKey).Set(serviceAddress);
            return(new MicroClient(sender, listener, MicroExecutor, LoggerFactory));
        }
Esempio n. 3
0
        private void InitNetty(IContainer container)
        {
            var factory = container.Resolve <ClientSenderFactory>();

            var loggerFactory = container.Resolve <ILoggerFactory>();
            var logger        = loggerFactory.Create(this.GetType());
            var bootstrap     = new Bootstrap();

            logger.Info($"[config]use dotnetty for transfer");

            bootstrap
            .Group(new MultithreadEventLoopGroup())
            .Channel <TcpSocketChannel>()
            .Option(ChannelOption.TcpNodelay, true)
            .Handler(new ActionChannelInitializer <IChannel>(channel =>
            {
                var pipeline = channel.Pipeline;
                pipeline.AddLast(new LengthFieldPrepender(4));
                pipeline.AddLast(new LengthFieldBasedFrameDecoder(int.MaxValue, 0, 4, 0, 4));
                pipeline.AddLast(new ReadClientMessageChannelHandlerAdapter(logger));
                pipeline.AddLast(new ClientHandlerChannelHandlerAdapter(factory, logger));
            }));
            //AttributeKey<IClientSender> clientSenderKey = AttributeKey<IClientSender>.ValueOf(typeof(DefaultTransportClientFactory), nameof(IClientSender));
            AttributeKey <ClientListener> clientListenerKey = AttributeKey <ClientListener> .ValueOf(typeof(ClientSenderFactory), nameof(ClientListener));

            //AttributeKey<EndPoint> endPointKey = AttributeKey<EndPoint>.ValueOf(typeof(DefaultTransportClientFactory), nameof(EndPoint));
            AttributeKey <string> endPointKey = AttributeKey <string> .ValueOf(typeof(ClientSenderFactory), "addresscode");

            factory.ClientSenderCreator += (JimuAddress address, ref IClientSender client) =>
            {
                //if (client == null && address.GetType().IsAssignableFrom(typeof(DotNettyAddress)))
                if (client == null && address.Protocol == "Netty")
                {
                    var ep       = address.CreateEndPoint();
                    var channel  = bootstrap.ConnectAsync(ep).Result;
                    var listener = new ClientListener();
                    channel.GetAttribute(clientListenerKey).Set(listener);
                    //var sender = new DotNettyClientSender(channel, logger);
                    //channel.GetAttribute(clientSenderKey).Set(sender);
                    channel.GetAttribute(endPointKey).Set($"{address.Protocol}-{address.Code}");
                    client = new DotNettyClientSender(listener, logger, channel);
                }
            };
        }