分布式系統:分布式架構服務調用
一、服務調用
和傳統的單體架構相比,分布式多了一個遠程服務之間的通信,不管是 soa 還是微服務,他們本 質上都是對于業務服務的提煉和復用。那么遠程服務之間的調用才是實現分布式的關鍵因素。

二、實現方式
1、HTTP 應用協議的通信框架
1. HttpURLConnection java 原生 HttpURLConnection是基于http協議的,支持get,post,put,delete等各種請求方 式,最常用的就是get和post
2. Apache Common HttpClient HttpClient 是Apache Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,并且它支持 HTTP 協議最新的版本。
- 實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
- 支持 HTTPS 協議
- 支持代理服務器等
3. OKhttp3 OKHttp是一個當前主流的網絡請求的開源框架, 用于替代HttpUrlConnection和Apache HttpClient
- 支持http2.0,對一臺機器的請求共享一個socket。
- 采用連接池技術,可以有效的減少Http連接數量。
- 無縫集成GZIP壓縮技術。
- 支持Response Cache,避免重復請求 域名多IP支持
4. RestTemplate Spring RestTemplate 是 Spring 提供的用于訪問 Rest 服務的客戶端,RestTemplate 提供了多 種便捷訪問遠程Http服務的方法,能夠大大提高客戶端的編寫效率,所以很多客戶端比如 Android 或者第三方服務商都是使用 RestTemplate 請求 restful 服務。
- 面向 URL 組件,必須依賴于主機 + 端口 + URI
- RestTemplate 不依賴于服務接口,僅關注 REST 響應內容
- Spring Cloud Feign
2、RPC 框架
RPC全稱為remote procedure call,即遠程過程調用。借助RPC可以做到像本地調用一樣調用遠 程服務,是一種進程間的通信方式. 。常見的RPC框架有以下幾種。
1. Java RMI Java RMI(Romote Method Invocation)是一種基于Java的遠程方法調用技術,是Java特有的一 種RPC實現。

2. Hessian
Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能. 相比 WebService,Hessian更簡單、快捷。采用的是二進制RPC協議,因為采用的是二進制協議,所以 它很適合于發送二進制數據。
3. Dubbo
Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服 務的輸出和輸入功能,可以和Spring框架無縫集成。Dubbo是一款高性能、輕量級的開源Java RPC 框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注 冊和發現。

4. gRPC
gRPC是由Google公司開源的一款高性能的遠程過程調用(RPC)框架,可以在任何環境下運行。該 框架提供了負載均衡,跟蹤,智能監控,身份驗證等功能,可以實現系統間的高效連接。

3、跨域調用
1、跨域
在分布式系統中, 會有調用其他業務系統,導致出現跨域問題,跨域實質上是瀏覽器的一種保護處 理。如果產生了跨域,服務器在返回結果時就會被瀏覽器攔截(注意:此時請求是可以正常發起的,只是 瀏覽器對其進行了攔截),導致響應的內容不可用. 產生跨域的幾種情況有一下:

2、常見解決方案
1. 使用jsonp解決網站跨域 缺點:不支持post請求,代碼書寫比較復雜
2. 使用HttpClient內部轉發
3. 使用設置響應頭允許跨域 response.setHeader(“
Access-Control-Allow-Origin”, “*”); 設置響應頭允許跨域.
4. 基于Nginx搭建企業級API接口網關
5. 使用Zuul搭建微服務API接口網關
Zuul是spring cloud中的微服務網關。網關: 是一個網絡整體系統中的前置門戶入口。請求首先通 過網關,進行路徑的路由,定位到具體的服務節點上。可以使用zuul的過濾器的請求轉發去解決跨域問題



























