⑴ netty 是不是長連接
netty是一個網路通信框架,它即可以做為長連接,也可以是短連接。但是長連接和短連接的區別不是根據netty區分的,而是根據你的服務區分的。比如以tcp通信為例,不管是長連接還是短連接,都是socket通信,區另在於,長連接在建立tcp握手成功之後,就不會主動斷開 連接,而是保持連接,而短連接是一次請求結束之後,伺服器就會主動斷開連接,以釋放資源。
⑵ netty是啥
Netty是由JBOSS提供的一個java開源框架,現為 Github上的獨立項目。Netty提供非同步的、事件驅動的網路應用程序框架和工具,用以快速開發高性能、高可靠性的網路伺服器和客戶端程序。
也就是說,Netty 是一個基於NIO的客戶、伺服器端的編程框架,使用Netty 可以確保你快速和簡單的開發出一個網路應用,例如實現了某種協議的客戶、服務端應用。Netty相當於簡化和流線化了網路應用的編程開發過程,例如:基於TCP和UDP的socket服務開發。
「快速」和「簡單」並不用產生維護性或性能上的問題。Netty 是一個吸收了多種協議(包括FTP、SMTP、HTTP等各種二進制文本協議)的實現經驗,並經過相當精心設計的項目。最終,Netty 成功的找到了一種方式,在保證易於開發的同時還保證了其應用的性能,穩定性和伸縮性。
⑶ 有人能說清楚JAVA7 NIO NETTY IOCP之間的聯系嗎
早期網路訪問的做法是,連接以後,就等待對方應答,對方沒有應答,代碼就會死在那裡。這稱為阻塞式通訊。
後來,java 1.4 開始引入了nio, nio是非阻塞式網路通訊. 其實可以理解為系統去掃描埠,如果有返回就處理,沒有的話,代碼就繼續做別的事。
不過nio的編碼比較麻煩,雖然性能好,可是很多代碼還在用阻塞,因為代碼簡單,很多例子上也是socket的。
然後高麗人開發了apache的mina,可以快速開發nio。
後來高麗人離開apache,開發了netty,提供了另一種調用nio的framework。
現在mina和netty是最常用的nio框架。
至於iocp,這個是個系統級的實現,其實類似nio,不過是通過操作系統來實現的。而且只支持windows。java 7以後把iocp引入,提供了快速開發的介面。不過不是很推薦使用。系統實現就表示iocp不再是跨平台的。那麼實用性就差很多了。
⑷ 如何使用netty實現tcp的雙向通信
一、什麼是Netty Netty是一個高性能 事件驅動、非同步非堵塞的IO(NIO)Java開源框架,Jboss提供,用於建立TCP等底層的連接,基於Netty可以建立高性能的Http伺服器,快速開發高性能、高可靠性的網路伺服器和客戶端程序。
⑸ netty怎樣安裝
樂盈通客服系統是一款網站在線客服系統,而網站客服系統是以網頁為載體,運用最新網路技術為網站訪客提供與網站客服即時通訊的高科技手段。網站客服系統是集即時通訊、訪客監控、流量統計、CRM等於一體的先進互聯網在線客服系統,廣泛應用於網路銷售、網站在線客服、網上呼叫中心等領域。訪客端基於WEB開發,採用B/S架構,訪客無需安裝任何插件即可與在線客服人員文字對話或電話溝通。 所以,客服系統都具備一些基礎功能的使用: 1、即時交流 當客戶訪問企業網站時,可以通過點擊頁面上的在線客服圖標,實現和客服人員的對話以各類信息的傳遞。當企業銷售或服務人員離線時,還可以發送離線消息或是通過在線客服手機版隨時隨地與網站上的客戶進行溝通,不放過任何一次銷售機會! 此外,網頁即時通信的方式也越來越先進,過去都是彈出文字對話頁面,客戶不能同時瀏覽產品,切換窗口麻煩且可能錯過發過來的對話消息;未來將成為主流的方式是邊瀏覽頁面邊溝通,即對話窗口就在被瀏覽的頁面內,可最小化、最大化,快速、易用! 2、主動出擊 客服人員可以根據訪客的來源和進入網站後的瀏覽軌跡,了解客戶需求,根據實際情況運用主動發出邀請並提供相應的服務。 3、對話轉接 客服人員可以將訪客轉接給相關的部門或人員,實現客戶和工作人員的無障礙直接溝通,也可邀請多個相關部門共同服務顧客,對顧客的問題給出更專業、更權威的答案。 4、報表統計 提供強大的報表統計功能,以便企業更好的把握消費者心理。手機也可收到簡單的核心數據簡訊或WAP報表。 5、常用預存 通過常用預存功能,針對常見問題、常用網頁、常用文件,製作預存客服標准答案、網頁鏈接和文件,可以方便、快捷回復客戶,統一並提高企業服務形象。 6、實施簡便 採用先進的嵌入式代碼設計,只需在企業的網站頁面上插入一段代碼,即可實現在線客服的全部功能。 7、實時查看 訪客端輸入的文字內容,在訪客提交之前,客服端可以通過實時查看功能看到,方便客服提前准備好答案,提高客服的響應速度,提升服務的品質。 8、隊列選擇 當網站的訪問量很大的時候,可以通過智能排隊自動將訪客分配給客服,使客服合理分擔工作壓力,把注意力集中在自己服務的訪客上,保證工作的高效。 9、訪客來源追蹤 客服可以通過網站伴侶實時查看網站當前訪客數量、來源、所在頁面。 10、軌跡功能 客服可以看到訪客登錄網站後先後訪問過哪些頁面,分別在各個頁面停留的時間,幫助客服有針對性的介紹業務,同時也為企業了解客戶最關心的信息提供了依據。 客服系統在這些基礎功能之上就會增加如智能機器人、知識庫、CRM、OA、績效管理等等模塊,樂盈通客服系統實用易用功能完善,可以幫助無數企業迅速提高網站銷售。
⑹ 為什麼選擇Netty作為基礎通信框架
一、什麼是Netty
Netty是一個高性能 事件驅動、非同步非堵塞的IO(NIO)Java開源框架,Jboss提供,用於建立TCP等底層的連接,基於Netty可以建立高性能的Http伺服器,快速開發高性能、高可靠性的網路伺服器和客戶端程序。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已經被很多高性能項目作為其Socket底層基礎,如HornetQ Infinispan Vert.x Play Framework Finangle和 Cassandra。其競爭對手是:Apache MINA和 Grizzly。
也就是說,Netty 是一個基於NIO的客戶,伺服器端編程框架,使用Netty 可以確保你快速和簡單的開發出一個網路應用,例如實現了某種協議的客戶,服務端應用。Netty相當簡化和流線化了網路應用的編程開發過程,例如,TCP和UDP的socket服務開發。
「快速」和「簡單」並不意味著會讓你的最終應用產生維護性或性能上的問題。Netty 是一個吸收了多種協議的實現經驗,這些協議包括FTP,SMTP,HTTP,各種二進制,文本協議,並經過相當精心設計的項目,最終,Netty 成功的找到了一種方式,在保證易於開發的同時還保證了其應用的性能,穩定性和伸縮性。
二、不選擇Java原生NIO編程的原因
首先開發出高質量的NIO程序並不是一件簡單的事情,除去NIO固有的復雜性和BUG不談,作為一個NIO服務端,還需要能夠處理網路的閃斷、客戶端的重復接入、客戶端的安全認證、消息的編解碼、半包讀寫等情況,如果你沒有足夠的NIO編程經驗積累,一個NIO框架的穩定往往需要半年甚至更長的時間。更為糟糕的是,一旦在生產環境中發生問題,往往會導致跨節點的服務調用中斷,嚴重的可能會導致整個集群環境都不可用,需要重啟伺服器,這種非正常停機會帶來巨大的損失。
從可維護性角度看,由於NIO採用了非同步非阻塞編程模型,而且是一個I/O線程處理多條鏈路,它的調試和跟蹤非常麻煩,特別是生產環境中的問題,我們無法進行有效的調試和跟蹤,往往只能靠一些日誌來輔助分析,定位難度很大。
現在我們總結一下為什麼不建議開發者直接使用JDK的NIO類庫進行開發,具體原因如下。
1)跨平台與兼容性:NIO算是底層的APIs需依賴系統的IO APIs。但Java NIO發現在不同系統平台會出現問題。大量測試也耗不少時間;NIO2隻支持JDK1.7+,而且沒提供DatagramSocket,故NIO2不支持UDP協議。而Netty提供統一介面,同一語句無論在JDK6.X 還是JDK7.X 都可運行,無需關心底層架構功能!
2)JAVA NIO的ByteBuffer構造函數私有,無法擴展。Netty提供了自己的ByteBuffer實現,通過簡單APIs對其進行構造、使用和操作,一此解決NIO的一些限制。
3)NIO對緩沖區的聚合與分散操作可能會導致內存泄漏。直到JDK1.7才解決此問題。
4)NIO的類庫和API繁雜,使用麻煩,你需要熟練掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。
5)使用JAVA NIO需要具備其他的額外技能做鋪墊,例如熟悉Java多線程編程。這是因為NIO編程涉及到Reactor模式,你必須對多線程和網路編程非常熟悉,才能編寫出高質量的NIO程序。
6)可靠性能力補齊,工作量和難度都非常大。例如客戶端面臨斷連重連、網路閃斷、半包讀寫、失敗緩存、網路擁塞和異常碼流的處理等問題。
7)JDK NIO的BUG,例如臭名昭著的epoll bug,它會導致Selector空輪詢,最終導致CPU 100%。官方聲稱在JDK 1.6版本的update18修復了該問題,但是直到JDK 1.7版本該問題仍舊存在,只不過該BUG發生概率降低了一些而已,它並沒有得到根本性解決。該BUG以及與該BUG相關的問題單可以參見以下鏈接內容。
異常堆棧如下。
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
- locked <0x0000000750928190> (a sun.nio.ch.Util$2)
- locked <0x00000007509281a8> (a java.util.Collections$ UnmodifiableSet)
- locked <0x0000000750946098> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
at net.spy.memcached.MemcachedConnection.handleIO(Memcached Connection.java:217)
at net.spy.memcached.MemcachedConnection.run(MemcachedConnection. java:836)
由於上述原因,在大多數場景下,不建議大家直接使用JDK的NIO類庫,除非你精通NIO編程或者有特殊的需求。在絕大多數的業務場景中,我們可以使用NIO框架Netty來進行NIO編程,它既可以作為客戶端也可以作為服務端,同時支持UDP和非同步文件傳輸,功能非常強大。
⑺ 為什麼要用Netty開發
Netty是由JBOSS提供的基於Java NIO的開源框架,Netty提供非同步非阻塞、事件驅動、高性能、高可靠、高可定製性的網路應用程序和工具,可用於開發服務端和客戶端。
JAVA原先是採用的是傳統的BIO,為什麼後來又研發出了NIO呢?
首先看看傳統的基於同步阻塞IO(BIO)的線程模型圖
從圖中我們可以看到,使用JDK原生NIO的不足之處
1.NIO的類庫和API相當復雜,使用它來開發,需要非常熟練地掌握Selector、ByteBuffer、ServerSocketChannel、SocketChannel等
2.需要很多額外的編程技能來輔助使用NIO,例如,因為NIO涉及了Reactor線程模型,所以必須必須對多線程和網路編程非常熟悉才能寫出高質量的NIO程序
3.想要有高可靠性,工作量和難度都非常的大,因為服務端需要面臨客戶端頻繁的接入和斷開、網路閃斷、半包讀寫、失敗緩存、網路阻塞的問題,這些將嚴重影響我們的可靠性,而使用原生NIO解決它們的難度相當大。
4.JDK NIO中著名的BUG--epoll空輪詢,當select返回0時,會導致Selector空輪詢而導致CUP100%,官方表示JDK1.6之後修復了這個問題,其實只是發生的概率降低了,沒有根本上解決。
那麼為什麼要用Netty呢?
1.API使用簡單,更容易上手,開發門檻低
2.功能強大,預置了多種編解碼功能,支持多種主流協議
3.定製能力高,可以通過ChannelHandler對通信框架進行靈活地拓展
4.高性能,與目前多種NIO主流框架相比,Netty綜合性能最高
5.高穩定性,解決了JDK NIO的BUG
6.經歷了大規模的商業應用考驗,質量和可靠性都有很好的驗證。
Netty能提供什麼服務?
1.開發非同步非阻塞的TCP網路應用程序
2.開發非同步非阻塞的UDP網路應用程序
3.開發非同步文件傳輸程序
4.開發非同步HTTP程序的服務端和客戶端
5.提供多種編解碼的集成框架,包括谷歌Protobuf、JBossMarshalling、Java序列化、壓縮編解碼、XML解碼、
字元串編解碼等都可以由用戶直接使用
6.提供形式多樣的編解碼基礎類庫,可以方便地進行私有協議棧編解碼框架的二次開發
7.基於職責鏈的Pipeline-Handler機制,可以方便地對網路事件進行攔截和定製
8.所有的IO操作都是非同步的,用戶可以通過Future-Listeren機制主動get結果或者等IO線程完成操作之後主動Notify來通知,
用戶業務線程不需要同步等待
9.基於鏈路空閑事件監測的心跳機制
10.流量控制和整形
......
⑻ 用Netty作http靜態資源伺服器,類似Nginx這樣的,大一點的文件響應不正常怎麼回事
您好,對於你的遇到的問題,我很高興能為你提供幫助,我之前也遇到過喲,以下是我的個人看法,希望能幫助到你,若有錯誤,還望見諒!。展開全部
Nginx+PHP-fpm組合,以內存佔用小,負載能力強壯的特點,成為小內存VPS建站的首選組合。我們一起來探討一下nginx+php-fpm高負載的優化方法。
先來看看nginx配置參數的優化。nginx是前端接受瀏覽器端請求的web server, 配置可調的參數如下:
下面是示例nginx配置
user www-data;
worker_processes 8;
#worker_processes 調至8, 大於8沒什麼用,小於8,nginx性能發揮不出來
worker_cpu_affinity 01 10 01 10 01 10 01 10;
#worker_cpu_affinity 參數可以使nginx充分發揮多核Cpu的性能優勢 ,上面的配置是針對雙核CPU的配置。01表示第一個核,10表示第二個核,如果是四核cpu,一至四個核分別表示為 0001 0010 0100 1000
error_log /var/log/nginx/error_log crit;
pid /var/run/nginx.pid;
worker_rlimit_nofile 10240;
#worker_rlimit_nofile 是nginx能打開文件的最大句柄數,我們需要把這個數字設大一點。
#linux系統的文件查看數限制查看是用 ulimit -n ,修改這個限制是用 ulimit -HSn 65535
events
{
use epoll;
#必須要用高效的event驅動,以獲得最大性能
worker_connections 10240;
#max_clients = worker_processes * worker_connections/4 (最大連接數的計算公式)
}
http
{
include /etc/nginx/deny.iplist;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_name_in_redirect off;
server_names_hash_bucket_size 128;
server_tokens off;
client_header_buffer_size 32k;
#client頭buffer可以調為32K
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfileon;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelayoff;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 60;
output_buffers 1 32k;
postpone_output 1460;
open_file_cache max=1000 inactive=20s;
open_file_cache_valid30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 32k;
fastcgi_temp_file_write_size 32k;
gzip on;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_proxied expired no-cache no-store private auth;
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=staticfilecache:80m inactive=1d max_size=2500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 300;
proxy_read_timeout 120;
proxy_send_timeout 120;
proxy_buffer_size 16k;
proxy_buffers 4 16k;
upstream wordpressnginx
{
server 127.0.0.1:6000 weight=1 fail_timeout=120s;
}
include /etc/nginx/sites-enabled/*;
}
上面的配置裡面,有多處設及到buffer和timeout的地方。我們可以根據需要,慢慢調大這些參數,buffer自然是大點好,但不要太大。16K是標准配置,可以增加到32,往上加更大也不是不行,但 要考慮到你系統內存大不大,夠不夠用。timeout是超時,如果伺服器很繁忙,不妨增加超時等待時間,以避免頻繁出現502錯誤。
gzip是必須開啟的,reverse proxy在允許的情況下,也盡量開啟,一 是可以提升響應效率,二是降低伺服器壓力,gzip開啟後更可以節省伺服器帶寬。
nginx主要的配置如上所述。
現在看一下php-fpm的配置。
[global]
pid = run/php5-fpm.pid
process_control_timeout = 5
[www]
listen = /dev/shm/php-cgi.sock
listen.allowed_clients = 127.0.0.1
user = www-data
group = www-data
pm = static
pm.max_children = 7
#這個決定了 php-fpm的總進程。我們要想同時響應更多的並發數,這個數值要盡可能大,比如500,1000
pm.max_requests = 10000
#並發數越大,這個最大請求數應該越大,並發數小,這個數值也應該越小。它表示,php-fpm進程響應了10000個並發請求之後,就自動重啟一下進程。
request_terminate_timeout = 30
#表示等待30秒後,結束那些沒有自動結束的php腳本,以釋放佔用的資源。
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
小內存的vps雖然經過使用php-fpm+nginx,提升了系統的效率,可以同時響應較多的並發請求,但是當並發數上來了,比如從100上升到10000,小內存肯定響應不過來,cpu也會 因為太忙,而導致系統負載變得很高很高,這個時候,我們就要考慮升級硬體配置了。
內存越大越好,CPU核心頻率越高越好,CPU核越多越好。硬碟最好是SSD+RAID10。這樣性能不僅高,數據安全也有保障。
上面所提到的各個配置參數,設及到數值的,不妨自己 多試著調小,調大參數,然後重啟下nginx或者php-fpm進程,看看效果怎麼樣。
下面介紹一個比較好的壓力測試工具,siege.
debian和ubuntu用戶可以通過apt-get install siege來安裝siege.
siege是一個跟ab.exe相似的http壓力測試軟體。
我們可以用siege來測試我們的網站和伺服器性能。
siege -r 100 -c 10
-r 是 repeat , -r 100是重復100次測試
-c 10是表示模擬10個用戶同時並發連接
最後面是要測試的URL地址。
測試過程中可以隨時按CTRL+C中止進程,siege會生成一個報告給我們。
我們可以同時根據siege的測試結果和監視伺服器的負載情況,對系統壓力狀況進行一個深入了解和分析。接下來可以幫助我們判斷該如何進行下一步操作,是繼續優化配置,還是升級硬體。非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!
⑼ netty channel不關閉會有什麼問題
netty是一個Java nio的網路框架,它屏蔽了底層網路細節,並且非常的高效。如果你是最近要開發一個消息平台,使用netty最好不過了。
一個好的消息平台有很多需要注意的細節和應該遵守的約定準則。其中平台的優雅關閉必不可少。這個主要是避免消息丟失。那麼如何做到netty的優雅關閉呢?
在netty中,接受連接請求和對請求進行業務處理分別有兩個線程執行器bossExecutor 和 workerExecutor,除了關閉這兩個外還需要關閉channel。
netty文檔說優雅關閉需要三步:
1. unbind netty創建的所有channel。channel.unbind()
2. close netty創建的所有channel。channel.close()
3. shutdown netty的線程執行器。factory.releaseExternalResources()
對於netty生成的channel,可以使用ChannelGroup管理,很方便。
具體的代碼如下:(可以參看ChannelGroup的注釋)
[java] view plain
ChannelGroup allChannels = new DefaultChannelGroup();
public static void main(String[] args) throws Exception {
ServerBootstrap b = new ServerBootstrap(..);
...
// Start the server
b.getPipeline().addLast("handler", new MyHandler());
Channel serverChannel = b.bind(..);
allChannels.add(serverChannel);
... Wait until the shutdown signal reception ...
// Close the serverChannel and then all accepted connections.
allChannels.close().awaitUninterruptibly();
b.releaseExternalResources();
}
public class MyHandler extends SimpleChannelUpstreamHandler {
@Override
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) {
// Add all open channels to the global group so that they are
// closed on shutdown.
allChannels.add(e.getChannel());
}
}
⑽ netty可以做什麼
netty是做為網路通信的框架,它可以做伺服器端,也可以做客戶端。應用的場景也很多,比如游戲伺服器開發,rpc框架開發,http伺服器,消息中間件開發等等。