Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

高性能网络通信框架Netty从入门到核心源码剖析 PDF 下载


分享到:
时间:2021-03-15 10:02来源:http://www.java1234.com 作者:转载  侵权举报
高性能网络通信框架Netty从入门到核心源码剖析 PDF 下载
失效链接处理
高性能网络通信框架Netty从入门到核心源码剖析 PDF 下载


本站整理下载:
提取码:2don 
 
 
相关截图:
 
主要内容:


Netty初探 NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 SocketChannel、 ByteBuffer等。 开发工作量和难度都非常大: 例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处 理等等。 Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。且Netty拥有高性能、 吞吐量更高,延迟更 低,减少资源消耗,最小化不必要的内存复制等优点。 Netty 现在都在用的是4.x,5.x版本已经废弃,Netty 4.x 需要JDK 6以上版本支持 Netty的使用场景: 1)互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步 高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现。各进程节 点之间的内部通信。Rocketmq底层也是用的Netty作为基础通信组件。 2)游戏行业:无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基 础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈。 3)大数据领域:经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨界点通 信,它的 Netty Service 基于 Netty 框架二次封装实现。 netty相关开源项目:https://netty.io/wiki/related-projects.html Netty通讯示例 Netty的maven依赖: 1 <dependency> 2 <groupId>io.netty</groupId> 3 <artifactId>netty‐all</artifactId> 4 <version>4.1.35.Final</version> 5 </dependency> 服务端代码: 1 public class NettyServer { 23 public static void main(String[] args) throws Exception { 45 //创建两个线程组bossGroup和workerGroup, 含有的子线程NioEventLoop的个数默认为cpu核数的两倍 6 // bossGroup只是处理连接请求 ,真正的和客户端业务处理,会交给workerGroup完成 7 EventLoopGroup bossGroup = new NioEventLoopGroup(1); 8 EventLoopGroup workerGroup = new NioEventLoopGroup(); 9 try { 10 //创建服务器端的启动对象 11 ServerBootstrap bootstrap = new ServerBootstrap(); 12 //使用链式编程来配置参数 13 bootstrap.group(bossGroup, workerGroup) //设置两个线程组 14 .channel(NioServerSocketChannel.class) //使用NioServerSocketChannel作为服务器的通道实现 15 // 初始化服务器连接队列大小,服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。 16 // 多个客户端同时来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理 17 .option(ChannelOption.SO_BACKLOG, 1024) 18 .childHandler(new ChannelInitializer<SocketChannel>() {//创建通道初始化对象,设置初始化参数 1920 @Override 21 protected void initChannel(SocketChannel ch) throws Exception {
图灵诸葛老师
22 //对workerGroup的SocketChannel设置处理器 23 ch.pipeline().addLast(new NettyServerHandler()); 24 } 25 }); 26 System.out.println("netty server start。。"); 27 //绑定一个端口并且同步, 生成了一个ChannelFuture异步对象,通过isDone()等方法可以判断异步事件的执行情况 28 //启动服务器(并绑定端口),bind是异步操作,sync方法是等待异步操作执行完毕 29 ChannelFuture cf = bootstrap.bind(9000).sync(); 30 //给cf注册监听器,监听我们关心的事件 31 /*cf.addListener(new ChannelFutureListener() { 32 @Override 33 public void operationComplete(ChannelFuture future) throws Exception { 34 if (cf.isSuccess()) { 35 System.out.println("监听端口9000成功"); 36 } else { 37 System.out.println("监听端口9000失败"); 38 } 39 } 40 });*/ 41 //对通道关闭进行监听,closeFuture是异步操作,监听通道关闭 42 // 通过sync方法同步等待通道关闭处理完毕,这里会阻塞等待通道关闭完成 43 cf.channel().closeFuture().sync(); 44 } finally { 45 bossGroup.shutdownGracefully(); 46 workerGroup.shutdownGracefully(); 47 } 48 } 49 } 505152 /** 53 * 自定义Handler需要继承netty规定好的某个HandlerAdapter(规范) 54 */ 55 public class NettyServerHandler extends ChannelInboundHandlerAdapter { 5657 /** 58 * 读取客户端发送的数据 59 * 60 * @param ctx 上下文对象, 含有通道channel,管道pipeline 61 * @param msg 就是客户端发送的数据 62 * @throws Exception 63 */ 64 @Override 65 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 66 System.out.println("服务器读取线程 " + Thread.currentThread().getName()); 67 //Channel channel = ctx.channel(); 68 //ChannelPipeline pipeline = ctx.pipeline(); //本质是一个双向链接, 出站入站 69 //将 msg 转成一个 ByteBuf,类似NIO 的 ByteBuffer 70 ByteBuf buf = (ByteBuf) msg; 71 System.out.println("客户端发送消息是:" + buf.toString(CharsetUtil.UTF_8)); 72 } 73

 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐