Netty介绍

Netty is an asynchronous event-driven network application framework 

for rapid development of maintainable high performance protocol servers & clients.

netty 官网如是说。大概意思是netty 是一个异步的事件驱动的网络应用框架,能够高速开发可维护的高性能网络server、client应用。

asynchronous异步,netty中非常大一部分方法都是异步的,配合事件驱动模型可以处理很多其它请求。

netty的一致性API相比于JDK的API有非常高的用户体验,

使用起来也非常方便。netty使我们不用考虑太多底层问题和各种各样的bug。让开发人员可以更专注于业务逻辑。

netty现状

这是netty在github的主页 https://github.com/netty/netty 。眼下已经有5000+的star

非常多知名公司和项目在使用netty,包含facebook、IBM、RedHat等大公司和Spark、Finagle、Nifty等项目。

很多其它的adaptor在http://netty.io/wiki/adopters.html

眼下netty的主要维护版本号有3.x 、4.x 、5.x。

我接触比較多的是5.x,非常多框架是基于3.x开发的。3 4 5之间有一些区别,

我觉得新的版本号是在以往的经验和教训上开发出来的。用的基本的5。

netty做什么事情

http://netty.io/images/components.png

netty对JDK的NIO进行了封装,为开发人员提供了一致性和良好的API。

netty提供了非常多更好的"JDK API"实现。比方它的ByteBuf。

快的定义是什么

快, 我想尽快得到一个东西和我想尽快得到全部的东西。

在ServerClient编程中。前者能够觉得是low latency, 更低的延迟, 尽快完毕一个请求; 而后者是high throughput。更大的系统吞吐量。

可扩展性scalability

我们须要系统在大量请求时可以平滑的减少性能而且当我们提升硬件配置时可以获得对应的性能提升。

不同paradigm的Server

1.单线程模式

handle假设没有在新线程中运行那么while循环将会block在handle处理上,一次仅仅能处理一个请求。

</pre></h3><h3 style="margin:30px 0px 0px; font-size:16px; line-height:1.5; color:rgb(51,51,51); font-family:Arial,sans-serif"><pre name="code" class="java">ServerSocket serverSocket = new ServerSocket(port);
while(true){
Socket socket = serverSocket.accept();
handle(socket);
}
private void handle(Socket socket){
try(
InputStream inputStream = socket.getInputStream();
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
){
String line;
while((line = br.readLine()) != null){
System.out.println("Read line : " + line);
writer.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}

2.多线程运行

一个请求相应一个线程。当涌现大量请求时线程的创建、销毁、ContextSwitch的overhead都回影响系统性能

ServerSocket serverSocket = new ServerSocket(port);
while(true){
Socket socket = serverSocket.accept();
new Thread(){
@Override
public void run(){
handle(socket);
}
}.start();
}

3.线程池

线程池并没有解决一请求一线程的问题。仅仅能有限降低线程创建的开销和控制线程的创建。

Executor executor = Executors.newFixedThreadPool(100);
ServerSocket serverSocket = new ServerSocket(port);
while(true){
Socket socket = serverSocket.accept();
executor.execute(new Runnable() {
@Override
public void run() {
handle(socket);
}
});
}

4.JDK NIO

思考一下。问题出在handle(socket)上。InputStream 和OutputStream的基于字节的读写方式,的read write操作都是block操作,当没有bytes能够read或者write时运行线程都会block。

 graph
from 《netty in action》

JDK1.4 提供了nio实现, nio当时有两种说法,new io 和non blocking io, 如今过去这么多年了。已经不再new了,大家都称之为non blocking io。

介绍几个核心java.nio包中包含一些Buffer,核心是ByteBuffer,程序与网络层交互还是以byte流的形式。ByteBuffer有heap buffer 和direct buffer(non heap buffer)两种。head buffer 在Java heap 堆中。

使用byte数组作为其内部数据结构,direct buffer 在Java 堆内存之外。

java.nio.channels中有Channel和Selector两个比較重要的类。Channel代表了一个和能够读写的目标的通道,实现类有FileChannel、ServerSocketChannel、SocketChannel等,Selector用于注冊Channel感兴趣的事件。这样我们就能够实现asynchronous event-driven了,实现一个线程处理多个请求,多路复用(multiplexing)

version=1&modificationDate=1438509139496&api=v2" alt="" style="max-width:100%">

ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(port));
serverChannel.configureBlocking(false);
Selector selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while(true){
selector.select();
Set<SelectionKey> selectionKeySet = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeySet.iterator();
while(iterator.hasNext()){
SelectionKey selectionKey = iterator.next();
iterator.remove();
if(selectionKey.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
SocketChannel client = server.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE, ByteBuffer.allocate(BUFFER_SIZE));
}
if(selectionKey.isReadable()){
SocketChannel client = (SocketChannel) selectionKey.channel();
ByteBuffer buf = (ByteBuffer) selectionKey.attachment();
client.read(buf);
}
if(selectionKey.isWritable()){
SocketChannel client = (SocketChannel) selectionKey.channel();
ByteBuffer buf = (ByteBuffer) selectionKey.attachment();
buf.flip();
client.write(buf);
buf.compact();
}
}
}

这个CPU占用比較严重

5. netty nio

为了演示把功能放到了一个块里。netty中我们的byte解析业务实现都能够用ChannelHandler来实现,ChannelHandler串联在ChannelPipeline形成了一种类插件的形式。通过Filter chain使各个逻辑相互独立可复用。

int port = 8090;
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
try{
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<io.netty.channel.socket.SocketChannel>() {
@Override
protected void initChannel(io.netty.channel.socket.SocketChannel ch) throws Exception {
ch.pipeline().addLast("echoHandler", new ChannelHandlerAdapter() {
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
} @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write(msg);
} @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
});
}
});
ChannelFuture f = serverBootstrap.bind(new InetSocketAddress(port)).sync();
f.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}

未完待续。。

continuning...

很多其它推荐资料

netty in action

http://g.oswego.edu/


netty开发教程(一)的更多相关文章

  1. Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...

  2. springboot 使用webflux响应式开发教程(二)

    本篇是对springboot 使用webflux响应式开发教程(一)的进一步学习. 分三个部分: 数据库操作webservicewebsocket 创建项目,artifactId = trading- ...

  3. CocosCreate 与 Netty 开发斗地主 (一步一步开发)

    CocosCreate 与  Netty 开发斗地主 开发此教程的目的是为了教会大家基本的使用Netty,通过一个小例子来教会大家制作斗地主游戏服务器,采用WebSocket方式! 目前正在制作阶段, ...

  4. ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)

    前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...

  5. ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑

    前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...

  6. ASP.NET Aries 入门开发教程4:查询区的下拉配置

    背景: 今天去深圳溜达了一天,刚回来,看到首页都是微软大法好,看来离.NET的春天就差3个月了~~ 回到正题,这篇的教程讲解下拉配置. 查询区的下拉配置: 1:查询框怎么配置成下拉? 在配置表头:格式 ...

  7. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  8. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能

    在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...

随机推荐

  1. main之前初始化流程

    main之前初始化流程 本文分别介绍Keil调用的ARMCC以及ARM-NONE-EABI-GCC两个编译器在main之前的操作: Keil MDK启动文件 总结一下MDK的启动流程: 1.系统初始化 ...

  2. [转载] Java学习之Hessian通信基础

    转载自http://blog.sina.com.cn/s/blog_7f73e06d0100xn9j.html 一.首先先说Hessian是什么?    Hessian:hessian是一个轻量级的r ...

  3. Google Python编程规范

    http://pan.baidu.com/s/1dD1Ra7J 其他语言的编程风格: http://zh-google-styleguide.readthedocs.org/en/latest/

  4. javascript 的继承

    我们的JavaScript比较特别了,主要通过原型链实现继承的. 下面介绍各种实现继承的方式:原型链继承,借用构造函数,组合继承,原型式继承,寄生式继承,寄生组合式继承. 二.实现继承方式 1.原型链 ...

  5. spring4+srpingmvc+mybatis基本框架(app后台框架搭建一)

    前言: 随着spring 越来越强大,用spring4来搭建框架也是很快速,问题是你是对spring了解有多深入.如果你是新手,那么在搭建的过程中可以遇到各种各样奇葩的问题. SSM框架的搭建是作为我 ...

  6. springboot整合shiro

    请大家在看本文之前,先了解如下知识点: 1.Shiro 是什么?怎么用? 2.Cas 是什么?怎么用? 3.最好有Spring基础 可以先看看这两篇文章,按照这2篇文章的内容做一遍: Spring B ...

  7. matlab之“audioread”函数帮助文档翻译

    课 程 设 计 (1)  原文 audioread Read audio file Syntax [y,Fs] = audioread(filename) [y,Fs] = audioread(fil ...

  8. 用Python写一款属于自己的 简易zip压缩软件 附完成图(适合初学者)

    一.软件描述 用Python tkinter模块写一款属于自己的压缩软件.zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile来操作zip文件,具有功能:zip压缩功能,zip ...

  9. ERP服务器简单维护

    前言: 此页内容对于网管高手来说是小儿科,但是以我们对大多数企业的了解,依然有好多企业将服务器的日常维护给忽视了. 所以在此,给大家做一个宣传.让大家提高服务器维护的意识 以提高服务器运行的稳定性.安 ...

  10. 关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别

    轮播中大多会选择mouseover和mouseout  这个时候是没有任何问题的 但当遇到有css3动画的时候,会发现移入移出过快 动画还没加载完成就需要执行下一个动画,完了动画样式就错乱了. 这时候 ...