/// <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; } }
/// <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)); }
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); } }; }