NettyClient.java 2.6 KB
Newer Older
S
shuang.kou 已提交
1
package github.javaguide.remoting.transport.netty.client;
S
shuang.kou 已提交
2

S
shuang.kou 已提交
3 4
import github.javaguide.remoting.dto.RpcRequest;
import github.javaguide.remoting.dto.RpcResponse;
S
shuang.kou 已提交
5
import github.javaguide.serialize.kyro.KryoSerializer;
S
shuang.kou 已提交
6 7
import github.javaguide.remoting.transport.netty.codec.kyro.NettyKryoDecoder;
import github.javaguide.remoting.transport.netty.codec.kyro.NettyKryoEncoder;
S
shuang.kou 已提交
8 9 10 11 12 13 14
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;
15
import lombok.extern.slf4j.Slf4j;
S
shuang.kou 已提交
16 17 18 19 20 21 22

/**
 * 用于初始化 和 关闭 Bootstrap 对象
 *
 * @author shuang.kou
 * @createTime 2020年05月29日 17:51:00
 */
23 24 25 26
@Slf4j
public final class NettyClient {
    private static Bootstrap b;
    private static EventLoopGroup eventLoopGroup;
S
shuang.kou 已提交
27

28 29 30
    private NettyClient() {
    }

S
shuang.kou 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    // 初始化相关资源比如 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<SocketChannel>() {
                    @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() {
58
        log.info("call close method");
S
shuang.kou 已提交
59 60 61 62 63 64 65
        eventLoopGroup.shutdownGracefully();
    }

    public static Bootstrap initializeBootstrap() {
        return b;
    }
}