netty介紹:一個(gè)飯店的故事

開(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è)圖。


一個(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ì)比可能不是很合適,希望大家指正,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評(píng)論 19 139
  • 1、Netty基礎(chǔ)入門(mén) Netty是由JBOSS提供的一個(gè)java開(kāi)源框架。Netty提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)...
    我是嘻哈大哥閱讀 4,793評(píng)論 0 31
  • 昨天路上堵著車,突然想起給一個(gè)舊友電話,或許是因?yàn)橹八f(shuō)總是她主動(dòng)給我打電話,或許是因?yàn)槁飞隙轮彩嵌轮蛟S是...
    super貝貝閱讀 128評(píng)論 0 0
  • 巖巖早上出門(mén)的時(shí)候才記起,今天是傳說(shuō)中的圣誕節(jié)。管他什么圣誕節(jié)生蛋節(jié)呢,她甩了甩頭,彎腰穿鞋,自嘲的想,什么節(jié)都跟...
    落微閱讀 417評(píng)論 0 3

友情鏈接更多精彩內(nèi)容