1. 單體、集群谨湘、微服務(wù)
1.1 web開發(fā)中的三層架構(gòu):
- 持久層:用于和數(shù)據(jù)庫(kù)交互
- 業(yè)務(wù)邏輯層:從持久層獲取數(shù)據(jù)谚鄙,為API層服務(wù)各拷;
- API層咧织,接收用戶請(qǐng)求省艳,調(diào)用業(yè)務(wù)層進(jìn)行數(shù)據(jù)的操作逛犹,并且返回響應(yīng)八回。
單機(jī)架構(gòu):將系統(tǒng)的三層部署到同一臺(tái)服務(wù)器放航,稱為單機(jī)架構(gòu)艰管。隨著流量的增加途乃,只能通過CPU及內(nèi)存增加來進(jìn)行擴(kuò)容乖仇。
1.2 單體架構(gòu)缺點(diǎn)
- 模塊耦合度過高娘赴,一個(gè)故障全故障规哲,一個(gè)升級(jí)需要全升級(jí);
- 開發(fā)困難诽表,各個(gè)團(tuán)隊(duì)開發(fā)到最后都需要整合在一起唉锌,需要具備相同的技術(shù)棧;
- 可拓展性差竿奏,需要調(diào)用其中一個(gè)模塊是較為復(fù)雜袄简。
由于單機(jī)處理能力有限,當(dāng)業(yè)務(wù)增長(zhǎng)到一定程度時(shí)泛啸,單機(jī)的硬件資源無法支撐業(yè)務(wù)量绿语,此時(shí)出現(xiàn)集群模式。
1.3 集群
單機(jī)處理達(dá)到瓶頸平痰,將單機(jī)復(fù)制汞舱,構(gòu)成一個(gè)集群。集群中每臺(tái)服務(wù)器稱為一個(gè)節(jié)點(diǎn)宗雇,每個(gè)節(jié)點(diǎn)提供相同的服務(wù)昂芜;
-
集群需要一個(gè)負(fù)載均衡器;
負(fù)載均衡器 -
集群的優(yōu)缺點(diǎn):
- 缺點(diǎn):便于拓展赔蒲;
- 優(yōu)點(diǎn):對(duì)于上萬的高并發(fā)泌神,即使增加節(jié)點(diǎn)數(shù),性能也沒有明顯的提升舞虱。
1.4 分布式
分布式架構(gòu)欢际,將業(yè)務(wù)按照功能拆分成一個(gè)個(gè)獨(dú)立的子系統(tǒng),將各個(gè)子系統(tǒng)(服務(wù))部署在不同的服務(wù)器矾兜,且各個(gè)分開部署的部分彼此通過各種通訊協(xié)議進(jìn)行交互损趋。訪問業(yè)務(wù)需要使用通過API Geteway進(jìn)行訪問。
- 分布式優(yōu)點(diǎn):
- 系統(tǒng)間耦合度大大降低椅寺,可以獨(dú)立開發(fā)浑槽、獨(dú)立部署蒋失、獨(dú)立測(cè)試、系統(tǒng)間邊界明確桐玻,排錯(cuò)簡(jiǎn)單篙挽,開發(fā)效率提升;
- 易于拓展镊靴;
- 復(fù)用性高:比如铣卡,當(dāng)我們將用戶系統(tǒng)作為單獨(dú)的服務(wù)后,該公司所有的產(chǎn)品都可以使用該系統(tǒng)作為用戶系統(tǒng)偏竟,無需重復(fù)開發(fā)煮落。
1.5 微服務(wù)
微服務(wù)將模塊拆分稱為一個(gè)獨(dú)立的服務(wù)單元通過接口來實(shí)現(xiàn)數(shù)據(jù)的交互。微服務(wù)的設(shè)計(jì)是為了不因?yàn)槟硞€(gè)模塊的升級(jí)和BUG影響現(xiàn)有的系統(tǒng)業(yè)務(wù)苫耸。
- 微服務(wù)特點(diǎn):
- 模塊拆分為獨(dú)立的工程州邢,使用接口通信儡陨,降低服務(wù)之間的耦合度褪子;
- 不同服務(wù)拆分為不同的子項(xiàng)目,不同團(tuán)隊(duì)負(fù)責(zé)不同的子項(xiàng)目骗村;
- 需要增加功能時(shí)只需增加一個(gè)子項(xiàng)目嫌褪,調(diào)用其他系統(tǒng)接口即可;
- 可以靈活的進(jìn)行分布式部署胚股。
1.6 集群笼痛、分布式、微服務(wù)的區(qū)別
- 集群:多臺(tái)服務(wù)器部署相同應(yīng)用構(gòu)成集群琅拌,利用硬件有事支撐訪問量過高的應(yīng)用缨伊;
作用:通過負(fù)載均衡設(shè)備共同對(duì)外提供服務(wù)。
- 分布式:不同模塊部署在不同服務(wù)器进宝,對(duì)系統(tǒng)的水平拓展刻坊,分散單個(gè)服務(wù)器壓力;
作用:分布式解決網(wǎng)站高并發(fā)帶來的問題党晋。
- 微服務(wù):對(duì)系統(tǒng)進(jìn)行更細(xì)粒度的拆分谭胚,側(cè)重模塊解耦和復(fù)用,不同的微服務(wù)不一定部署到不同服務(wù)器上未玻。微服務(wù)是使系統(tǒng)各個(gè)功能拆分更加精細(xì)和獨(dú)立的垂直拓展。
總結(jié):
- 微服務(wù)多數(shù)是分布式的扳剿,但分布式項(xiàng)目不一定是微服務(wù)架構(gòu);
- 集群和分布式是分散壓力庇绽,而微服務(wù)是分散能力癣猾;
- 分布式一定是多個(gè)服務(wù)器余爆,而微服務(wù)一個(gè)或者多個(gè)都可以。
2. 容器及虛擬化技術(shù)
2.1 容器技術(shù)起源
微服務(wù)架構(gòu)本質(zhì)是一個(gè)分布式系統(tǒng)蛾方。開發(fā)復(fù)雜像捶,部署復(fù)雜(需要部署的應(yīng)用數(shù)量從一個(gè)上升至幾個(gè)甚至幾十個(gè))。若在運(yùn)維方面沒有大的進(jìn)展桩砰,微服務(wù)架構(gòu)不能得到廣泛應(yīng)用拓春。容器化技術(shù)的出現(xiàn),為系統(tǒng)運(yùn)維帶來了新的可能性亚隅,微服務(wù)架構(gòu)應(yīng)用的部署離不開容器化技術(shù)硼莽。
2.2 應(yīng)用部署的發(fā)展
2.3虛擬化
-
寄居虛擬化
安裝在操作系統(tǒng)之上,虛擬機(jī)對(duì)各種物理設(shè)備(cpu 內(nèi)存 硬盤等)的調(diào)用煮纵,均通過VMM層和宿主機(jī)的操作系統(tǒng)一起協(xié)調(diào)完成懂鸵。(VMware及VirtualBox均采用該方式)
寄居虛擬化.png -
裸機(jī)虛擬化
直接將VMM安裝在硬件設(shè)備與物理硬件之間,MM在這種模式下亦可稱為Hypervisor行疏,虛擬機(jī)要執(zhí)行指令時(shí)匆光,Hypervisor接管,模擬相應(yīng)的操作酿联。
裸機(jī)虛擬化.png
2.4 容器技術(shù)
容器是對(duì)進(jìn)程進(jìn)行隔離终息,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其他隔離進(jìn)程贞让,因此稱其為容器周崭。簡(jiǎn)單的說,一個(gè)容器包含了完整的運(yùn)行環(huán)境:除運(yùn)行程序本身外喳张,這個(gè)應(yīng)用所需的全部依賴续镇、類庫(kù)、二進(jìn)制文件蹲姐、配置文件等磨取,都被統(tǒng)一打入了一個(gè)稱為容器鏡像的包中。
2.4 容器及虛擬機(jī)對(duì)比
建議采用容器:容器技術(shù)比虛擬機(jī)技術(shù)更為輕便柴墩、快捷忙厌。
2.5 容器部署方式
容器提供了一種更為簡(jiǎn)潔的方式,容器鏡像包含代碼以及代碼運(yùn)行所依賴的全部江咳。
- 開發(fā)交付的是可直接運(yùn)行的鏡像逢净,而不是代碼安裝包;
- 應(yīng)用交付團(tuán)隊(duì)只需從鏡像創(chuàng)建容器的并運(yùn)行;
-
運(yùn)維只需管理運(yùn)行容器的基礎(chǔ)設(shè)施和容器的運(yùn)行爹土。
容器化部署方式
2.5 容器的優(yōu)勢(shì)
- 環(huán)境一致甥雕,便于排錯(cuò)社露;
- 相比虛擬機(jī)更加輕量級(jí)峭弟;
- 秒級(jí)響應(yīng)瞒瘸,出現(xiàn)問題可以快速回滾情臭;
- 可保證程序AlwaysRunning,傳統(tǒng)虛擬機(jī)OS上需要執(zhí)行相應(yīng)腳本俯在。
3.Docker
- Docker是一個(gè)開源項(xiàng)目惯雳,誕生于2013年初石景,由dotCloud公司一個(gè)內(nèi)部項(xiàng)目潮孽】昵基于Go語(yǔ)言實(shí)現(xiàn)佛舱。項(xiàng)目代碼在此。
- Docker的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案订歪。其基礎(chǔ)為L(zhǎng)inux容器(LXC)等技術(shù)刷晋。
- 用戶操作Docker就像操作一個(gè)快速輕量級(jí)的虛擬機(jī)一樣簡(jiǎn)單眼虱。
3.1 倉(cāng)庫(kù)、鏡像撞蚕、容器
- 倉(cāng)庫(kù)(registry):存放鏡像的地方诈豌,Docker公司運(yùn)營(yíng)公共的Registry叫做Docker Hub
- 鏡像:構(gòu)建Docker的基石矫渔,用戶基于鏡像來運(yùn)行自己的容器庙洼。通過鏡像創(chuàng)建Docker容器油够。
- 容器:Docker利用容器來運(yùn)行應(yīng)用石咬。容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例卖哎,可以被啟動(dòng)亏娜、開始维贺、停止、刪除虐秋。鏡像是Docker生命周期中的構(gòu)建或者打包階段客给,而容器則是啟動(dòng)或者執(zhí)行階段起愈。容器基于鏡像啟動(dòng),一旦容器啟動(dòng)完成后官觅,我們就可以登錄到容器中安裝自己需要的軟件或者服務(wù)休涤。
3.2 Docker安裝
yum install docker
# 安裝
systemcrl start/restart/stop docker
# 啟動(dòng)功氨、重啟捷凄、關(guān)閉Docker
systemctl status docker
# 查看Docker狀態(tài)
docker info
# 查看Docker概要信息
docker version
# 查看Docker版本信息
``
3.3 鏡像操作
docker images
# 查看本地鏡像
docker search mysql
# 搜索鏡像
docker pull centos:7
# 拉取鏡像
docker push image_name
# 上傳鏡像
docker rmi image_name/id
# 刪除鏡像
docker inspect image_name/container_name
# 查看鏡像跺涤、容器詳細(xì)信息
3.4 容器操作
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
-i 表示交互式监透;
-t 表示容器登錄后進(jìn)入其命令行參數(shù)胀蛮,加入這兩個(gè)參數(shù)后,容器創(chuàng)建后就能登錄進(jìn)去退腥;
-v 表示目錄映射(前者是宿主機(jī)目錄絕對(duì)路徑,后者是容器內(nèi)目錄路徑)不跟,tips:可以多做幾個(gè)目錄或文件映射窝革。一般在宿主機(jī)上修改虐译,然后共享到容器上漆诽;
-p 表示端口映射(前者是宿主機(jī)端口厢拭、后者是容器內(nèi)映射端口)可以多做幾個(gè)端口映射
-d 在run后面加上-d參數(shù),則會(huì)創(chuàng)建一個(gè)守護(hù)式容器在后臺(tái)運(yùn)行(這樣創(chuàng)建容器后不會(huì)自動(dòng)登錄容器供鸠,如果只加-i -t兩個(gè)參數(shù)楞捂,創(chuàng)建后就會(huì)自動(dòng)進(jìn)去容器)胶坠。
ARG:
--name 為創(chuàng)建的容器命名
--rm 容器終止后會(huì)立刻刪除涵但,和-d參數(shù)不能同時(shí)使用
3.4.1 常見命令
docker run -d image_name|鏡像id:tag
# 后臺(tái)啟動(dòng)容器矮瘟、創(chuàng)建守護(hù)式進(jìn)程
docker exec -it container_id|container_name /bin/bash
# 進(jìn)入容器塑娇、登錄守護(hù)式容器
docker run -it --name=container_name image_id|image_name:tag
# 啟動(dòng)容器并進(jìn)入哨啃,創(chuàng)建交互式容器
exit
# 退出當(dāng)前容器
docker ps
# 查看運(yùn)行容器
docker ps -a
# 查看所有容器
查看容器
docker start container_id|container_name
# 啟動(dòng)停止的容器
docker stop container_id|container_name
# 停止容器
docker rm container_id|container_name
# 刪除停止的容器
4.MySQL容器部署
4.1 宿主機(jī)和容器之間復(fù)制文件
docker cp host_machine_file_pathcontainer_name:path
# 宿主機(jī)復(fù)制文件到容器
docker cp container_name:file_path host_machine_file_path
# 復(fù)制容器中文件到宿主機(jī)
4.2 MySQL部署
docker pull mysql:5.7
# 拉取MySQL5.7docker run -d --name -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 創(chuàng)建容器docker exec -it mysql /bin/bash
# 登錄mysql容器mysql -uroot -p123456 database_name
# 進(jìn)入database_name數(shù)據(jù)庫(kù)
5.centos部署
docker pull centos
# 拉取centos:latestdocker run -d --name centos centos ping www.baidu.com
# 創(chuàng)建容器docker exec -it centos /bin/bash
# 登錄centos容器
注意:第二條命令末尾加一個(gè)死循環(huán),本例使用了ping