nettyhttp代理伺服器
A. 如何構建一個基於netty的後端伺服器
Netty服務端創建
當我們直接使用JDK NIO的類庫開發基於NIO的非同步服務端時,需要使用到多路復用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey等等,相比於傳統的BIO開發,NIO的開發要復雜很多,開發出穩定、高性能的非同步通信框架,一直是個難題。
Netty為了向使用者屏蔽NIO通信的底層細節,在和用戶交互的邊界做了封裝,目的就是為了減少用戶開發工作量,降低開發難度。ServerBootstrap是Socket服務端的啟動輔助類,用戶通過ServerBootstrap可以方便的創建Netty的服務端。
B. netty和spring mvc+tomcat分別實現http 伺服器個有什麼優勢
netty只是把實現了http協議的伺服器。 tomcat不只實現了http協議還實現了 j2ee里的servlet標准。tomcat是一個實現了servlet協議的容器,可以運行servlet。spring mvc是是基於servlet之上的框架,核心是一個功能強大的servlet。
C. netty httpserver更高效嗎
<script type="text/javascript">
Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp=new Composite("Composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
D. 怎麼使用netty寫一個http長連接伺服器
netty本身實現的長連接,就是一個連接一個worker。worker的數量是有限的(通常是cpu cores+1),所以你的伺服器要是連接數多的話,得考慮使用「非同步」Request(netty的http沒實現這么個功能),或者說「Continuation」,當連接「無事可做」的時候,放棄線程的使用權,當要處理事務的時候,才重新拿到一個線程。
當然,如果你只想實現長連接而不在意request 一直佔有worker,那麼你只要不放棄連接就可以了(websocket本身也是一種長連接,netty裡面有websocket的例子)。
E. 用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的測試結果和監視伺服器的負載情況,對系統壓力狀況進行一個深入了解和分析。接下來可以幫助我們判斷該如何進行下一步操作,是繼續優化配置,還是升級硬體。非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!
F. 怎麼為JAVA NIO或Netty程序設置網路通信代理
服務端
// 設置一個處理客戶端消息和各種消息事件的類(Handler)bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline( newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())), newObjectServerHandler()); }});
客戶端
// 設置一個處理服務端消息和各種消息事件的類(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectEncoder(), newObjectClientHandler()); }});
要傳遞對象,自然要有一個被傳遞模型,一個簡單的Pojo,當然,實現序列化介面是必須的。
/** * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class Command implementsSerializable { = 7590999461767050471L; privateString actionName; publicString getActionName() { returnactionName; } publicvoidsetActionName(String actionName) { this.actionName = actionName; }}
服務端和客戶端里,我們自定義的Handler實現如下:
ObjectServerHandler .java
/** * 對象傳遞服務端代碼 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectServerHandler extendsSimpleChannelHandler { /** * 當接受到消息的時候觸發 */ @Override publicvoidmessageReceived(ChannelHandlerContext ctx, MessageEvent e) throwsException { Command command = (Command) e.getMessage(); // 列印看看是不是我們剛才傳過來的那個 System.out.println(command.getActionName()); }}
ObjectClientHandler .java
/** * 對象傳遞,客戶端代碼 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectClientHandler extendsSimpleChannelHandler { /** * 當綁定到服務端的時候觸發,給服務端發消息。 * * @author lihzh * @alia OneCoder */ @Override publicvoidchannelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { // 向服務端發送Object信息 sendObject(e.getChannel()); } /** * 發送Object * * @param channel * @author lihzh * @alia OneCoder */ privatevoidsendObject(Channel channel) { Command command =newCommand(); command.setActionName("Hello action."); channel.write(command); } }
啟動後,服務端正常列印結果:Hello action.
簡單梳理一下思路:
通過Netty傳遞,都需要基於流,以ChannelBuffer的形式傳遞。所以,Object -> ChannelBuffer.
Netty提供了轉換工具,需要我們配置到Handler。
樣例從客戶端 -> 服務端,單向發消息,所以在客戶端配置了編碼,服務端解碼。如果雙向收發,則需要全部配置Encoder和Decoder。
這里需要注意,注冊到Server的Handler是有順序的,如果你顛倒一下注冊順序:
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
@Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectServerHandler(), newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())) ); }});
結果就是,會先進入我們自己的業務,再進行解碼。這自然是不行的,會強轉失敗。至此,你應該會用Netty傳遞對象了吧。
G. netty能同時支持http和https嗎
支持,一般來說web伺服器都可以配置支持http和https
H. Netty適合做HTTP服務容器嗎
這種需求建議樓主用netty,原因如下:
1.tomcat比較適合j2ee開發,因為其完整的實現了Servlet和JSP規范
2.tomcat處理高並發請求性能不夠好,比如需要使用NIO時必須要安裝APR插件,確實比較麻煩。
3.netty是一個性能非常好的java NIO網路框架,我們已經在諸多大項目中使用並驗證。
所以:
如果性能要求不高,則選用tomcat 開發上更易用
如果對性能有要求,選用netty,當然其在使用上要更麻煩,最直接的啟停監控腳本得自己來弄。
I. 如何將netty獲取到的http請求分發到controller
個游戲服務端需要處理各種業務邏輯,每一種業務邏輯都對應著一個請求消息和一個響應消息。那麼服務端需要把這些不同的消息自動分發到對應的業務邏輯中處理