足球资料库数据/孙祥/nba五佳球/足球直播哪个平台好 - cctv5今日现场直播

首頁 > 知識庫 > 正文

微服務(wù)入門:Node.js + Docker + NoSQL
2016-01-19 21:57:40   來源: mengyidan1988   評論:0 點(diǎn)擊:

幾周前,我曾寫過一篇關(guān)于基于容器的應(yīng)用的服務(wù)發(fā)現(xiàn)的文章,并為已存在的應(yīng)用提供了一個工具來實(shí)現(xiàn)這類工作,并展示了一個動態(tài)更新Nginx虛擬主機(jī)配置的例子,展示了如何基于容器的變
幾周前,我曾寫過一篇關(guān)于基于容器的應(yīng)用的服務(wù)發(fā)現(xiàn)的文章,并為已存在的應(yīng)用提供了一個工具來實(shí)現(xiàn)這類工作,并展示了一個動態(tài)更新Nginx虛擬主機(jī)配置的例子,展示了如何基于容器的變化來更新外部的DNS。本文將會將上述內(nèi)容整合到一個多層級的應(yīng)用中用于作為一個微服務(wù)架構(gòu)的藍(lán)圖(原型)。本文所述例子的源代碼請參考Github倉庫。

Statement
原文地址:http://thenewstack.io/microservices-seconds-node-js-docker-nosql/
譯者:景莊,前端工程師,關(guān)注前端工程化技術(shù)、Node、ES6、React等。
綜述
本文我們將要整合的應(yīng)用名叫Touchbase,它是一個Node.js應(yīng)用。主要包括如下幾個部分:
  • Touchbase,于整個應(yīng)用棧的中心的Node.js應(yīng)用
  • Nginx,作為Touchbase應(yīng)用的負(fù)載均衡器
  • Couchbase,作為應(yīng)用的數(shù)據(jù)層
  • Consul,用于發(fā)現(xiàn)服務(wù)
  • Containerbuddy,用于輔助服務(wù)發(fā)現(xiàn)
  • CloudFlare-watcher,用于更新DNS
  • CloudFlare DNS,用于使我們的站點(diǎn)能夠在互聯(lián)網(wǎng)上通過域名被訪問到
  • Triton,我們的基于容器(container-native)的基礎(chǔ)架構(gòu)平臺

該技術(shù)棧可以被用于任何微服務(wù)應(yīng)用,并且每一個獨(dú)立組件都可以被輕松的置換(swap out)掉。如果你更喜歡HAProxy而不是Nginx?沒問題——只需要更新docker-compose.yml文件,替換為你想要使用的鏡像即可。



Touchbase
Node.js應(yīng)用Touchbase是由Couchbase實(shí)驗(yàn)室編寫的,主要用于演示Couchbase 4.0的新的N1QL查詢特性。它并不是針對容器化應(yīng)用而設(shè)計(jì)的,因此我們需要使用Containerbuddy來使其滿足我們在服務(wù)發(fā)現(xiàn)上的基本需求。

Touchbase使用Couchbase作為數(shù)據(jù)層。我們可以使用它來直接處理請求,但我們并不準(zhǔn)備這么做,而是在其前方增加一個Nginx作為負(fù)載均衡器,因?yàn)槲覀兿胍柚鶱ginx的能力來實(shí)現(xiàn)零停機(jī)時(shí)間的配置重載。(在真實(shí)的生產(chǎn)環(huán)境中,在Nginx后面可能包括多個應(yīng)用)我們將會使用Touchbase的一個去除了SendGrid配置信息的Fork版本,因?yàn)榕渲媒灰奏]件服務(wù)并不在本文的討論范圍內(nèi)。

Touchbase服務(wù)的Containerbuddy有一個onChange事件的處理器,用于調(diào)出consul-template并基于存放在Consul中的模版來編寫新的config.json文件。遺憾的是,Touchbase并不能實(shí)現(xiàn)優(yōu)雅的重載方式,因此為了能夠讓Touchbase的初始配置包含Couchbase的集群IP,我們需要一個預(yù)先啟動的腳本來做這件事。在主應(yīng)用的復(fù)制前有權(quán)選擇是運(yùn)行onChange處理器或者是另一個啟動腳本,這對Containerbuddy而言是一個非常有用的特性,關(guān)于這部分的內(nèi)容我會在下一篇文章中再次進(jìn)行討論。

Nginx
Nginx虛擬主機(jī)的配置有一個upstream指令,用于為后端的Touchbase應(yīng)用節(jié)點(diǎn)運(yùn)行一個具備最少連接(least-conns)的負(fù)載均衡器。當(dāng)Touchbase節(jié)點(diǎn)上線的時(shí)候,它們將通過Consul來進(jìn)行自身的注冊。

正如在我們最初的Containerbuddy實(shí)例項(xiàng)目中的那樣,Nginx服務(wù)的Containerbuddy有一個onChange事件的處理器,用于調(diào)出consul-template,并基于我們存放在Consul中的模版來寫入虛擬機(jī)的新的配置文件。然后它會觸發(fā)nginx -s reload信號來重新載入Nginx,從而使得Nginx能夠以更優(yōu)雅的方式進(jìn)行重新載入配置信息。

Couchbase
Couchbase是一個集群NoSQL數(shù)據(jù)庫。我們將會使用的是一個運(yùn)行在容器中的Couchbase集群的原型,它是由我在Joyent的同事Casey Bisson編寫的。它使用了面向Couchbase 4.0的triton-couchbase倉庫用于獲取新的N1QL特性。

當(dāng)?shù)谝粋€Couchbase節(jié)點(diǎn)啟動的時(shí)候,我們使用docker exec來啟動集群,然后用Consul來注冊第一個節(jié)點(diǎn)用于支持服務(wù)發(fā)現(xiàn)。然后我們將運(yùn)行合適的REST API調(diào)用來創(chuàng)建Couchbase通(buckets),并且為我們的應(yīng)用進(jìn)行索引。
此時(shí),我們將通過docker-compose scale命令來添加新的節(jié)點(diǎn),并且這些節(jié)點(diǎn)將會從Consul中挑選一個Couchbase集群IP,之后,我們將會切換為Couchbase的自主集群(self-clustering)。

CloudFlare-watcher
正如在我們之前的動態(tài)DNS項(xiàng)目中的那樣,cloudflare容器將包括一個Containerbuddy onChange事件的處理器,并通過它們的API更新CloudFlare。該處理器是一個用于從已有A記錄中查詢CloudFlare APIbash腳本,
然后將它們與Consul中已知的IP地址進(jìn)行比較。如果有變化的部分,我們就首先將新的記錄加入進(jìn)去,然后移除掉任何過期的記錄。

運(yùn)行例子
你可以通過運(yùn)行該項(xiàng)目中的start.sh腳本腳本來運(yùn)行整個技術(shù)棧,該文件位于Github倉庫的最外層。你需要一個CloudFlare賬戶和一個你已經(jīng)在CloudFlare中委托(delegated)了的DNS的域名,當(dāng)然你也可以跳過這個步驟,你只需要在腳本中注釋掉startCloudFlare這一行即可。

一旦準(zhǔn)備好了,可以遵循如下步驟:
  • 獲取一個Joyent賬戶
  • 在你的電腦或環(huán)境中安裝Docker Toolbox(包括docker和docker-compose),以及Joyent CloudAPI CLI tools(包括masrtdc和json工具)。
  • 為Joyent配置Docker和Docker Compose
  • 準(zhǔn)備好你的CloudFlare API的密鑰

此刻你就可以在Triton上運(yùn)行你的應(yīng)用了:
./start.sh env# here you'll be asked to fill in the .env file./start.sh

或者在你的本地Docker環(huán)境中(你可能需要增加內(nèi)存需求來滿足docker-machine虛擬機(jī)來運(yùn)行完整規(guī)模的集群):
./start.sh env./start.sh -f docker-compose-local.yml

.env文件需要安裝如下格式進(jìn)行創(chuàng)建:
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>

當(dāng)啟動腳本運(yùn)行后,他會啟動Consul的web界面和Couchbase的Web界面。一旦Nginx運(yùn)行了,它會啟動Touchbase站點(diǎn)的登錄頁。目前為止只有一個Couchbase節(jié)點(diǎn),一個應(yīng)用服務(wù)器,和一個Nginx服務(wù)器,你將會看到如下消息:
Touchbase cluster is launched!Try scaling it up by running: ./start scale

如果你這么做了你將需要運(yùn)行docker-compose scale操作來增加2個Couchbase和Touchbase節(jié)點(diǎn)和一個Nginx節(jié)點(diǎn)。
你可以通過Consul和Couchbase的Web界面來觀察新的節(jié)點(diǎn)的運(yùn)行狀況。

總結(jié)
本文的主要內(nèi)容是介紹應(yīng)用在Docker化后所具有的優(yōu)勢。首先,通過這種方式我們能夠獲取一個更簡單、更可重復(fù)的部署過程,這使得我們能夠進(jìn)行快速簡單的本地測試,并將整個應(yīng)用棧推送到生產(chǎn)環(huán)境中。其次,我們的應(yīng)用能夠?qū)崿F(xiàn)自動發(fā)現(xiàn)和配置,并且使得部署也更加的簡單。再其次,我們的應(yīng)用能夠更容易的進(jìn)行水平擴(kuò)展,并且各個層次能夠進(jìn)行更好的細(xì)粒度的規(guī)??刂?。最后,我們能夠進(jìn)行全局發(fā)現(xiàn),這要感謝與CloudFlare的集成。

之前我們已經(jīng)使用了Containerbuddy作為一個最小的shims的例子,它需要能夠讓任何應(yīng)用實(shí)現(xiàn)容器化。但是目前,我們已經(jīng)可以看到一個運(yùn)行在Triton中的能夠應(yīng)用于生產(chǎn)環(huán)境中的多層級應(yīng)用,我們已經(jīng)可以看到基于容器的服務(wù)發(fā)現(xiàn)可以是任何特定的調(diào)度框架。這使得它能夠非常簡單的連接到?jīng)]有被容器化的組件中。

將應(yīng)用部署到Triton也使得這一切變得更加簡單。對于應(yīng)用容器擁有它們自己的NIC(s)的環(huán)境而言,正如Triton那樣,
我們可以依賴應(yīng)用容器來更新發(fā)現(xiàn)服務(wù),而無需一個重量級的調(diào)度器。這意味著你可以使用諸如Docker Compose這類簡單的工具來部署和鏈接容器,而無需其他附加的軟件。使用Triton的容器化的應(yīng)用架構(gòu)無需提供虛擬機(jī),Triton負(fù)責(zé)控制每一個容器,因此你可以很輕松的跟蹤你的應(yīng)用在擴(kuò)展時(shí)的開銷。你可以使用Joyent提供的公有云服務(wù)中的Triton進(jìn)行部署,當(dāng)然也可以是你的自有數(shù)據(jù)中心進(jìn)行部署。只需要配置Docker和start.sh即可。

相關(guān)熱詞搜索:微服務(wù) Node js Docker nosql web Web前端

上一篇:Docker:2016年將帶來什么變化
下一篇:ChakraCore:微軟開源Edge的JavaScript引擎

分享到: 收藏