Spring Boot與Docker(二):使用Spring Boot和Docker構(gòu)建微服務(wù)架構(gòu)

本篇是《使用Spring Boot和Docker構(gòu)建微服務(wù)架構(gòu)》系列的第二篇,本篇我們將會利用工具進行設(shè)置僚祷,深入探討如何使用Docker工作,然后搭建我們的第一個容器贮缕。原文作者為3Pillar環(huán)球旗下美國Adbanced技術(shù)集團的總監(jiān)Dan Greene辙谜,Dan有十八年的軟件設(shè)計和開發(fā)經(jīng)驗,包括在電子商務(wù)感昼、B2B集成装哆、空間分析、SOA架構(gòu)定嗓、大數(shù)據(jù)以及云計算等領(lǐng)域的軟件產(chǎn)品架構(gòu)經(jīng)驗蜕琴,他是AWS認(rèn)證解決方案架構(gòu)師,在3Pillar之前先后就職于Oracle蜕乡、ChoicePoint和Booz Allen Hamilton奸绷。Dan畢業(yè)于喬治·華盛頓大學(xué)梗夸,他也是一個父親层玲、業(yè)余木工愛好者,還參加過包括國際障礙大賽這樣的障礙賽跑反症。介紹和工具在本篇中辛块,我們將會構(gòu)建第一篇中討論的解決方案。我是在Mac上工作的铅碍,但是工具在Mac和PC上是相同的润绵,所以在平臺上的操作是99%相同的,我將不會回顧如何安裝這些工具胞谈,而是直接從如何使用它們開始尘盼,你所需要的準(zhǔn)備工作如下:Docker Toolbox:包含了VirtualBox(作用為創(chuàng)建虛擬機用來運行容器)憨愉、Docker Machine(在虛擬機內(nèi)運行Docker容器)、Docker Kitematic(一個管理在Docker Machine里運行的容器的GUI)以及Docker Compose(多容器編排工具)
Git:我的GitHub鏈接在這兒卿捎,我在Windows上使用Git Extensions配紫,在Mac上使用Source Tree,不過使用其他Git客戶端包括命令行都是可以的午阵。
Java 8 SDK:Java 8在JVM永久代(PermGen)方面有了改進躺孝,另外對于Streams API和Lambda的支持也是非常贊的。
構(gòu)建工具的選擇:讓我們使用Gradle吧底桂,我推薦使用SDKMan植袍,正式名稱為GVM來管理Gradle版本,如果你使用Windows工作籽懦,你可以使用Cygwin安裝SDKMan或者SDKMan的Powershell命令行工具于个,或者Gravy也是可替代的選擇。
IDE的選擇:我們使用Spring Tool Suite(STS)來工作暮顺,在本文寫作時最新的for Mac版本為3.7.0览濒。
Rest工具:對于任何Web服務(wù)項目使用都非常方便,我是Chrome擴展工具Postman的粉絲拖云,如果你擅長curl命令行贷笛,這個工具也是不錯的。
uMongo或者Mongo GUI:文檔型數(shù)據(jù)庫完美匹配自足性的模型——對象進行自動檢索宙项,并且參考對象可以在微服務(wù)架構(gòu)中通過ID來引用乏苦,這些ID可以很好地映射到文檔存儲中,另外地尤筐,MongoDB擁有運行很棒的“官方”Docker鏡像汇荐。

我們對于源代碼管理的第一個意見——似乎也是絕大多數(shù)的在線觀點,就是每個微服務(wù)都應(yīng)該有自己的版本庫盆繁。微服務(wù)的一個基本理念就是跨服務(wù)之間不能共享代碼掀淘。就我個人而言,這對我架構(gòu)師的小心臟是個小小的打擊油昂,因為任何實用工具的重復(fù)代碼的數(shù)量可能會比較多革娄,以及缺乏一個單一、統(tǒng)一的領(lǐng)域模型給我有點心痛的感覺冕碟。我理解這個原則——自足性意味著自力更生拦惋。為了這篇博文,我把所有的代碼都放到了一個單獨的代碼庫安寺,然而厕妖,每個微服務(wù)在根目錄下都有它一個自己的目錄。這樣做是為了讓我可以隨著時間的推移展示分支的進展挑庶。在一個真實的解決方案中言秸,你應(yīng)該讓每一個微服務(wù)都有它自己的不同的版本庫软能,也許會有統(tǒng)一的版本庫引用其它的子模塊。總體思路因為我們要處理隔離的举畸、可重用的組件埋嵌,我們將做以下的映射:一個邏輯業(yè)務(wù)對象→一個微服務(wù)→一個Git版本庫目錄→一個Mongo集合因為業(yè)務(wù)對象可能由多個對象組成,任何我們認(rèn)為可以作為其自身業(yè)務(wù)對象的子對象都可以劃分為其自身的組件棧俱恶。更多有關(guān)Docker如何工作的信息雹嗦,以及我們的第一個容器為了理解如何構(gòu)建一個完整的基于Docker容器的產(chǎn)品解決方案贯被,我們將需要深入研究容器是如何在宿主機(或者是虛擬機西采,正如我們的例子)里運行的囤萤,使用Docker通常是有三個階段:鏡像構(gòu)建妓布、鏡像分發(fā)和容器部署鸡挠。構(gòu)建鏡像——Dockerfile的世界為了構(gòu)建鏡像熏矿,你要寫一系列的指令用來獲取已有的鏡像绘趋,接著對該鏡像做些改變和配置炒事。官方的Docker Hub Repository包含了許多的“官方”鏡像以及數(shù)以千計的用戶定制的鏡像难礼。如果其中的鏡像不太符合你的需求娃圆,你可以創(chuàng)建一個定制的Dockerfile,用來在鏡像上逐步添加一些內(nèi)容蛾茉,讼呢,比如安裝系統(tǒng)軟件包、復(fù)制文件或者公開一些網(wǎng)絡(luò)端口谦炬,當(dāng)我們構(gòu)建微服務(wù)時悦屏,我們將會創(chuàng)建一個定制的Dockerfile,不過現(xiàn)在键思,我們將會利用一個標(biāo)準(zhǔn)鏡像來啟動一個MongoDB實例础爬。容器聯(lián)網(wǎng)當(dāng)容器啟動時,有一個它私有的網(wǎng)絡(luò)吼鳞,容器宿主機端口將外部網(wǎng)絡(luò)通信轉(zhuǎn)發(fā)到單個的容器端口上看蚜,特定的容器端口可以通過Dockerfile來決定公開,并且端口轉(zhuǎn)發(fā)可以通過以下兩種方式之一來進行:你可以顯式地從宿主機映射端口到容器上赔桌,或者如果沒有顯式映射的話供炎,Docker將映射已聲明的容器端口到宿主機一個可用的臨時端口上(通常的范圍是從32768到61000)。當(dāng)我們可以對整個解決方案顯式地管理端口映射時纬乍,通常讓Docker處理這一切是一個更加好的主意碱茁,并且可以通過Link機制公開端口信息到容器上,這方面將在我們構(gòu)建我們的第一個微服務(wù)容器時有所涉及仿贬。啟動MongoDB容器無論你是使用Kitematic還是Docker命令行,都可以非常簡單的啟動一個標(biāo)準(zhǔn)的容器墓贿。使用命令行的話茧泪,如果一切都安裝正確蜓氨,命令提示符將會包含以下三個關(guān)鍵的環(huán)境變量:DOCKER_HOST=tcp://192.168.99.100:2376DOCKER_MACHINE_NAME=defaultDOCKER_TLS_VERIFY=1DOCKER_CERT_PATH=/Users/[username]/.docker/machine/machines/default
這些是按照你的情況設(shè)置的(如果是在安裝過程中打開的話,你可能需要重啟終端或者命令提示符)队伟。這些都是必要的穴吹,因為Docker不能直接運行在我的Mac筆記本上,而是跑在筆記本運行的虛擬機上嗜侮。Docker客戶端非常有效地將Docker命令從我的筆記本“代理”到虛擬機上港令,在我們啟動容器前,讓我們重溫一下一部分Docker命令是非常有益的锈颗,在使用任何圖形用戶界面之前顷霹,了解命令行的東西總是很好的。Docker級別的命令:docker ps該命令將會列出所有運行的容器击吱,顯示的信息包括它們的ID淋淀、名字、基礎(chǔ)鏡像名字和端口映射信息等覆醇。docker build該命令用來定義一個鏡像——通過處理Dockerfile來創(chuàng)建一個新的鏡像朵纷,我們將用這個命令來構(gòu)建我們的微服務(wù)鏡像。docker pull[鏡像名字]該命令從遠程Repository拉取鏡像并且存儲在本地永脓。docker run該命令將基于一個本地或者遠程Repository(比如Docker Hub)啟動一個容器袍辞,我們將會相當(dāng)多地探究這個命令。docker push該命令推送一個構(gòu)建好的鏡像到一個Repository常摧,通常是Docker Hub革屠。容器特定的命令這些命令使用容器ID或者名字作為一個參數(shù):docker status [容器名字/ID][容器名字/ID]這個命令將顯示指定的每一個容器的當(dāng)前負(fù)載,比如CPU占用率排宰、內(nèi)存使用率以及網(wǎng)絡(luò)流量等似芝。docker logs [-f][容器名字/ID]該命令顯示容器的最新的日志,-f選項就好比Shell終端中的“tail -f”中的-f選項板甘。docker inspect [容器名字/ID]該命令將容器的所有配置信息以JSON的格式轉(zhuǎn)儲出來顯示党瓮。docker port [容器名字/ID]該命令顯示容器與宿主機之間的所有端口映射信息。docker exec [-i][-t][容器名字/ID]該命令將在目標(biāo)容器上執(zhí)行一條命令(-i表明以交互方式運行盐类,-t表明以偽TTY終端運行)寞奸,這個命令常用來獲得一個容器終端Shell:docker exec -it [容器名字/ID]sh一旦我們理解了這些參考材料,我們可以進入到下一步啟動一個Mongo容器在跳。命令非常簡單:docker run -P -d —name mongo mongo解釋如下:P選項告知Docker在臨時端口范圍里公開容器聲明的任何端口
d選項告知以Daemon方式運行容器(比如在后臺)
name選項給容器分配一個名字(名字必須在所有運行的容器實例中唯一枪萄,如果你不提供這個選項,將會獲得一個隨機的半友好的名字比如modest_poitras)
最后的mongo表明了使用哪一個鏡像

Docker Hub鏡像的定義采用了[所有者]/[鏡像名字][:標(biāo)簽]的命名格式猫妙,如果沒有指定所有者瓷翻,那么使用的就是“官方”的Docker Hub鏡像——這是預(yù)留給Docker官方給軟件供應(yīng)商的禮物也就是成為官方鏡像,如果最后的標(biāo)簽部分省略的話,那么就會認(rèn)為你需要獲得的是最新版本的鏡像∑胫悖現(xiàn)在我們來嘗試確認(rèn)我們的Mongo實例已經(jīng)啟動并且運行了:docker exec -it mongo shmongo
MongoDB shell version: 3.0.6connecting to: testServer has startup warnings:2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten]2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten]2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'2015-09-02T00:57:30.761+0000 I CONTROL [initandlisten]> use microserviceblogswitched to db microserviceblog> db.createCollection('testCollection'){ "ok" : 1 }
在容器內(nèi)部妒牙,Mongo看起來正在運行,但是我們可以從外部獲知嗎对妄?為了嘗試這個湘今,我們需要查看什么臨時端口被映射到了Mongo的端口上,我們運行如下命令:docker ps
從下面我們可以看到(為了可讀性省略了一些列):CONTAINER ID IMAGE PORTS NAMES87192b65de95 mongo 0.0.0.0:32777->27017/tcp mongodb
我們可以看到宿主機端口32777映射到了容器端口27017上剪菱,然而摩瞎,記住我們的容器是運行在虛擬機上的,所以我們必須回到我們的環(huán)境變量:$ echo $DOCKER_HOSTtcp://192.168.99.100:2376
我們應(yīng)該可以通過如下的地址訪問我們的Mongo容器的27017端口:192.168.99.100:32777孝常,啟動Mongo然后點擊那個位置顯示數(shù)據(jù)庫可以外部訪問:[圖片上傳中旗们。。茫因。(1)]
在這里結(jié)束第二篇吧蚪拦,在本系列的第三篇中,我們將繼續(xù)探討冻押,通過創(chuàng)建一個或兩個微服務(wù)驰贷,管理它們的變化,然后運用持續(xù)集成以及產(chǎn)品部署技術(shù)進行工作洛巢。原文鏈接:BUILDING A MICROSERVICE ARCHITECTURE WITH SPRING BOOT AND DOCKER, PART II(翻譯:胡震)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末括袒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稿茉,更是在濱河造成了極大的恐慌锹锰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓库,死亡現(xiàn)場離奇詭異恃慧,居然都是意外死亡,警方通過查閱死者的電腦和手機渺蒿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門痢士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茂装,你說我怎么就攤上這事怠蹂。” “怎么了少态?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵城侧,是天一觀的道長。 經(jīng)常有香客問我彼妻,道長嫌佑,這世上最難降的妖魔是什么豆茫? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮歧强,結(jié)果婚禮上澜薄,老公的妹妹穿的比我還像新娘为肮。我一直安慰自己摊册,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布颊艳。 她就那樣靜靜地躺著茅特,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棋枕。 梳的紋絲不亂的頭發(fā)上白修,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音重斑,去河邊找鬼兵睛。 笑死,一個胖子當(dāng)著我的面吹牛窥浪,可吹牛的內(nèi)容都是我干的祖很。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼漾脂,長吁一口氣:“原來是場噩夢啊……” “哼假颇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骨稿,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤笨鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坦冠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形耗,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年辙浑,在試婚紗的時候發(fā)現(xiàn)自己被綠了激涤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡例衍,死狀恐怖昔期,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佛玄,我是刑警寧澤硼一,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站梦抢,受9級特大地震影響般贼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一哼蛆、第九天 我趴在偏房一處隱蔽的房頂上張望蕊梧。 院中可真熱鬧,春花似錦腮介、人聲如沸肥矢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甘改。三九已至,卻和暖如春灭抑,著一層夾襖步出監(jiān)牢的瞬間十艾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工腾节, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忘嫉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓案腺,卻偏偏與公主長得像庆冕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子救湖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容