極簡Docker持續(xù)集成微服務(wù)架構(gòu)-收關(guān)

前言

Docker微服務(wù)架構(gòu),已漸漸成為服務(wù)器架構(gòu)的主流 。 但是對于Docker在生產(chǎn)環(huán)境的部署方案,目前沒有一個(gè)明確的標(biāo)準(zhǔn)或者最佳實(shí)踐。筆者對比了很多方案,也實(shí)踐了不少,發(fā)現(xiàn)要管理Docker的完整生命周期并非易事。最后經(jīng)過各種分析后,發(fā)現(xiàn)Docker微服務(wù)的架構(gòu)。只要消除一些看上去很必要的特性,其實(shí)可以很簡單。

這些特性包括:

  • 服務(wù)發(fā)現(xiàn)
  • 私有docker倉庫
  • 藍(lán)綠發(fā)布
  • 鏡像更新,容器重啟
  • 微服務(wù)負(fù)載均衡
  • 服務(wù)于無法熱部署的服務(wù)器語言(如Java)
  • 集中式的服務(wù)治理
  • 等等

去掉這些特性之后,回歸Docker的優(yōu)勢,其實(shí)就是應(yīng)用環(huán)境的隔離以及消除差異化。

拋棄這些特性后,剩下一些必要的東西,我的架構(gòu)看上去是這樣的:

image.png
  1. Git Server:這個(gè)肯定少不了
  2. Jenkins server:CI 較成熟的工具,暫時(shí)沒找著替代品
  3. 應(yīng)用服務(wù)器宿主機(jī)集群:這里部署的都是應(yīng)用層的服務(wù),對外做負(fù)載均衡方案,方案有很多,就不細(xì)說。
  4. 微服務(wù)宿主機(jī)集群:因?yàn)椴挥米鲐?fù)載均衡方案,宿主機(jī)其實(shí)可以是分散的,相互之前可以沒什么關(guān)系。
  5. 消息服務(wù):適合使用比較穩(wěn)定的云服務(wù),也可以自己搭集群。
  6. 若干工作站

所有的宿主機(jī)采用的是相同配置和方案,這樣復(fù)制起來比較簡單。
應(yīng)用服務(wù)和微服務(wù)只是定義上的差別,實(shí)際上都是一樣的。

整套方案,連摸索帶調(diào)試,也就花了一個(gè)下午的時(shí)間。當(dāng)然前設(shè)是之前踩了不少坑。
實(shí)際上這套方案的實(shí)施,難點(diǎn)也不多。所以很容易既拿既用。

構(gòu)建過程

1 準(zhǔn)備硬件環(huán)境

所有的工作都在一臺mac pro 上完成
在這臺mac pro上使用Vmware構(gòu)建了 幾臺CentOS 7 的虛擬機(jī)(Docker 3.x需要運(yùn)行在至少CentOS 7 上 )

  • Mac Pro :192.168.226.1, 工作站
  • CentOS 7 Node1 :192.168.226.137 ,部署jenkins server
  • CentOS 7 Node2 :192.168.226.138 ,微服務(wù)宿主機(jī)
  • CentOS 7 Node3 :192.168.226.139 ,應(yīng)用服務(wù)宿主機(jī)

宿主機(jī)的配置都是一樣的,可以選擇安裝完必要的服務(wù)后直接克?。╠ocker,docker-compose,rsync,后面會介紹)。

git server 直接使用github

2 安裝Docker

CentOS7 docker 的安裝可以看這篇文章:
https://yeasy.gitbooks.io/docker_practice/content/install/centos.html
按步驟安裝即可,千萬別忘了更改docker鏡像地址。

Centos 7 安裝docker-compose:

curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

關(guān)于鏡像地址的獲得Docker的基礎(chǔ)使用,以及mac下Docker的安裝,可以看實(shí)踐第一篇文章:
docker+consul基于服務(wù)發(fā)現(xiàn)的極簡web架構(gòu)實(shí)踐

現(xiàn)在你可以暫時(shí)忘記Docker了。

3 安裝jenkins

jenkins的安裝,你可以按這篇文章:
https://hostpresto.com/community/tutorials/how-to-install-jenkins-on-centos-7/
需要注意的是,文章里有點(diǎn)格式錯(cuò)誤

firewall-cmd --zone=public --permanent --add-port=8080/tcp firewall-cmd --reload

這個(gè)其實(shí)是兩行。

firewall-cmd --zone=public --permanent --add-port=8080/tcp 
firewall-cmd --reload

4 啟動消息服務(wù)

Mac 上: docker run -d --name rabbit -p 5672:5672 rabbitmq

5 獲得演示代碼

Mac 上:
git clone https://github.com/luaxlou/micro-service-practice.git

該項(xiàng)目包含了一個(gè)NodeJs 微服務(wù)框架的演示代碼,其中分兩部分。
seneca-listener:微服務(wù)
seneca-client: 應(yīng)用服務(wù)

關(guān)于seneca的詳細(xì)介紹,可以看之前的第二篇實(shí)踐:
docker+jenkins+seneca構(gòu)建去集中化微服務(wù)架構(gòu)

6 安裝Rsync服務(wù)

在所有的宿主機(jī)上安裝Rsync服務(wù),關(guān)于服務(wù)的安裝,可以看下面這篇文章:
http://www.cnblogs.com/zhangeamon/p/5724910.html
記得關(guān)閉所有的selinux。

7 開始配置自動集成

原理介紹

好了,所有必要的物件都準(zhǔn)備完畢,現(xiàn)在把他們串聯(lián)起來。

我先講講整個(gè)機(jī)制:

  1. 工作站提交代碼到github
  2. github通過配置的webhook通知到j(luò)enkins服務(wù)器
  3. jenkins發(fā)起構(gòu)建任務(wù):克隆最新的代碼,npm 安裝擴(kuò)展,Rsync同步代碼到宿主機(jī)。
  4. 第一次部署:宿主機(jī)通過代碼目錄(/var/www)的docker-compose up,啟動Docker 實(shí)例,Docker實(shí)例內(nèi)部使用PM2管理node進(jìn)程,并開啟代碼監(jiān)聽。
  5. 再次部署:不需要再docker-compose up,Rsync 同步最新的代碼到宿主機(jī)代碼目錄,Docker 實(shí)例中的PM2監(jiān)聽到代碼的變化,重啟了node進(jìn)程。代碼更新到最新。

至此,完整的流程走完。

配置jenkins

開始登入我們的Jenkins 虛擬機(jī):
安裝必要的工具:git,rsync
進(jìn)入Jenkins web:http://192.168.226.137:8080/
首先安裝NodeJS Plugin,不然NPM安裝會不可用。首先安裝上插件,重啟jenkins。找到j(luò)enkins的系統(tǒng)配置,Global Tools Configure,然后 找到NodeJS選項(xiàng),配置一個(gè)可以安裝的NodeJS版本。

創(chuàng)建 工作腳本

新建一個(gè)自由項(xiàng)目seneca-listener
git 配置:https://github.com/luaxlou/micro-service-practice.git
配置環(huán)境勾選上NodeJs

image.png

增加構(gòu)建步驟 Execute Shell:下面是代碼

cd seneca-listener
npm install
rsync -avz --password-file=/etc/rsyncd.secrets $WORKSPACE/seneca-listener src@192.168.226.138::srchome

/etc/rsyncd.secrets 是密碼文件

rsync 簡單說下 src@192.168.226.138::srchome是什么意思
src 是在Rsync服務(wù)端設(shè)置的賬戶
srchome 是在Rsync服務(wù)端設(shè)置的代碼目錄(/var/www)

詳細(xì)的服務(wù)端配置:

# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

# configuration example:

uid = www
gid = www
use chroot = no
read only = no
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

[srchome]
path = /var/www/
comment = hello then
auth users = src
secrets file = /etc/rsyncd.secrets
list=yes

配置完畢,點(diǎn)擊開始構(gòu)建。

創(chuàng)建另一個(gè)工作腳本

這次要創(chuàng)建的是應(yīng)用服務(wù):seneca-client

新建seneca-client 選擇從seneca-listener克隆。

更改下構(gòu)建步驟就可以:

cd seneca-client
npm install
rsync -avz --password-file=/etc/rsyncd.secrets $WORKSPACE/seneca-client src@192.168.226.139::srchome

點(diǎn)擊開始構(gòu)建

8 測試執(zhí)行

進(jìn)入 192.168.226.138,微服務(wù)宿主機(jī):

cd /var/www/seneca-listener
docker-compose up -d

[root@localhost seneca-client]# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
1c35623a763f        senecalistener_agent   "pm2-docker proces..."   4 hours ago         Up 4 hours                              senecalistener_agent_1

順利啟動

進(jìn)入 192.168.226.139,應(yīng)用服務(wù)宿主機(jī):

cd /var/www/seneca-listener
docker-compose up -d

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
2b23f3b32f71        senecaclient_client    "pm2-docker proces..."   4 hours ago         Up 6 seconds                            senecaclient_client_1

同樣順利啟動

我們可以看下是否順利工作:

[root@localhost seneca-client]# docker attach senecaclient_client_1
0|seneca-c | { id: 71,
0|seneca-c |   message: 'Hello World!',
0|seneca-c |   from: { pid: 22, file: 'index.js' },
0|seneca-c |   now: 1507823144963 }
1|seneca-c | { id: 48,
1|seneca-c |   message: 'Hello World!',
1|seneca-c |   from: { pid: 28, file: 'index.js' },
1|seneca-c |   now: 1507823145039 }

可以看到應(yīng)用服務(wù)已經(jīng)順利啟動,并且得到了微服務(wù)的反饋。

先別退出這個(gè)終端,我們下面來個(gè)測試

9 看看CI是否工作

我們開始更改seneca-client下隨便一處的代碼,然后提交,為方便測試(可以fork我的項(xiàng)目)。

然后提交。

jenkins 開始構(gòu)建(webhook的配置略,網(wǎng)上搜下很多)。
構(gòu)建完畢后,我們看到senecaclient_client_1實(shí)例有些變化:

image.png

可以看到PM2監(jiān)聽到變化,自動重啟了node進(jìn)程,而沒有重啟docker實(shí)例。

總結(jié)

至此,對于Docker微服務(wù)的探索階段已經(jīng)結(jié)束。后面就是一些細(xì)化的工作,比如安全性加固,監(jiān)控,服務(wù)健康數(shù)據(jù)收集等。

這篇算是Docker微服務(wù)收關(guān)之作吧,如果需要交流,可以加我,知無不言。已經(jīng)有很多年沒有正兒八經(jīng)寫過文章了,文筆已經(jīng)大不如前,勁量寫得不那么晦澀。

非常感謝簡書這么照顧,上一篇文章直接給推薦到首頁了,好久沒感受到這樣的榮譽(yù)了。

因?yàn)槭I(yè)的緣故,時(shí)間有一大把,可以把一些未完的研究做完。接下去還是會繼續(xù)寫下去,有些東西之前一直停留在腦子里,還需要沉淀下。

福兮禍之所伏,禍兮福之所倚。

收工,睡覺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容