在开始之前,首先说明一下netty的通信流程,在熟悉了该流程之后对netty的开发就比较明确。

spring boot nginx centos 高并发优化_网络

接着上面图继续说明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();
		}