服務端啟動流程

2021-10-02 15:52:43 字數 2873 閱讀 7700

這一小節,我們來學習一下如何使用 netty 來啟動乙個服務端應用程式,以下是服務端啟動的乙個非常精簡的 demo:

public

class

nettyserver})

; serverbootstrap.

bind

(8000);

}}

我們的最小化引數配置到這裡就完成了,我們總結一下就是,要啟動乙個netty服務端,必須要指定三類屬性,分別是執行緒模型io 模型連線讀寫處理邏輯,有了這三者,之後在呼叫bind(8000),我們就可以在本地繫結乙個 8000 埠啟動起來,以上這段**讀者可以直接拷貝到你的 ide 中執行。

在上面**中我們繫結了 8000 埠,接下來我們實現乙個稍微複雜一點的邏輯,我們指定乙個起始埠號,比如 1000,然後呢,我們從1000號埠往上找乙個埠,直到這個埠能夠繫結成功,比如 1000 埠不可用,我們就嘗試繫結 1001,然後 1002,依次類推。

serverbootstrap.bind(8000);這個方法呢,它是乙個非同步的方法,呼叫之後是立即返回的,他的返回值是乙個channelfuture,我們可以給這個channelfuture新增乙個***genericfuturelistener,然後我們在genericfuturelisteneroperationcomplete方法裡面,我們可以監聽埠是否繫結成功,接下來是監測埠是否繫結成功的**片段。

serverbootstrap.

bind

(8000).

addlistener

(new

genericfuturelistener

?super void>>()

else}}

);

我們接下來從 1000 埠號,開始往上找埠號,直到埠繫結成功,我們要做的就是在 if (future.issuccess())的else邏輯裡面重新繫結乙個遞增的埠號,接下來,我們把這段繫結邏輯抽取出乙個bind方法。

private

static

void

bind

(final serverbootstrap serverbootstrap,

final

int port)

else}}

);}

以上就是自動繫結遞增埠的邏輯,接下來,我們來一起學習一下,服務端啟動,我們的引導類serverbootstrap除了指定執行緒模型,io 模型,連線讀寫處理邏輯之外,他還可以幹哪些事情?

serverbootstrap.

handler

(new

channelinitializer

()})

handler()方法呢,可以和我們前面分析的childhandler()方法對應起來,childhandler()用於指定處理新連線資料的讀寫處理邏輯,handler()用於指定在服務端啟動過程中的一些邏輯,通常情況下呢,我們用不著這個方法。

serverbootstrap.

attr

(attributekey.

newinstance

("servername"),

"nettyserver"

)

**attr()**方法可以給服務端的 channel,也就是nioserversocketchannel指定一些自定義屬性,然後我們可以通過channel.attr()取出這個屬性,比如,上面的**我們指定我們服務端channel的乙個servername屬性,屬性值為nettyserver,其實說白了就是給nioserversocketchannel維護乙個map而已,通常情況下,我們也用不上這個方法。

那麼,當然,除了可以給服務端 channel nioserversocketchannel指定一些自定義屬性之外,我們還可以給每一條連線指定自定義屬性。

serverbootstrap.

childattr

(attributekey.

newinstance

("clientkey"),

"clientvalue"

)

上面的childattr可以給每一條連線指定自定義屬性,然後後續我們可以通過channel.attr()取出該屬性。

serverbootstrap

.childoption

(channeloption.so_keepalive,

true).

childoption

(channeloption.tcp_nodelay,

true

)

childoption()可以給每條連線設定一些tcp底層相關的屬性,比如上面,我們設定了兩種tcp屬性,其中

除了給每個連線設定這一系列屬性之外,我們還可以給服務端channel設定一些屬性,最常見的就是so_backlog,如下設定

serverbootstrap.

option

(channeloption.so_backlog,

1024

)

表示系統用於臨時存放已完成三次握手的請求的佇列的最大長度,如果連線建立頻繁,伺服器處理建立新連線較慢,可以適當調大這個引數

社群服務端啟動流程

1.mongod 啟動mongodb伺服器 2.redis server 啟動redis server服務 3.進入cpassport2目錄 rails s 預設3000埠啟動cpassport 4.進入idea目錄 padrino s p 3002 3002埠啟動社群 5.padrino rake...

Eureka原始碼手撕分析啟動流程(服務端)

該註解包含了如下內容 其中 import eurekaservermarkerconfiguration.class 現在怎麼下手,上面的 已經結束了。經過查詢資料發現入口 在jar spring cloud netflix eureka server 2.2.2.release.jar的manif...

HTTP服務端JSON服務端

最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...