代碼級乾貨 | 如何利用Docker與Rails API gem構建微服務

今天小數給你們帶來的是一篇代碼級乾貨文章,與你們分享一些利用Rails API以微服務形式設置應用的經驗與心得。mysql

爲什麼選擇Docker加Rails API?

在我效力的企業中,咱們一直在利用Docker爲所有工程師構建開發環境。在這種狀況下,新人加入後可以快速擁有與之對應的容器工做環境。與大多數長久使用總體應用的企業同樣,咱們一樣但願充分發揮微服務架構帶來的鬆散耦合、高緊湊性與獨立部署等固有優點。web

我曾經利用Rails做爲API構建過幾款應用——坦率地講,這種做法有點矯枉過正,由於咱們其實不必使用其中的所有視圖邏輯與額外中間件。Rails API gem集成於Rails 5版本當中,此版本目前處於beta測試階段。我曾經打算利用Docker完成上述工做,但卻在設置過程當中遇到了困難,因此在今天的文章中,我將利用Rails 4完成設置並將rails-api gem做爲關聯性添加至Gemfile當中。sql

你們可能會問,爲何要將Rails API做爲微服務架構中的技術堆棧。我認爲具體答案取決於技術團隊的實際專長方向。互聯網上曾經就要不要投身微服務以及應該具體使用哪些技術產生過激烈的爭論。能夠看到,不少朋友利用Node.js、Go、Scala或者Java等其它卓越技術完成了任務。我曾經拿出過一段時間體驗這些方案,也認同它們的出色表現,但我所的在團隊更熟悉Rails。所以出於快速開發的考量,咱們作出了這樣的決定。若是非要再選一種潛在方案,我我的更傾向於Node.js,由於咱們的不少新應用都以其爲基礎構建而成。在我看來,這一轉型項目的最終目標在於確保每項服務都擁有小巧的體積,從而可以在必要時實現輕鬆重寫。docker

從Docker起步

設置工做

今天的教程面向Mac用戶,但你們也能夠在Linux發行版或者Windows平臺上實現相似的操做。首先在終端中爲項目建立一個目錄。我將把項目命名爲「inventory manager」,但你們也能夠隨意選擇本身喜歡的名稱。數據庫

圖片描述

接下來在項目root目錄下建立幾個文件。api

圖片描述

設置 Dockerfile

Dockerfile負責容納咱們Docker容器環境的所有設置。
圖片描述服務器

那麼咱們該在文件中添加怎樣的內容?在這裏咱們利用Ruby的最新版本(2.3.0)建立一套鏡像,然後在該容器上運行apt軟件包管理命令。咱們將利用MySQL客戶端庫進行開發。此後,咱們將把本地Gemfile與Gemfile.lock添加至容器的文件系統當中,再安裝其關聯性。最後,咱們將項目目錄內的所有內容添加至容器內。架構

設置 docker-compose.yml

咱們須要設置docker-compose.yml文件,從而確保Docker Compose工具可以對Rails API應用及咱們的MySQL容器間的通訊進行編排。微服務

圖片描述

這套配置創建起一套mysql容器,外加一套由Dockerfile構建而成的名爲web的容器,後者在端口9292上運行Puma webserver。接下來,咱們能夠將這一Rails應用容器鏈接至mysql容器,從而保證兩者可以彼此通訊。工具

設置 Gemfile

在Gemfile當中,咱們將添加Rails gem、Rails API gem、mysql客戶端適配器、Puma webserver以及Active Model Serializers(用於JSON格式的響應信息)。

圖片描述

建立Docker鏡像

如今進行Docker鏡像的建立。

圖片描述
圖片描述
運行Docker build命令,從而利用Dockerfile構建鏡像並安裝gem。
圖片描述
Docker鏡像已經成功建立完成

一旦Gemfile或者Dockerfile內容出現變動,你們將須要再次運行這條命令以重構Docker鏡像。你們能夠利用如下命令查看已經建立的鏡像:

圖片描述
圖片描述

建立Rails API應用結構

接下來,咱們在Docker鏡像中運行Rails API命令以建立應用結構。在咱們的 docker-compose.yml文件內,將「web」做爲命令執行的目標容器。
圖片描述
建立Rails API應用結構

設置數據庫

如今須要對database.yml文件進行設置,完成後便可進行數據遷移。

圖片描述

主機爲「db」,咱們已經在docker-compose.yml file文件中定義了該名稱。這一主機值必須與咱們在docker-compose.yml文件中定義的數據庫容器保持一致。

測試Web應用的運行狀況

如今應用結構已經構建完成,下面運行Web服務器以檢查可以正常查看Rails狀態頁面。

圖片描述
圖片描述
在各自容器中運行數據庫與Web應用,然後運行Puma server以監聽端口9292

圖片描述

個人docker-machine ip運行在端口192.168.59.100上。你們應確保運行docker-machine ip以找到正確的docker ip(本示例直接使用docker ip做爲別名)。

圖片描述

下一步

如今咱們的應用已經開始正常運行,以此爲基礎你們能夠隨意建立數據模型以及控制器等等。

咱們能夠經過這種方式建立更多微服務,並確保不一樣應用之間利用JSON經過http經由同一Docker主機的不一樣web服務器端口實現彼此通訊。咱們也可使用消息收發機制實現不一樣服務間的通訊,例如RabbitMQ。

原文做者:Charles Wang

相關文章
相關標籤/搜索