簡(jiǎn)介
之前介紹HTTP協(xié)議的時(shí)候廓鞠,說(shuō)HTTP協(xié)議是屬于【請(qǐng)求-應(yīng)答】的模型同仆,這個(gè)模型下只有兩個(gè)角色【請(qǐng)求方-客戶(hù)端】和【應(yīng)答方-服務(wù)器】
該模型下我們可以引入新的角色 - HTTP代理
引入代理之后整個(gè)鏈路上就不單單有客戶(hù)端和服務(wù)器宪赶,之前簡(jiǎn)單的雙方通信就變得復(fù)雜了一些睬塌;多了個(gè)中間人
代理服務(wù)
所謂的代理就是在客戶(hù)端和服務(wù)器之間的通信鏈路上插入的一個(gè)環(huán)節(jié)德撬,它本身也是一個(gè)服務(wù)器嗅虏,但是提供【代理服務(wù)】
啥是代理服務(wù)
就是說(shuō)服務(wù)本身不產(chǎn)生內(nèi)容,而是處于中間位置轉(zhuǎn)發(fā)上下游的請(qǐng)求和響應(yīng),具有雙重身份
對(duì)于服務(wù)器來(lái)說(shuō)婶芭,這個(gè)代理服務(wù)就是一個(gè)客戶(hù)端东臀,轉(zhuǎn)發(fā)客戶(hù)端的請(qǐng)求;
但是從客戶(hù)端的角度看犀农,代理服務(wù)也是一個(gè)服務(wù)器惰赋,轉(zhuǎn)發(fā)服務(wù)器的響應(yīng);
代理的作用
代理是處在HTTP通信過(guò)程的中間位置呵哨,對(duì)上屏蔽了真實(shí)的客戶(hù)端赁濒,對(duì)下屏蔽了真實(shí)的服務(wù)器;
處于這個(gè)中間位置孟害,可以為HTTP協(xié)議增加很多的靈活性拒炎;如下
負(fù)載均衡
由于有了代理服務(wù),從客戶(hù)端角度看屏蔽了源服務(wù)器纹坐,客戶(hù)端看到的就是代理服務(wù)器枝冀,源服務(wù)器有多少臺(tái),IP地址都是不知道的耘子;
那么代理服務(wù)器處于中間人的位置,就掌握了分發(fā)的【權(quán)利】球切,決定由那些服務(wù)器來(lái)響應(yīng)請(qǐng)求谷誓;
在代理中常用的負(fù)載均衡的算法有【輪詢(xún)】【一致性哈希】吨凑,目的都是把外部的流量合理的分散到多臺(tái)源服務(wù)器上捍歪。整體的提高資源的利用率和程序的性能;
健康檢查
使用【心跳】機(jī)制監(jiān)控后段服務(wù)器鸵钝,發(fā)現(xiàn)有故障時(shí)就及時(shí)從集群中踢出去糙臼,保證服務(wù)器的高可用
安全防護(hù)
保護(hù)被代理的后端服務(wù)器,限制流量恩商,地域一些不合理的網(wǎng)絡(luò)請(qǐng)求和網(wǎng)絡(luò)攻擊
加密卸載
對(duì)外網(wǎng)使用SSL/TLS加密的通信認(rèn)證变逃,在安全的內(nèi)網(wǎng)下不加密;消除了加解密的成本消耗
數(shù)據(jù)過(guò)濾
攔截上下行的數(shù)據(jù)怠堪,任意指定策略去修改請(qǐng)求和響應(yīng)
內(nèi)容緩存
暫存和服用服務(wù)器的響應(yīng)揽乱;
代理相關(guān)的字段
代理服務(wù)器使用【Via】標(biāo)明代理的身份(主機(jī)名)
【Via】本身是一個(gè)通用字段,在請(qǐng)求頭和響應(yīng)頭中都可以出現(xiàn)粟矿;
每當(dāng)經(jīng)過(guò)一個(gè)代理節(jié)點(diǎn)的時(shí)候凰棉,代理服務(wù)器就會(huì)把自身的信息追加到字段的末尾;
會(huì)有這么一個(gè)情況陌粹,當(dāng)整個(gè)鏈路上有很多中間代理時(shí)撒犀,Via的字段會(huì)形成一個(gè)鏈表
Via字段工作示意圖
Via字段的存在代表鏈路中時(shí)存在代理,并不能知道對(duì)方的信息;
比如服務(wù)器需要知道客戶(hù)端真正的IP地址或舞,方便做用戶(hù)畫(huà)像荆姆、統(tǒng)計(jì)分布啊嚷那;
在HTTP協(xié)議中并沒(méi)有給這個(gè)點(diǎn)定義頭字段胞枕;
但是出現(xiàn)了很多【事實(shí)上的標(biāo)準(zhǔn)】常用的頭字段【X-Forwarded-For】、【X-Real-IP】
X-Forwarded-For和X-Real-IP
X-Forwarded-For
它的工作形式上和Via很相似魏宽,每經(jīng)過(guò)一個(gè)代理節(jié)點(diǎn)就會(huì)在字段里追加一個(gè)信息腐泻;Via追加的時(shí)代理主機(jī)名
而X-Forwarded-For追加的是請(qǐng)求方的IP地址,所以說(shuō)當(dāng)源服務(wù)器拿到X-Forwared-For字段是队询,最左側(cè)就是客戶(hù)端的真實(shí)IP地址
X-Real-Ip
就是記錄客戶(hù)端真實(shí)的IP地址派桩。它不記錄任何中間代理的信息;
代理協(xié)議
【X-Forwarded-For】需要可以記錄代理服務(wù)器的信息和客戶(hù)端的IP地址蚌斩,但是有一個(gè)問(wèn)題就是
每當(dāng)報(bào)文到達(dá)一個(gè)代理節(jié)點(diǎn)時(shí)铆惑,就需要解析報(bào)文中的頭字段,這樣的話(huà)成本就比較高了送膳;
原本代理節(jié)點(diǎn)就是一個(gè)中間轉(zhuǎn)發(fā)的能力员魏,現(xiàn)在還去解析并且還要去修改;并且在有些情況不允許甚至不可以的(HTTPS)
綜上所說(shuō)叠聋,就出現(xiàn)了【代理協(xié)議】
代理協(xié)議
是由代理軟件公司HAProxy定義的撕阎,是一個(gè)【事實(shí)標(biāo)準(zhǔn)】,被大家伙廣泛采用
它是有兩個(gè)版本 V1碌补、V2虏束;
V1類(lèi)似于HTTP,是明文的厦章;V2是二進(jìn)制格式
說(shuō)下V1
它就是在HTTP報(bào)文前增加一行ASCII碼文本
這個(gè)文本開(kāi)頭必須是【PROXY】然后是【TCP4/TCP6】代表客戶(hù)端IP地址的類(lèi)型镇匀,接著是請(qǐng)求方地址、應(yīng)答方地址袜啃,請(qǐng)求方端口汗侵、應(yīng)答方端口,最后用一個(gè)回車(chē)換行代表結(jié)束囊骤;
害
每當(dāng)你覺(jué)得做這件很困難晃择,壓力大的時(shí)候,說(shuō)明就是歷練你的時(shí)候也物,這時(shí)候不要放棄宫屠,堅(jiān)持下去,硬著頭皮也要上滑蚯;
最近一個(gè)版本浪蹂,在前期評(píng)估需求開(kāi)發(fā)時(shí)間時(shí)抵栈,手中有三個(gè),這時(shí)第一次一下手中超過(guò)兩個(gè)需求的情況坤次,當(dāng)時(shí)還是有點(diǎn)壓力的古劲;因?yàn)檫@個(gè)過(guò)程要關(guān)乎需求能不能按時(shí)交付以及后續(xù)這個(gè)需求由其他同學(xué)開(kāi)發(fā)時(shí),你這邊評(píng)估時(shí)一些重要的點(diǎn)沒(méi)有有聊到缰猴。不管是溝通的經(jīng)驗(yàn)還是你的拆分能力都是稍微有點(diǎn)考驗(yàn)的产艾;