作為測試經(jīng)常會聽到后端開發(fā)說起dubbo服務(wù)弃秆,dubbo服務(wù)到底使用干啥棱诱,查閱了網(wǎng)上資料再次簡單介紹下(不涉及代碼)
按用戶人數(shù),通過用一個圖來具體說明架構(gòu)和開發(fā)框架的演進過程
- 單一應(yīng)用架構(gòu)
當(dāng)網(wǎng)站流量較小豌鹤,只需一個應(yīng)用徽职,將所有功能都部署在一起,以減少部署節(jié)點和成本偷卧。此時豺瘤,用戶簡化增刪改查的數(shù)據(jù)訪問框架(ORM,object-relational mapping 對象關(guān)系映射)是關(guān)鍵听诸。
如Django的model舉例:
from django.db import models
class User1(models.Model):
name = models.CharField(max_length=225)
對應(yīng)的數(shù)據(jù)庫中可能就是一個表:user坐求,里面有一個字段。
如有個User的實例晌梨,如:
user = User1()
user.name = 'jc'
user.save() //保存數(shù)據(jù)庫
那么對應(yīng)著數(shù)據(jù)可中就有一條記錄桥嗤,name為jc。此時的user實例仔蝌,對應(yīng)的正是這個表的一條記錄
使用ORM的好處就是不用操作表砸逊,可以在程序中用面向?qū)ο蟮乃悸罚苯硬僮鲗ο蠹纯烧乒洹H缟鲜龃a,插入一條記錄司倚,直接 user.save()
豆混。對應(yīng)ORM會幫助我們生成一條SQL語句篓像。
Insert into user1(name) values('jc')
垂直應(yīng)用架構(gòu)
當(dāng)訪問量逐漸增大,單一應(yīng)用增加機器帶來的加速度越來越小皿伺,將應(yīng)用拆成互不相干的幾個應(yīng)用员辩,以提升效率。此時鸵鸥,用于加速前端頁面開發(fā)的Web框架(MVC,模型奠滑,視圖,控制器)是關(guān)鍵妒穴。分布式服務(wù)架構(gòu)
當(dāng)垂直應(yīng)用越來越多宋税,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來讼油,作為獨立的服務(wù)杰赛,逐漸形成穩(wěn)定的服務(wù)中心,使前端應(yīng)用能更快速的響應(yīng)多變的市場需求矮台。此時乏屯,用于提高業(yè)務(wù)復(fù)用及整合的分布式服務(wù)框架(RPC,Remote Procedure Call)是關(guān)鍵瘦赫。
RPC-遠程過程調(diào)用
辰晕,它是一種通過網(wǎng)絡(luò)從遠程計算機上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議确虱。RPC采用客戶機和服務(wù)器模式含友。請求程序是一個客戶機,而服務(wù)提供程序就是一個服務(wù)器蝉娜。
1.客戶機調(diào)用進程發(fā)送一個進程參數(shù)的調(diào)用信息到服務(wù)進程然后等待應(yīng)答消息
2.服務(wù)端唱较,經(jīng)常保持睡眠直到調(diào)用信息到達為止
3.當(dāng)一個調(diào)用信息到達,服務(wù)器獲得進程參數(shù)召川,計算結(jié)果南缓,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息
4.客戶端調(diào)用進程接受答復(fù)信息荧呐,獲取進程結(jié)果汉形,然后調(diào)用執(zhí)行進行流動計算架構(gòu)
當(dāng)服務(wù)越來越多,容量的評估倍阐,小服務(wù)資源的浪費等問題逐漸顯現(xiàn)岭埠,此時需增加一個調(diào)度中心基于訪問壓力實時管理集群容量,提高集群利用率东羹。此時个榕,用于提高機器利用率的資源調(diào)度和治理中心(SOA,Service Orirnted Architecture面向服務(wù)框架)是關(guān)鍵概耻。
Dubbo服務(wù)原理
下圖是從Dubbo官網(wǎng)直接拿來的使套,看一下基于RPC層罐呼,服務(wù)提供方和服務(wù)消費方之間的調(diào)用關(guān)系,如圖所示
Provider:暴露服務(wù)的服務(wù)提供方
Consumer:調(diào)用遠程服務(wù)的服務(wù)消費方
Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心
Monitor:統(tǒng)計服務(wù)的調(diào)用次數(shù)和嗲用時間的監(jiān)控中心
Container:服務(wù)運行容器
調(diào)用關(guān)系說明:
- 0:服務(wù)容器負責(zé)啟動侦高,加載嫉柴,運行服務(wù)提供者
- 1:服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)
- 2:服務(wù)消費者在啟動時奉呛,向注冊中心注冊自己所需的服務(wù)
- 3:注冊中心返回服務(wù)提供者地址列表給消費者计螺,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者
- 4:服務(wù)消費者瞧壮,從提供者地址列表中登馒,基于軟負載均衡算法,選擇一臺提供者進行調(diào)用馁痴,如果調(diào)用失敗谊娇,再選另一臺調(diào)用
- 5:服務(wù)消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間罗晕,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心济欢。
Dubbo架構(gòu)采用的是一種非常簡單的模型,要么是提供方提供服務(wù)小渊,要么是消費方消費服務(wù)法褥,所以基于這一點可以抽象出服務(wù)提供方(Provider)和服務(wù)消費方(Consumer)兩個角色。另外Dubbo架構(gòu)還具有以下幾個特點酬屉,連通性半等、健壯性、伸縮性呐萨、升級性杀饵,有關(guān)注冊中心、協(xié)議支持谬擦、服務(wù)監(jiān)控等內(nèi)容切距,也在特點里有詳細的描述。
連通性(服務(wù)消費者和服務(wù)提供者的關(guān)聯(lián))
1.注冊中心負責(zé)服務(wù)地址的注冊與查找惨远,相當(dāng)于目錄服務(wù)谜悟,服務(wù)提供者和消費者只在啟動時與注冊中心交互,注冊中心不轉(zhuǎn)發(fā)請求北秽,壓力較小葡幸。
2.監(jiān)控中心負責(zé)統(tǒng)計各服務(wù)調(diào)用次數(shù),調(diào)用時間等贺氓,統(tǒng)計先在內(nèi)存匯總后每分鐘一次發(fā)送到監(jiān)控中心服務(wù)器蔚叨,并以報表展示。
3.服務(wù)提供者向注冊中心注冊其提供的服務(wù),并匯報調(diào)用時間到監(jiān)控中心蔑水,此時間不包含網(wǎng)絡(luò)開銷悄泥。
4.服務(wù)消費者向注冊中心獲取服務(wù)提供者地址列表,并根據(jù)負載算法直接調(diào)用提供者肤粱,同時匯報調(diào)用時間到監(jiān)控中心,此時間包含網(wǎng)絡(luò)開銷厨相。
5.注冊中心领曼,服務(wù)提供者,服務(wù)消費者三者之間均為長連接蛮穿,監(jiān)控中心除外庶骄。
6.注冊中心通過長連接感知服務(wù)提供者的存在,服務(wù)提供者宕機践磅,注冊中心將立即推送事件通知消費者单刁。
7.注冊中心和監(jiān)控中心全部宕機,不影響已運行的提供者和消費者府适,消費者在本地緩存了提供者列表羔飞。
8.注冊中心和監(jiān)控中心都是可選的,服務(wù)消費者可以直連服務(wù)提供者檐春。
健壯性(任意節(jié)點宕掉后逻淌,服務(wù)仍然可用)
1.監(jiān)控中心宕掉不影響使用,只是丟失部分采樣數(shù)據(jù)疟暖。
2.數(shù)據(jù)庫宕掉后卡儒,注冊中心仍能通過緩存提供服務(wù)列表查詢,但不能注冊新服務(wù)俐巴。
3.注冊中心對等集群骨望,任意一臺宕掉后,將自動切換到另一臺欣舵。
4.注冊中心全部宕掉后擎鸠,服務(wù)提供者和服務(wù)消費者仍能通過本地緩存通訊。
5.服務(wù)提供者無狀態(tài)邻遏,任意一臺宕掉后糠亩,不影響使用。
6.服務(wù)提供者全部宕掉后准验,服務(wù)消費者應(yīng)用將無法使用赎线,并無限次重連等待服務(wù)提供者恢復(fù)。
伸縮性(節(jié)點可以自動增加)
1.注冊中心為對等集群糊饱,可動態(tài)增加機器部署實例垂寥,所有客戶端將自動發(fā)現(xiàn)新的注冊中心。
2.服務(wù)提供者無狀態(tài),可動態(tài)增加機器部署實例滞项,注冊中心將推送新的服務(wù)提供者信息給消費者狭归。
升級性(可平滑升級)
當(dāng)服務(wù)集群規(guī)模進一步擴大,帶動IT治理結(jié)構(gòu)進一步升級文判,需要實現(xiàn)動態(tài)部署过椎,進行流動計算,不會給現(xiàn)有分布式服務(wù)架構(gòu)帶來阻力戏仓。