分布式系統(tǒng):分布式架構(gòu)服務(wù)調(diào)用
一、服務(wù)調(diào)用
和傳統(tǒng)的單體架構(gòu)相比,分布式多了一個(gè)遠(yuǎn)程服務(wù)之間的通信,不管是 soa 還是微服務(wù),他們本 質(zhì)上都是對于業(yè)務(wù)服務(wù)的提煉和復(fù)用。那么遠(yuǎn)程服務(wù)之間的調(diào)用才是實(shí)現(xiàn)分布式的關(guān)鍵因素。
二、實(shí)現(xiàn)方式
1、HTTP 應(yīng)用協(xié)議的通信框架
1. HttpURLConnection java 原生 HttpURLConnection是基于http協(xié)議的,支持get,post,put,delete等各種請求方 式,最常用的就是get和post
2. Apache Common HttpClient HttpClient 是Apache Common 下的子項(xiàng)目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本。
- 實(shí)現(xiàn)了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
- 支持 HTTPS 協(xié)議
- 支持代理服務(wù)器等
3. OKhttp3 OKHttp是一個(gè)當(dāng)前主流的網(wǎng)絡(luò)請求的開源框架, 用于替代HttpUrlConnection和Apache HttpClient
- 支持http2.0,對一臺(tái)機(jī)器的請求共享一個(gè)socket。
- 采用連接池技術(shù),可以有效的減少Http連接數(shù)量。
- 無縫集成GZIP壓縮技術(shù)。
- 支持Response Cache,避免重復(fù)請求 域名多IP支持
4. RestTemplate Spring RestTemplate 是 Spring 提供的用于訪問 Rest 服務(wù)的客戶端,RestTemplate 提供了多 種便捷訪問遠(yuǎn)程Http服務(wù)的方法,能夠大大提高客戶端的編寫效率,所以很多客戶端比如 Android 或者第三方服務(wù)商都是使用 RestTemplate 請求 restful 服務(wù)。
- 面向 URL 組件,必須依賴于主機(jī) + 端口 + URI
- RestTemplate 不依賴于服務(wù)接口,僅關(guān)注 REST 響應(yīng)內(nèi)容
- Spring Cloud Feign
2、RPC 框架
RPC全稱為remote procedure call,即遠(yuǎn)程過程調(diào)用。借助RPC可以做到像本地調(diào)用一樣調(diào)用遠(yuǎn) 程服務(wù),是一種進(jìn)程間的通信方式. 。常見的RPC框架有以下幾種。
1. Java RMI Java RMI(Romote Method Invocation)是一種基于Java的遠(yuǎn)程方法調(diào)用技術(shù),是Java特有的一 種RPC實(shí)現(xiàn)。
2. Hessian
Hessian是一個(gè)輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能. 相比 WebService,Hessian更簡單、快捷。采用的是二進(jìn)制RPC協(xié)議,因?yàn)椴捎玫氖嵌M(jìn)制協(xié)議,所以 它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。
3. Dubbo
Dubbo是阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實(shí)現(xiàn)服 務(wù)的輸出和輸入功能,可以和Spring框架無縫集成。Dubbo是一款高性能、輕量級的開源Java RPC 框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動(dòng)注 冊和發(fā)現(xiàn)。
4. gRPC
gRPC是由Google公司開源的一款高性能的遠(yuǎn)程過程調(diào)用(RPC)框架,可以在任何環(huán)境下運(yùn)行。該 框架提供了負(fù)載均衡,跟蹤,智能監(jiān)控,身份驗(yàn)證等功能,可以實(shí)現(xiàn)系統(tǒng)間的高效連接。
3、跨域調(diào)用
1、跨域
在分布式系統(tǒng)中, 會(huì)有調(diào)用其他業(yè)務(wù)系統(tǒng),導(dǎo)致出現(xiàn)跨域問題,跨域?qū)嵸|(zhì)上是瀏覽器的一種保護(hù)處 理。如果產(chǎn)生了跨域,服務(wù)器在返回結(jié)果時(shí)就會(huì)被瀏覽器攔截(注意:此時(shí)請求是可以正常發(fā)起的,只是 瀏覽器對其進(jìn)行了攔截),導(dǎo)致響應(yīng)的內(nèi)容不可用. 產(chǎn)生跨域的幾種情況有一下:
2、常見解決方案
1. 使用jsonp解決網(wǎng)站跨域 缺點(diǎn):不支持post請求,代碼書寫比較復(fù)雜
2. 使用HttpClient內(nèi)部轉(zhuǎn)發(fā)
3. 使用設(shè)置響應(yīng)頭允許跨域 response.setHeader(“
Access-Control-Allow-Origin”, “*”); 設(shè)置響應(yīng)頭允許跨域.
4. 基于Nginx搭建企業(yè)級API接口網(wǎng)關(guān)
5. 使用Zuul搭建微服務(wù)API接口網(wǎng)關(guān)
Zuul是spring cloud中的微服務(wù)網(wǎng)關(guān)。網(wǎng)關(guān): 是一個(gè)網(wǎng)絡(luò)整體系統(tǒng)中的前置門戶入口。請求首先通 過網(wǎng)關(guān),進(jìn)行路徑的路由,定位到具體的服務(wù)節(jié)點(diǎn)上??梢允褂脄uul的過濾器的請求轉(zhuǎn)發(fā)去解決跨域問題