微服務入門:Node.js + Docker + NoSQL
幾周前,我曾寫過一篇關于基于容器的應用的服務發現的文章,并為已存在的應用提供了一個工具來實現這類工作,并展示了一個動態更新Nginx虛擬主機配置的例子,展示了如何基于容器的變化來更新外部的DNS。本文將會將上述內容整合到一個多層級的應用中用于作為一個微服務架構的藍圖(原型)。本文所述例子的源代碼請參考Github倉庫。
Statement
原文地址:http://thenewstack.io/microservices-seconds-node-js-docker-nosql/
譯者:景莊,前端工程師,關注前端工程化技術、Node、ES6、React等。
綜述
本文我們將要整合的應用名叫Touchbase,它是一個Node.js應用。主要包括如下幾個部分:
- Touchbase,于整個應用棧的中心的Node.js應用
- Nginx,作為Touchbase應用的負載均衡器
- Couchbase,作為應用的數據層
- Consul,用于發現服務
- Containerbuddy,用于輔助服務發現
- CloudFlare-watcher,用于更新DNS
- CloudFlare DNS,用于使我們的站點能夠在互聯網上通過域名被訪問到
- Triton,我們的基于容器(container-native)的基礎架構平臺
該技術棧可以被用于任何微服務應用,并且每一個獨立組件都可以被輕松的置換(swap out)掉。如果你更喜歡HAProxy而不是Nginx?沒問題——只需要更新docker-compose.yml文件,替換為你想要使用的鏡像即可。

Touchbase
Node.js應用Touchbase是由Couchbase實驗室編寫的,主要用于演示Couchbase 4.0的新的N1QL查詢特性。它并不是針對容器化應用而設計的,因此我們需要使用Containerbuddy來使其滿足我們在服務發現上的基本需求。
Touchbase使用Couchbase作為數據層。我們可以使用它來直接處理請求,但我們并不準備這么做,而是在其前方增加一個Nginx作為負載均衡器,因為我們想要借助Nginx的能力來實現零停機時間的配置重載。(在真實的生產環境中,在Nginx后面可能包括多個應用)我們將會使用Touchbase的一個去除了SendGrid配置信息的Fork版本,因為配置交易郵件服務并不在本文的討論范圍內。
Touchbase服務的Containerbuddy有一個onChange事件的處理器,用于調出consul-template并基于存放在Consul中的模版來編寫新的config.json文件。遺憾的是,Touchbase并不能實現優雅的重載方式,因此為了能夠讓Touchbase的初始配置包含Couchbase的集群IP,我們需要一個預先啟動的腳本來做這件事。在主應用的復制前有權選擇是運行onChange處理器或者是另一個啟動腳本,這對Containerbuddy而言是一個非常有用的特性,關于這部分的內容我會在下一篇文章中再次進行討論。
Nginx
Nginx虛擬主機的配置有一個upstream指令,用于為后端的Touchbase應用節點運行一個具備最少連接(least-conns)的負載均衡器。當Touchbase節點上線的時候,它們將通過Consul來進行自身的注冊。
正如在我們最初的Containerbuddy實例項目中的那樣,Nginx服務的Containerbuddy有一個onChange事件的處理器,用于調出consul-template,并基于我們存放在Consul中的模版來寫入虛擬機的新的配置文件。然后它會觸發nginx -s reload信號來重新載入Nginx,從而使得Nginx能夠以更優雅的方式進行重新載入配置信息。
Couchbase
Couchbase是一個集群NoSQL數據庫。我們將會使用的是一個運行在容器中的Couchbase集群的原型,它是由我在Joyent的同事Casey Bisson編寫的。它使用了面向Couchbase 4.0的triton-couchbase倉庫用于獲取新的N1QL特性。
當第一個Couchbase節點啟動的時候,我們使用docker exec來啟動集群,然后用Consul來注冊第一個節點用于支持服務發現。然后我們將運行合適的REST API調用來創建Couchbase通(buckets),并且為我們的應用進行索引。
此時,我們將通過docker-compose scale命令來添加新的節點,并且這些節點將會從Consul中挑選一個Couchbase集群IP,之后,我們將會切換為Couchbase的自主集群(self-clustering)。
CloudFlare-watcher
正如在我們之前的動態DNS項目中的那樣,cloudflare容器將包括一個Containerbuddy onChange事件的處理器,并通過它們的API更新CloudFlare。該處理器是一個用于從已有A記錄中查詢CloudFlare APIbash腳本,
然后將它們與Consul中已知的IP地址進行比較。如果有變化的部分,我們就首先將新的記錄加入進去,然后移除掉任何過期的記錄。
運行例子
你可以通過運行該項目中的start.sh腳本腳本來運行整個技術棧,該文件位于Github倉庫的最外層。你需要一個CloudFlare賬戶和一個你已經在CloudFlare中委托(delegated)了的DNS的域名,當然你也可以跳過這個步驟,你只需要在腳本中注釋掉startCloudFlare這一行即可。
一旦準備好了,可以遵循如下步驟:
- 獲取一個Joyent賬戶
- 在你的電腦或環境中安裝Docker Toolbox(包括docker和docker-compose),以及Joyent CloudAPI CLI tools(包括masrtdc和json工具)。
- 為Joyent配置Docker和Docker Compose
- 準備好你的CloudFlare API的密鑰
此刻你就可以在Triton上運行你的應用了:
./start.sh envhere you'll be asked to fill in the .env file
./start.sh</pre>
或者在你的本地Docker環境中(你可能需要增加內存需求來滿足docker-machine虛擬機來運行完整規模的集群):./start.sh env ./start.sh -f docker-compose-local.yml
.env文件需要安裝如下格式進行創建:
CF_API_KEY=<your CloudFlare API key> CF_AUTH_EMAIL=<the email address associated with your CloudFlare account> CF_ROOT_DOMAIN=<the root domain you want to manage. ex. example.com> SERVICE=nginx <the name of the service you want to monitor> RECORD=<the A-record you want to manage. ex. my.example.com> TTL=600 <the DNS TTL you want> CB_USER=<the administrative user you want for your Couchbase cluster> CB_PASSWORD=<the password you want for that Couchbase user>
當啟動腳本運行后,他會啟動Consul的web界面和Couchbase的Web界面。一旦Nginx運行了,它會啟動Touchbase站點的登錄頁。目前為止只有一個Couchbase節點,一個應用服務器,和一個Nginx服務器,你將會看到如下消息:
Touchbase cluster is launched! Try scaling it up by running: ./start scale
如果你這么做了你將需要運行docker-compose scale操作來增加2個Couchbase和Touchbase節點和一個Nginx節點。
你可以通過Consul和Couchbase的Web界面來觀察新的節點的運行狀況。
總結
本文的主要內容是介紹應用在Docker化后所具有的優勢。首先,通過這種方式我們能夠獲取一個更簡單、更可重復的部署過程,這使得我們能夠進行快速簡單的本地測試,并將整個應用棧推送到生產環境中。其次,我們的應用能夠實現自動發現和配置,并且使得部署也更加的簡單。再其次,我們的應用能夠更容易的進行水平擴展,并且各個層次能夠進行更好的細粒度的規模控制。最后,我們能夠進行全局發現,這要感謝與CloudFlare的集成。
之前我們已經使用了Containerbuddy作為一個最小的shims的例子,它需要能夠讓任何應用實現容器化。但是目前,我們已經可以看到一個運行在Triton中的能夠應用于生產環境中的多層級應用,我們已經可以看到基于容器的服務發現可以是任何特定的調度框架。這使得它能夠非常簡單的連接到沒有被容器化的組件中。
將應用部署到Triton也使得這一切變得更加簡單。對于應用容器擁有它們自己的NIC(s)的環境而言,正如Triton那樣,
我們可以依賴應用容器來更新發現服務,而無需一個重量級的調度器。這意味著你可以使用諸如Docker Compose這類簡單的工具來部署和鏈接容器,而無需其他附加的軟件。使用Triton的容器化的應用架構無需提供虛擬機,Triton負責控制每一個容器,因此你可以很輕松的跟蹤你的應用在擴展時的開銷。你可以使用Joyent提供的公有云服務中的Triton進行部署,當然也可以是你的自有數據中心進行部署。只需要配置Docker和start.sh即可。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!