Spring boot+Docker 實現內嵌tomcat Apr模式部署

       衆所周知tomcat有三種運行模式:bio、nio、apr模式。這三種模式在理論上是bio性能最差,apr性能最好,但是也有文章表明在相同的環境不同情況併發下apr模式不一定比bio更好,但是這不屬於本文討論內容,至於模式的選擇還是要根據自己項目情況來定,本文主要介紹在docker中運行spring boot(內嵌tomcat)時如何開啓APR模式。

       首先介紹下這三種模式的區別:

              BIO模式:tomcat使用傳統的Java I/O,是基於JAVA的HTTP/1.1的連接器,性能較差,tomcat 7及以下版本默認採用該模式,比較適用於連接數目小且比較固定的架構

              NIO模式:是一個基於緩衝區並能提供非阻塞I/O操作的JAVA API,Java SE 1.4之後出現的,比BIO的併發性能要好,適用於連接數目多並且連接比較短的輕操作架構

              APR模式:全稱是Apache Portable Runtime/Apace 可移植運行庫,是Apache HTTP服務器的支持庫。Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,大大的提高了對靜態文件的處理性能,是tomcat上運行高併發應用的首選模式,需要在操作系統中安裝第三方類庫

       介紹下項目情況,我們項目採用的是spring boot 1.5.4、內嵌tomcat版本號爲8.5.15,通過源碼分析我們可以看到在spring boot中tomcat默認採用nio模式

 

       根據上面介紹我們可以看到tomcat在bio和nio模式之間切換比較簡單,我們只需更改tomcat connector的連接模式即可。但是要想採用apr模式,不僅要進行connector連接模式的更改,還需要在OS中安裝相關類庫,包括:apr、apr-util、tomcat-native。在普通系統中安裝這些類庫網絡上都有相關文章介紹,一般不是什麼難事。但是我們現在要在docker中去安裝這些類庫可能就需要大費周章了:一、docker中的系統一般只包含最基本的系統類庫和命令,絕大部分都是沒有的;二、安裝apr相關軟件一般都需要進行源碼安裝,而docker所包含的系統中基本沒有gcc等相關類庫,要大費周章去裝很多東西,且最後基本上很難實現(筆者就跳了好多坑,最後也沒有成功安裝)。

       現在我們來分析下spring boot+docker實現內嵌tomcat apr模式部署的思路:一、保證spring boot可以以apr模式運行於內嵌tomcat;二、docker中能成功安裝apr相關組件。有思路了那就開始嘗試,我分析了源碼並結合了網絡資料,在本機中裝上apr相關組件(本機安裝就不再介紹了),並在spring boot項目中的某Java Config中加入以下配置,啓動成功,說明spring boot開啓apr模式沒問題,繼續進行第二步!

       我們項目原本採用的docker基礎鏡像爲」java:8」,docker中操作系統爲debian。首先考慮採用apt-get install的方式安裝,但一直報錯「Unable to locate package apr」,從網上找了很多方式都無法解決,估計是缺東西太多。然後我就準備用源碼安裝,將下載好的安裝包拷貝上來(通過數據卷映射宿主機磁盤的方式),但是安裝過程中缺包太多,根本就無法進行,只好放棄了。「java:8」鏡像不行,那是否可以換個鏡像呢?馬上使用docker search apr命令進行搜索,只有一個buglife/tomcat-apr比較符合,但也不是要找的,因爲我要採用內嵌的方式,在鏡像中多一個外部tomcat也是累贅(從精簡鏡像用途考慮)。這些方式都行不通,那麼是否可以找一個最精簡的系統來自己安裝呢?debian不行,我不喜歡它,我們服務器一般都採用centos,那就使用centos吧。找了一下,決定採用「centos:7.2.1511」。將鏡像pull下來,通過docker run -it centos:7.2.1511命令進去看一下是否符合要求。進去之後首先使用yum、vi等命令試了下發現都可以用,那就它了!

       選擇好鏡像之後,通過docker的交互式模式進入鏡像進行安裝嘗試。首先使用yum upgrade進行版本的升級,然後試着以yum的模式安裝apr、apr-util、apr-devel都沒問題,那就只剩tomcat-native了,也採用yum命令安裝發現沒有相關類庫。那我繼續採用源碼安裝吧,沒有gcc,又走到了要安裝gcc的老路了,要崩潰了!這時我忽然想到默認的yum源中沒有tomcat-native,其他源有可能提供啊,於是就去百度常用的yum源,找到了一個阿里的源。於是更改/etc/yum.conf源文件,然後再去yum install tomcat-native就可以順利安裝了!

       環境安裝好了,但是工程可以運行嗎?我把打包好的工程拷貝進來進行啓動,OK,一切正常!那就可以編寫Dockerfile文件了。

       將Dockerfile和重新編寫好的yum.conf文件放在同一個空的文件夾下,執行docker build -t [鏡像名:版本號] . 命令打成一個新的鏡像,然後推到遠程鏡像庫(我們採用阿里的鏡像庫),在原鏡像文件中以此鏡像做爲基礎鏡像文件即可。部署到服務器,運行完全沒問題!如需瞭解採用阿里雲+docker來部署spring cloud,請閱讀我的另一篇文章《Spring Cloud與Docker的完美結合,運維可以不用拜菩薩啦》


如需獲取更多精彩內容或者技術探討,請掃碼關注本人公衆號!愛生活,愛代碼,代碼也是碼,我是愛碼三瘋!

愛碼三瘋公衆號:hlt0912_dyh