發表文章

Nginx http2 應用感想

圖片
Nginx 1.9.6 在上週出來了,直接支援 HTTP 2(注意,openssl得是1.0.2版以上),然後不小心又看了 Http2Demo ,裡面的測試是用一了張切了48張小圖的相片,測了一下,嗯,HTTP 2好像比較快,二話不說,馬上把公司的網站直接升級到 1.9.6,試了一下,怎麼好像沒有快多少? 不多說,馬上測試一下(用一個有88張小切圖的網頁,使用反向代理,在無Cache的情況下),先來個HTTP連線測一下(用 恐龍妹 測的) 花了305微秒,然後再測一下 HTTP 2(over TLS)連線, 啥!居然花了636微秒,這是什麼回事! 趕快回去看Nginx是 怎麼說 的! HTTP2使用單一連線,從上面的圖大概可以感受到,HTTP取得88張圖是同時開多個連線向主機要圖,而HTTP2則使用單一連線用多工的方式向主機要圖,也就是在人少的時候,主機應付的來的情況下,是同時給多張圖,而HTTP2則是把資料通過單一通道傳輸。 所以實際上 HTTP2會耗用比較多的記憶體,而下載大檔案或是媒體串流時,多工並無幫助,更重要的一點是HTTP2 的Hand Shake會花比較長的時間,而且更重要的是Nginx Http2一定要Over TLS,我相信加解密,不可避免地會耗用更多時間。 另外影響速度的關鍵是網路的往返(round trip)時間,以下是NGINX的實測狀況 可以看出,HTTP2 在須要加密傳輸時確實比較快,但比起單純的HTTP確實較慢。 或許有人會覺得,在大量用戶的時侯,單一連線會比較節省資源,但是我覺得有以下點須要加以考慮: NGINX是號稱可以抵擋DDOS攻擊的,大量用戶連線不致於造成問題 瀏覽器本身的Cache,Nginx會為每一個Resource加上ETag,下次再來時不會再次存取 不是 每種瀏覽器 都支援HTTP 2(其實不用太擔心,除了IE,大部份主流的瀏覽器都支援,不支援頂多回到HTTPS) 所以結論是 須要加密的網頁(像登錄、個資等敏感資料),請直升HTTP 2(不支援的瀏覽器直接回HTTPS) 非敏感的資料,還是維持原來的HTTP吧!畢竟速度較快(Google卻不這樣認為,她們把所有的Google網頁都用了HTTP 2/S通訊) PS: 有個瀏覽器外掛(HTTP/2...

Capsule:JVM的打包佈署開源工具

圖片
如 Capsule 自已所介紹,打包與發佈Java應用程式。 我的第一個印象是:包裝一個可執行Jar檔,不是很簡單的事嗎? 存在即是合理,要是有其必要之處。 她的原理很簡單 把可執行Jar檔的啟動Class換成她的:Capsule 照後這個Class依照設定來啟動您的程式(執行相關所需的環境變數、參數全部記載在MANIFEST內) 她把執行的行為分為 六種(Caplets) ,我覺的重要的至少有兩種: capsule-shield :把程式打包,乍看之下沒什麼,可是對於JNI程式就很有用處了,因為我們沒有辦法把JNI所需的Library與可執行Jar 綁在一塊,而且執行時一般得還得傳入 -Djava.library.path參數指定Native Library所在的位置才能順利執行,可是透過 Capsule 卻可以解決這個問題(這裡有個包JNI的 Jar (Linux或Windows)檔,可以直接下載執行) capsule-maven 也是個重要的Caplets,程式打包通常的作法是把所有會用到Jar Library解開後再一起打成一包,會產生所謂的Fat Jar(檔案比較大),而 capsule-maven 讓我們把程式delivery時,不用包含這些相關的Jar Library,而只交付所謂的 thin jar(不含其它Library),然後在Runtime(執時)階段時再來下載這些Library。 capsule-desktop :用來執行GUI程式,說實在的看不出來有什麼特別 capsule-secure :沒試過,她的描述是: 以設定的安全政策在Java的沙盒中執行 capsule-osv :也沒試過,說是用來打包程式在 OSv microkernel 雲端執行。 MANIFEST 說明 先來一個最簡單的 lwjgl.Jar 打包說明(Fat-Jar): 註:Native Library必須跟Capsule.class放在第一層,不要想在MANIFEST.MF自訂java.library.path,因為Capsule執行時會代入java.library.path直接蓋過你的設定。 Fat-Jar檔內的MNAIFEST.MF內容 Main-Class: Ca...

小黃瓜的驗收測試

Cucumber 是一個以驗收測試為目標的框架,對碼農來說,就是有人(PM或參與的用戶)把使用者情境(或者說是使用者腳本)的過程寫出來,然後我們想法子匹配到我們的程式中,看看程試跑出的結果是否有符合腳本所要描述的狀態。 廢話少說,先體驗下: 首先開個目錄 cuke-first,然後在cuke-first/lib裡面放入 cucumber-java.jar 、 cucumber-core.jar 、 cucumber-jvm-deps.jar 、 gherkin.jar 然後在cuke-first/features寫入我們的第一個腳本如下checkout.feature # language: zh-TW 功能: 結帳  生鮮超市結帳測試腳本  場景: 香蕉結帳    假設"香蕉"每斤40元    當我買了1斤"香蕉"    那麼總價要付40元 看一下雛形寫法 cuke-first]$java -cp "lib/*:." cucumber.api.cli.Main -p pretty --snippets camelcase -d features 功能: 結帳  生鮮超市結帳測試腳本  場景: 香蕉結帳       # checkout.feature:4      假設"香蕉"每斤40元      當我買了1斤"香蕉"      那麼總價要付40元 1 Scenarios (1 undefined) 3 Steps (3 undefined) 0m0.000s 您可以用下面片段的程式來實作遺漏的步驟: @假設 ( "^ \" ([^ \" ]*) \" 每斤( \\ d+)元$" ) public void 每斤元( String arg1, int arg2) throws Throwable {  ...