package github.javaguide.remoting.transport.netty.client; import github.javaguide.remoting.dto.RpcRequest; import github.javaguide.remoting.dto.RpcResponse; import github.javaguide.remoting.transport.netty.codec.kyro.NettyKryoDecoder; import github.javaguide.remoting.transport.netty.codec.kyro.NettyKryoEncoder; import github.javaguide.serialize.kyro.KryoSerializer; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; /** * 用于初始化 和 关闭 Bootstrap 对象 * * @author shuang.kou * @createTime 2020年05月29日 17:51:00 */ @Slf4j public final class NettyClient { private static Bootstrap b; private static EventLoopGroup eventLoopGroup; // 初始化相关资源比如 EventLoopGroup、Bootstrap static { eventLoopGroup = new NioEventLoopGroup(); b = new Bootstrap(); KryoSerializer kryoSerializer = new KryoSerializer(); b.group(eventLoopGroup) .channel(NioSocketChannel.class) //连接的超时时间,超过这个时间还是建立不上的话则代表连接失败 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) //是否开启 TCP 底层心跳机制 .option(ChannelOption.SO_KEEPALIVE, true) //TCP默认开启了 Nagle 算法,该算法的作用是尽可能的发送大数据快,减少网络传输。TCP_NODELAY 参数的作用就是控制是否启用 Nagle 算法。 .option(ChannelOption.TCP_NODELAY, true) .handler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) { /*自定义序列化编解码器*/ // RpcResponse -> ByteBuf ch.pipeline().addLast(new NettyKryoDecoder(kryoSerializer, RpcResponse.class)); // ByteBuf -> RpcRequest ch.pipeline().addLast(new NettyKryoEncoder(kryoSerializer, RpcRequest.class)); ch.pipeline().addLast(new NettyClientHandler()); } }); } public static void close() { log.info("call close method"); eventLoopGroup.shutdownGracefully(); } public static Bootstrap getBootstrap() { return b; } }