初始netty
Netty是一个提供了易于使用的API的客户端/服务端框架
并发高-NIO(非阻塞IO)
传输快-零拷贝

Netty提供了三种线程模型(Reactor线程模型),简单说一下各自的实现

1. 单线程模型

所有的IO操作都由一个NIO线程处理,局限于一些小场景,高负载多并发不适用

netty单线程模型.png
netty单线程模型.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.sonake.demo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;

/**
* @author :xzyuan
* @date :Created in 2019/12/18 10:51
* @description:netty单线程模型
* @version: 1.0
*/
public class Demo {
public static void main(String[] args) {
EventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap()
.group(group)
.childHandler(new HelloServerInitializer());
}
}
2. 多线程模型

由一个线程监听服务端,接收客户端的连接请求
由一组NIO线程处理IO操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.sonake.demo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;

/**
* @author :xzyuan
* @date :Created in 2019/12/18 10:57
* @description:netty多线程模型
* @version: 1.0
*/
public class Demo {
public static void main(String[] args) {
EventLoopGroup boss = new NioEventLoopGroup(1);
EventLoopGroup work = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap()
.group(boss,work)
.childHandler(new HelloServerInitializer());
}
}
netty多线程模型.png
netty多线程模型.png

多线程模型在绝大多数场景已经可以满足业务需要,但是在一些特殊场景性能还是有局限,例如百万千万级别的并发,多线程模型处理起来就有点无力

3. 主从线程模型

一组线程池接收客户端请求,一组线程池处理IO操作

netty主从线程模型.png
netty主从线程模型.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.sonake.demo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
* @author :xzyuan
* @date :Created in 2019/11/28 17:51
* @description:hello服务端,客户端发送一个请求,服务端会返回hello netty
* @version: 1.0
*/
public class Demo {

public static void main(String[] args) throws InterruptedException {
//定义一对线程组

//主线程组,用于接收客户端的链接,不做任何其他处理
EventLoopGroup bossGroup = new NioEventLoopGroup();
//从线程组,主线程组会把任务丢给从线程组,让从线程组执行任务
EventLoopGroup workerGroup = new NioEventLoopGroup();

try {
//netty服务器创建,serverBootstrap启动类
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap
.group(bossGroup,workerGroup) //设置主从线程组
.channel(NioServerSocketChannel.class) //设置通道
.childHandler(new HelloServerInitializer()); //子处理器,用于处理workerGroup

//启动server,并设置端口为8088,同步启动
ChannelFuture channelFuture = serverBootstrap.bind(8088).sync();

//监听需要关闭的channel,设置为同步
channelFuture.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}


}

}