在开始之前,首先说明一下netty的通信流程,在熟悉了该流程之后对netty的开发就比较明确。
接着上面图继续说明netty的通信,使用netty的io实现rpc功能,并且开发的语言是java,服务的暴露,服务的调用都将采用接口的形式,接口在客户端实现方法调用,接口在服务端实现反射加载。
下面从netty的实现说明rpc服务的调用:
一,服务端的开发:
1,实现rpc服务的调用,前提是你要在服务端实现相应的功能,这里我们就是实现接口,实现接口中的方法,并做相应的业务逻辑处理,并且返回指定的值。
2,netty中ServerBootstrap的初始化,并且初始化一个NioEventLoopGroup作为接受客户端的请求,初始化另一个NioEventLoopGroup作为io操作。
3,注册为NioServerSocketChannel,表示采用server的通道来接受数据
4,设置tcp的参数,保证功能和性能
5,注册pipeline,采用合适的编码解码及处理半包粘包处理,也可以增加自定义的拦截验证等其他
6,注册服务端接受客户端发的handler,该功能主要是接受客户端的请求,然后将结果返回
7,进行ip和端口的绑定,并且启动服务,接受外界请求
EventLoopGroup boosGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boosGroup, workGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
ChannelPipeline pipeline = sc.pipeline();
pipeline.addLast("encode", new StringEncoder());
pipeline.addLast("decode", new StringDecoder());
pipeline.addLast(new HelloServerHandler());
}
});
ChannelFuture future = bootstrap.bind(8080).sync();
future.channel().closeFuture().sync();
} finally {
boosGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
二,客户端的开发
1,需要集成共享服务的接口,通过接口实现对应类,对方方法的调用
2,netty中Bootstrap客户端的初始化,并且初始化NioEventLoopGroup来处理通道
3,注册NioSocketChannel客户端的实现类,标示为客户端的请求
4,设置客户端的tcp参数,确保功能完整和网络性能
5,注册pipeline,采用合适的编码解码及处理半包粘包处理
6,注册客户端的handler,该功能是发送客户端数据请求,并且接受服务端的数据返回
7,链接服务端地址,开启服务功能
EventLoopGroup clentGroup = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(clentGroup)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc)
throws Exception {
ChannelPipeline pipeline = sc.pipeline();
pipeline.addLast(new HelloClientHandler());
}
});
ChannelFuture future = bootstrap.connect("120.0.0.1", 8080).sync();
future.channel().writeAndFlush("hello world");
future.channel().closeFuture().sync();
} catch (Exception e) {
// TODO: handle exception
} finally {
clentGroup.shutdownGracefully();
}