作者:手打丸子
鏈接:https://www.zhihu.com/question/28557115/answer/142289037
來(lái)源:知乎
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。
restful是種接口設(shè)計(jì)風(fēng)格,在分布式系統(tǒng)架構(gòu)下特別重要。
rest-representation state transfer
你的接口必須有以下特性(以HTTP協(xié)議為例,當(dāng)然符合rest的不止這一種):
1.可描述性(representation):你可以準(zhǔn)確的描述你的接口;包括接口地址(uri)、操作(PUT/GET/POST/DELETE)、資源項(xiàng)等(不止這些,但就是這個(gè)意思);
2.有狀態(tài)的(state):你的接口調(diào)用后會(huì)返回調(diào)用結(jié)果;400、500等返回狀態(tài),來(lái)統(tǒng)一標(biāo)識(shí)這個(gè)接口的運(yùn)行狀態(tài),并且狀態(tài)需要符合規(guī)范;
3.可轉(zhuǎn)移(transfer):你的調(diào)用可以轉(zhuǎn)移到另外的服務(wù)器上;這就要求你的服務(wù)端不保存客戶(hù)端狀態(tài);你在分布式狀態(tài)下調(diào)用哪一臺(tái)服務(wù)器都是一樣的效果,這就要求你的服務(wù)端必須不能維護(hù)客戶(hù)端請(qǐng)求的狀態(tài),比如你調(diào)用服務(wù)器A和服務(wù)器B都是一樣結(jié)果,或者調(diào)用服務(wù)器A兩次都會(huì)得到一樣的結(jié)果;
反證補(bǔ)充:
1.可描述性:試想,你都無(wú)法準(zhǔn)確描述你的接口,你上哪里調(diào)用它;
2.有狀態(tài)的:試想,你的接口沒(méi)個(gè)規(guī)范的狀態(tài)返回調(diào)用結(jié)果,在那么多接口的情況下,你咋知道調(diào)用結(jié)果如何;
3.可轉(zhuǎn)移:試想,你的服務(wù)器A保存了客戶(hù)端甲的狀態(tài),但是服務(wù)器B沒(méi)有;這時(shí),客戶(hù)端甲發(fā)請(qǐng)求給服務(wù)器A/B完全有可能得到不同的結(jié)果,而明明客戶(hù)端甲發(fā)的請(qǐng)求是一樣的,并且是同一接口;在分布式下,經(jīng)常會(huì)做負(fù)載均衡之類(lèi)的,用戶(hù)甲發(fā)的請(qǐng)求被誰(shuí)處理完全是隨機(jī)的。
注:以上描述不嚴(yán)謹(jǐn),僅為通俗易懂;可能理解有誤,有不當(dāng)之處請(qǐng)指出。