『壹』 如何配置方便閱讀和記錄注釋Netty源碼文件的IDEA環境
一、找到文件和代碼的模板設置 Preferences->Editor->File and Code Templates,然後在Templates這個tab下,選擇你需要修改的文件類型的頭模板。 二、修改注釋 選中上一步的某一個類型以後,將#parse("File Header.java")這一行刪除。
『貳』 如何編譯 netty 源碼並導入android studio
ndk編譯是針對jni的。jni是java native interface的縮寫,意為java本地介面。 java本地介面一般是用C語言來實現一些功能,然後通過特定的格式暴露介面給java調用。但是C語言的代碼不能直接被java使用,而是需要通過ndk進行編譯,編譯後會在libs目錄下生成.so文件,這事動態運行庫,這時C語言曝露出的介面才能被java調用。 樓主可以檢查你的vlc項目中的libs目錄下,是否包含了.so文件,如果有的話一般是不需要ndk進行 編譯的。不過如果樓主修改了c語言中的代碼,那麼為了使修改生效必須從新用ndk編譯,編譯後會刪除原來生成的.so,並生成新的.so文件。 使用ndk-r7以及更高版本的ndk,可以免安裝cygwin而直接使用命令行進行編譯,非常方便。 方法: 將ndk的根目錄設置環境變數,然後dos命令行進入需要編譯的項目的根目錄,執行命令 ndk-build
『叄』 netty 實現的http server 需要專門寫client嗎
在test.cpp中引用class1(如通過頭文件) Makefile CC = gcc CFLAGS = -Wall -Os LDFLAGS = -llib1.so all: test test: test.cpp $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ clean: rm test 編譯完成後用 ldd test就可以看到有沒有連接成功
『肆』 netty 一個server有可以建多少個連接
1. 應用在netty建連接的過程中做了耗時的事;
因此我先mp了應用的線程,看到一切正常,boss線程看起來非常空閑;
2. backlog太小;
首先問了下開發代碼里有沒有設置過backlog,開發告訴我沒設置過,於是我翻了下netty的源碼確認下默認值,看到backlog的默認值為讀取自系統的/proc/sys/net/core/somaxconn,於是查了下系統的這個值,確認系統的這個值已經是調整過的,設置為了2048,然後確認了系統上的tcp_max_syn_backlog是4096,也就是最後work的會是2048(為什麼是這樣具體可見 這篇文章 ),也就是說應該是夠的。
用ss -s觀察連接的狀況,看到的是synrecv是0,也印證了上面的不是backlog的問題。
到這一步就徹底傻眼了,不知道該用什麼方法排查了,於是開始一堆的google,看到的各種說解決新建連接並發低的解決辦法,除了調整backlog外,主要是以下兩種:
1 關閉tcp_tw_recycle,嘗試了(話說這里充分體現了」病急亂投醫「的心態,其實我自己都不相信改這參數有用,但想著只是改下參數這種小代價的事,還是試試吧),沒任何作用;
2 關閉window scaling ,也嘗試了,一樣沒任何作用;
查到這個階段覺得自己已經無法理解了,於是求助了廠內內核團隊對網路這塊比較精通的同學,然後又求助了「神」,「神「幫忙看了會後,說主要的問題是現在是每epollWait喚醒一次,只建了一個連接,這導致在大量新建連接請求並發的時候,效率不夠高,因此我翻了下代碼,發現我本機上看到的代碼不是這樣的,我本機上看到的netty代碼在epollWait喚醒後,是會嘗試一直去accept的,但這個應用使用的netty確實不是這樣,於是查了下應用的jar包庫,發現裡面有兩個版本的netty(一個是3.2.1.Final,一個是3.6.3.Final),3.2.1確實是每次epollWait後就處理一個,於是通知開發同學把3.2.1去掉,滿心期待的認為應該是好了,等開發更新好了後,自己也確認了一次epollWait喚醒後會連續處理很多個建立連接的請求,但悲催的還是沒解決問題,具體的netty在這塊的改造感興趣的同學可以看看NioServerSocketPipelineSink這個類(重點看select喚醒後)…
到這步,就徹底郁悶了,話說其實到這步的時候我已經被這個問題困擾了2天多了,於是只好繼續google,發現又有提到打開syn cookies的建議,於是嘗試了下,竟然真的work了,打開了這個參數後新建連接的並發請求輕松超過100+了。
到此以為已經解決了,但很快開發給我反饋,整個集群開啟了這個參數後,連接確實是能建上了,但客戶端出現了發了請求後,等不到任何響應的現象,當時還不確定伺服器端到底有沒有收到請求,於是只好又先關閉了這個參數(話說這個我到現在都不明白為什麼這個參數打開後,會出現發請求沒響應的現象,求高人解答)。
盡管還是沒解決,但畢竟有進展,有的進展就是打開了syn cookies後連接就能建上,而syn cookies只有在backlog滿了後才會生效,那也就是說還是backlog滿了,從kern的日誌也能確認syn cookies確實是work了,到這步就覺得詭異了,明明netty用的默認值就是somaxconn,而每秒新建40多個連接,且boss線程還很空閑的情況下顯然不應該出現backlog滿的現象,這個時候仔細看了下本機查看的netty代碼,才發現我看的是netty 4的代碼,而應用用的是netty 3.6.3,悲催,趕緊把netty 3.6.3的代碼撈下來看了,才發現在3.6.3里backlog的默認值處理時不一樣的,在3.6.3里默認值是50,不是netty寫的默認值,是java本身,50那估計真的不一定夠,於是就通知開發在代碼里先強制設置下backlog為1000。
在開發改代碼的過程中,還有一個懷疑點想確認,就是既然是backlog滿了,為什麼看到的synrecv會是0呢,於是再用netstat -na | grep [port] | grep SYN_RECV -c統計了下,結果發現值基本一直是64,java層面默認設置的是50,linux會將這個值調整為大於這個值的2的n次冪的值,那也就是64,好吧,看到這就徹底可以確定真的是因為backlog太小了造成的(只是話說我不明白為什麼ss -s統計出來的synrecv會是0呢,求高人解答)。
等開發改完代碼重新發布後,稍微增加了點引流測試了下,輕松支撐每秒200+,客戶端建立連接後發請求獲取響應也完全ok,問題到此宣告解決。
題外話: 這應用之所以會比較容易出現較多的synrecv,主要是因為手機網路通常是不太穩定的,另外一個原因是這種對外的都很容易帶來攻擊,而當時剛好這個應用前面的一個用來防syn flood的由於有bug臨時關閉了,所以問題暴露的比較明顯。
從這個折騰了4天的case的排查過程,大家可以看到其實如果一開始我仔細確認過應用用的netty版本和我本機看的代碼是不一致的話,估計很快就會排查出原因就是backlog值太小造成的,所以說折騰了這么多天其實也是自己造成的,這個告訴自己,以後排查問題的時候一定要對出現問題的應用所在的環境更加清楚的確認。
ps: 最後再多啰嗦幾句,從這個case還能看到的是netty的版本其實在細節上是一直在改進的,就像這個case里的不同版本的netty在處理連接事件喚醒上,還有backlog的默認值上,所以我一直很強調,對於需要存活很多年的軟體而言,選擇一個使用范圍較廣的開源軟體是非常重要的,如果自己開發,也許短期能超越,但放到三年、五年這樣的范圍來看,通常是很難和開源軟體去抗衡的(原因是商業公司沒多少人會專注在一個領域做三五年的,而開源界這樣的人實在是多,說實話,這種case看過太多),所以如果覺得你能做的比開源軟體好,還不如去幫助已有的(當然,如果這個領域目前完全沒有什麼使用面較廣的、靠譜的,那自己做一個開源是挺好的),軟體的可持續發展能力(除非是一次性軟體、做的玩的或就玩個一兩年的)是非常非常重要的。
『伍』 《Netty實戰NettyINACTION》epub下載在線閱讀,求百度網盤雲資源
《Netty實戰》(諾曼·毛瑞爾(Norman Maurer))電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:
書名:Netty實戰
作者:諾曼·毛瑞爾(Norman Maurer)
譯者:何品
豆瓣評分:7.5
出版社:人民郵電出版社
出版年份:2017-5-1
頁數:276
內容簡介:
編輯推薦
- Netty之父」Trustin Lee作序推薦
- 阿里巴巴中間件高級技術專家為本書中文版作序推薦
- 系統而詳細地介紹了Netty的各個方面並附帶了即用型的優質示例
- 附帶行業一線公司的案例研究
- 極實用的Netty技術書
無論是構建高性能的Web、游戲伺服器、推送系統、RPC框架、消息中間件還是分布式大數據處理引擎,都離不開Netty,在整個行業中,Netty廣泛而成功的應用,使其成為了Java高性能網路編程的卓絕框架。
Netty的現Tech Lead Norman在本書中循序漸進地講解了Netty的各個關鍵部分,在看完本書後,你不但可以熟練地使用Netty來構建以上系統,並且還可以避免很多常見的陷阱。
無論是想要學習Spring 5 、Spark、Cassandra等這樣的系統,還是通過學習Netty來構建自己的基於Java的高性能網路框架,或者是更加具體的高性能Web或者游戲伺服器等,本書都將是你的超強拍檔。
本書中文版基於Netty4.1.9做了修訂,希望本書能夠給你帶來一個接近完美的閱讀體驗,並能幫到你。
內容提要
本書是為想要或者正在使用Java從事高性能網路編程的人而寫的,循序漸進地介紹了Netty各個方面的內容。
本書共分為4個部分:第一部分詳細地介紹Netty的相關概念以及核心組件,第二部分介紹自定義協議經常用到的編解碼器,第三部分介紹Netty對於應用層高級協議的支持,會覆蓋常見的協議及其在實踐中的應用,第四部分是幾個案例研究。此外,附錄部分還會簡單地介紹Maven,以及如何通過使用Maven編譯和運行本書中的示例。
閱讀本書不需要讀者精通Java網路和並發編程。如果想要更加深入地理解本書背後的理念以及Netty源碼本身,可以系統地學習一下Java網路編程、NIO、並發和非同步編程以及相關的設計模式。
本文僅用於學習和交流目的,不代表非同步社區觀點。非商業轉載請註明作譯者、出處,並保留本文的原始鏈接。
作者簡介:
Norman Maurer,是蘋果公司的資深軟體工程師,同時也是Netty的核心開發人員。
Marvin Allen Wolfthal,是Dell Services的顧問,他使用Netty實現了多個任務關鍵型的企業系統。
何品,目前是淘寶的一名資深軟體工程師,熱愛網路、並發、非同步相關的主題以及函數式編程,同時也是Netty、Akka等項目的貢獻者,活躍於Scala社區,目前也在從事GraphQL相關的開發工作。
『陸』 如何編譯 netty 源碼並導入android studio
2-1基礎准備工作首先你得安裝配置了AndroidStudio,具體不明白的參考《AndroidStudio入門到精通》。接著你得下載好了源碼Code,至於如何下載這里不再說明,比較簡單,上官網查看就行了。其次你需要保證源碼已經被編譯生成了out相關目錄文件。好了,如上就是一些基本准備工作,針對定製源碼或者原生源碼來說,這些准備步驟都是必須的,沒必要再強調了。2-2配置導入及使用2-2-1編譯源碼idegen模塊及生成AS配置文件(*.ipr)在開始編譯idegen模塊前,你一定知道需要先全局編譯出out目錄及相關文件吧,這個不再過多說了,我們通過如下命令編譯idegen模塊:mmmdevelopment/tools/idegen/11這行命令的意思是編譯idegen這個模塊項目,然後生成idegen.jar文件(不信你自己去查看這個模塊的Android.mk的目標吧,不多解釋)。運行完以後如果看到如下信息則說明編譯OK:####makecompletedsuccessfully(7seconds)####1212接著執行如下腳本:development/tools/idegen/idegen.sh11這行命令的意思是在根目錄生成對應的android.ipr、android.imlIEDA工程配置文件。等待片刻得到類似如下信息說明OK:Readexcludes:21msTraversedtree:194799ms1212通過如上操作我們就完成了基本的源碼配置工作。2-2-2導入AndroidStudio前的一些客戶化操作大家都知道使用Eclipse倒入源碼很慢,AndroidStudio導入源碼時也慢,所以建議修改android.iml文件(將自己不用的代碼去掉),然後再導入Studio。
『柒』 如何編譯 netty 源碼並導入android studio
思路一:下載源碼,自己下載依賴lib,構建編譯環境,成功;
1. 從maven 地址下載,一般關心下面紅色的3個,帶sources的肯定就是源碼了,但是裡面沒有相關依賴關系,這個可以看 .pom 文件;
將sources.jar 變為zip 文件,解壓出來;
在你項目的 androidstudio project 中新建一個 Java library;命名為 nettylib-4.0.14
將2中源碼文件io/netty/ 拷貝到src/main/Java/ 目錄下
studio sync,編譯看報錯的地方,或者根據 1 中地址裡面的 pom 文件,找到netty 編譯需要依賴的第三方 jar
依賴jar 查詢地址: http://www.findjar.com/index.x?
最後nettylib-4.0.14 中的 build.gradle 配置如下:
其中會遇到不少問題,我搞了很久,因為走了些彎路,如上圖,我直接貼出來配置了,但是仍然有少數的文件會報錯,因為和項目無關,所有直接刪掉啦;
編譯可能會遇到各種錯誤,我就不一一貼出來了,大家有問題,請留言;
思路二:在github上下載源碼,並且按照其設置來配置編譯環境
git 源碼地址:https://github.com/netty/netty/tree/netty-4.0.14.Final
編譯環境搭建:http://netty.io/wiki/setting-up-development-environment.html
主要有eclipse +maven 和使用IDEA
1. 使用eclipse +maven,比較容易報錯,因為eclipse 和maven 可能有不兼容的情況;
建議使用前最好,進入netty下載目錄,
1。mvn install 在本地Repository中安裝jar
2。mvn eclipse:eclipse 生成eclipse項目
然後就多了 .classpath 和 .project,可以直接導入eclipse
我2種都試過啦,eclipse 報錯比較難搞定,最後使用的是IDEA;
直接以maven 工程導入就行了,導入後,編譯也ok
『捌』 java-如何在Eclipse中編譯Netty的API
下載java-docs-api-cn.zip中文文檔的壓縮包。如:http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_zh_CN.zip
啟動eclipse --> [Window]菜單 --> Preferences項 --> 點擊對話框左面Java屬性下的Installed JREs,選擇右面列表中的jdk1.5.0_06,然後點擊右側的Edit按鈕打開Edit JRE對話框 --> 在JRE system libraries列表中選擇c:/java/jdk1.6.0_22/jre/lib/rt.jar,點擊右側的Javadoc Location按鈕,在彈出的對話框中選擇Javadoc in archive,將其中的Archive path設置為電腦中java-docs-api-cn.zip中文文檔的所在路徑,最後把Path within archive定位在文檔壓縮包中的api目錄(比如html/zh_CN/api)。
『玖』 如何編譯 netty 源碼並導入android studio
一、修改Android Studio(以下簡稱AS)的內存配置
因為在導入源碼時需要消耗大量內存,所以先修改IDEA_HOME/bin/studio.vmoptions中-Xms和-Xmx的值。文檔中使用的是748m, 可自行修改。
二、配置AS的JDK、SDK
在IDE中添加一個沒有classpath的JDK, 這樣可以確保使用源碼里的庫文件
並將其作為要使用的SDK的Java SDK。
三、生成導入AS所需配置文件(*.ipr)
①編譯源碼(為了確保生成了.java文件,如R.java;如果編譯過,則無需再次編譯)
②檢查out/host/linux-x86/framework/目錄下是否有idegen.jar
如果idegen.jar不存在,執行:
mmm development/tools/idegen/
在5.0.1的源碼中會生成res.java的文件夾,導致idegen.jar運行時拋FileNotFoundException,這是idegen的代碼不夠嚴謹造成的。
我的分享里有修改這個bug的patch,或者直接使用我分享的idegen.jar。
③執行
development/tools/idegen/idegen.sh
等待出現類似下面的結果:
Read excludes: 5ms
Traversed tree: 44078ms
這時會在源碼的根目錄下生成android.ipr和android.iml兩個IntelliJ IDEA(AS是基於IntelliJ IDEA社區版開發的)的配置文件