開(kāi)個(gè)飯店
假如我們開(kāi)了一個(gè)飯店,飯店里面有接待、點(diǎn)菜、廚師、上菜、收銀等角色。 這里的接待比較特殊,她是負(fù)責(zé)在門(mén)外招攬顧客,有點(diǎn)銷售的性質(zhì),所以飯店生意的好壞和他有非常緊密的關(guān)系(不考慮回頭客)。
如何讓更多的客戶來(lái)飯店消費(fèi),就成了店長(zhǎng)的最主要的問(wèn)題,如果你是店長(zhǎng),如何去安排這些人呢?
netty模式飯店
我們使用netty來(lái)開(kāi)發(fā)一個(gè)服務(wù)端的系統(tǒng),就類似開(kāi)發(fā)飯店,前者來(lái)處理用戶在網(wǎng)絡(luò)上訪問(wèn),后者來(lái)招待吃飯的客戶。所以應(yīng)該有下面這個(gè)圖。

netty服務(wù)端程序
我們來(lái)看一個(gè)典型的netty服務(wù)端程序
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. 創(chuàng)建事件循環(huán)組
EventLoopGroup group = new NioEventLoopGroup();
EventLoopGroup child = new NioEventLoopGroup();
try {
//2. 創(chuàng)建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 {
//因?yàn)镋choServerHandler是@Sharable的,所以我們一直可以使用同一個(gè)
socketChannel.pipeline().addLast(serverHandler);
}
});
//6. 異步綁定,使用sync()等待綁定完成
ChannelFuture f = b.bind().sync();
//7. 獲取Chaneel的CloseFuture,阻塞當(dāng)前線程,知道其完成
f.channel().closeFuture().sync();
} finally {
//8. 關(guān)閉EventLoopGroup,釋放所有資源
group.shutdownGracefully().sync();
}
}
}
這個(gè)程序就不詳細(xì)介紹了,網(wǎng)上很多的,下面和開(kāi)飯店對(duì)比下,理解會(huì)更加的深刻。
對(duì)比
這里從各個(gè)模塊對(duì)飯店和服務(wù)端程序進(jìn)行對(duì)比
ServerBootstrap
這個(gè)就是整個(gè)飯店,里面包含了很多的成員,還包括很多的操作:開(kāi)業(yè),關(guān)門(mén)等等。
EventLoopGroup
我們看到代碼中有兩個(gè)事件循環(huán)組,這里從幾個(gè)關(guān)鍵詞來(lái)講解:
兩個(gè):飯店的人員分成兩類,一類是負(fù)責(zé)接待的,從客戶從店外引入店內(nèi)的,另外一類是具體服務(wù)的(包括點(diǎn)菜、廚師、端菜和買單等)
組:接待的人是一個(gè)組(當(dāng)然我上面的圖中只有一個(gè),因?yàn)榻哟浅??,一個(gè)人和多個(gè)差異不大),同時(shí)可以接待多個(gè)客戶;具體服務(wù)也一樣,可以同時(shí)服務(wù)很多桌子的客戶。
循環(huán):就是所有飯店員工在不停的工作,除非下班了(服務(wù)停了)
NioServerSocketChannel
這個(gè)是對(duì)招待的員工的要求:升高160+、五官端正、普通話標(biāo)準(zhǔn);以及具體的操作:客戶同意后需要帶到我們的飯店
InetSocketAddress(port)
這個(gè)是招待的員工站在哪里比較合適
pipeline
具體的流水:對(duì)飯店而言,就是如何服務(wù)客戶的流程:點(diǎn)菜、燒菜、上菜、買單...
總結(jié)
現(xiàn)在研究netty不久,中間有些理解或者對(duì)比可能不是很合適,希望大家指正,謝謝