netty介绍:一个饭店的故事
2017-08-25 本文已影响0人
benbendy1984
开个饭店
假如我们开了一个饭店,饭店里面有接待、点菜、厨师、上菜、收银等角色。 这里的接待比较特殊,她是负责在门外招揽顾客,有点销售的性质,所以饭店生意的好坏和他有非常紧密的关系(不考虑回头客)。
如何让更多的客户来饭店消费,就成了店长的最主要的问题,如果你是店长,如何去安排这些人呢?
netty模式饭店
我们使用netty来开发一个服务端的系统,就类似开发饭店,前者来处理用户在网络上访问,后者来招待吃饭的客户。所以应该有下面这个图。
一个饭店故事
netty服务端程序
我们来看一个典型的netty服务端程序
public class NettyEchoServer {
private static final Logger logger = LoggerFactory.getLogger(NettyEchoServer.class);
public final int port;
public NettyEchoServer(int port) {
this.port = port;
}
public static void main(String[] args) throws Exception {
int port = 9999;
new NettyEchoServer(port).start();
}
public void start() throws Exception {
final EchoServerHandler serverHandler = new EchoServerHandler();
//1. 创建事件循环组
EventLoopGroup group = new NioEventLoopGroup();
EventLoopGroup child = new NioEventLoopGroup();
try {
//2. 创建ServerBootstrap
ServerBootstrap b = new ServerBootstrap();
b.group(group, child)
//3. 指定使用NIO传输Channel
.channel(NioServerSocketChannel.class)
//4.指定socket端口
.localAddress(new InetSocketAddress(port))
//5. 添加EchoServerHandler到ChannelPipeline
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//因为EchoServerHandler是@Sharable的,所以我们一直可以使用同一个
socketChannel.pipeline().addLast(serverHandler);
}
});
//6. 异步绑定,使用sync()等待绑定完成
ChannelFuture f = b.bind().sync();
//7. 获取Chaneel的CloseFuture,阻塞当前线程,知道其完成
f.channel().closeFuture().sync();
} finally {
//8. 关闭EventLoopGroup,释放所有资源
group.shutdownGracefully().sync();
}
}
}
这个程序就不详细介绍了,网上很多的,下面和开饭店对比下,理解会更加的深刻。
对比
这里从各个模块对饭店和服务端程序进行对比
ServerBootstrap
这个就是整个饭店,里面包含了很多的成员,还包括很多的操作:开业,关门等等。
EventLoopGroup
我们看到代码中有两个事件循环组,这里从几个关键词来讲解:
两个:饭店的人员分成两类,一类是负责接待的,从客户从店外引入店内的,另外一类是具体服务的(包括点菜、厨师、端菜和买单等)
组:接待的人是一个组(当然我上面的图中只有一个,因为接待非常快,一个人和多个差异不大),同时可以接待多个客户;具体服务也一样,可以同时服务很多桌子的客户。
循环:就是所有饭店员工在不停的工作,除非下班了(服务停了)
NioServerSocketChannel
这个是对招待的员工的要求:升高160+、五官端正、普通话标准;以及具体的操作:客户同意后需要带到我们的饭店
InetSocketAddress(port)
这个是招待的员工站在哪里比较合适
pipeline
具体的流水:对饭店而言,就是如何服务客户的流程:点菜、烧菜、上菜、买单...
总结
现在研究netty不久,中间有些理解或者对比可能不是很合适,希望大家指正,谢谢