分佈式架構服務調用
服務調用
和傳統單體架構相比,分佈式多了一個遠程服務之間的通信,不管soa還是微服務,本質都是對業務服務的提煉和複用。
遠程服務之間的調用,纔是實現分佈式的關鍵因素。
實現方式
HTTP通信協議的框架
-
HttpURLConnection
https://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html
java原生的HttpURLConnection是基於http協議的,支持get,post,put,delete等各種請求方式,最常用的是get和post
-
Apache Common HttpClient
HttpClient是Apache Common的子項目,可以提供高效的、最新的、功能豐富的支持http協議的客戶端編程工具包,並且支持http協議的最新版本。
- 實現了所有的http方法,get,post,put,delete等
- 支持https協議
- 支持代理服務器
備註:熔斷機制探索。
-
OKhttp3
https://github.com/square/okhttp
OKhttp是主流的網絡請求開源框架,用於替代HttpURLConnection和Apache HttpClient。
- 支持http2.0,對一臺機器的請求共享一個socket
- 採用連接池技術,可以有效的減少請求數量
- 無縫集成gzip壓縮
- 支持Respose Cache,避免重複請求
- 域名多ip支持
-
RestTemplate
Spring RestTemplate是Spring提供的訪問Rest服務的客戶端。
RestTemplate提供了多種便捷訪問http服務的方法,能夠大大提高客戶端的效率,很多第三方都是用RestTemplate提供服務,例如Android。
- 面向URL組件,必須依賴主機+端口+URI
- RestTemplate不依賴於服務接口,僅關注Rest響應內容
- Spring Cloud Feign
RPC框架
-
Java RMI
Java RMI(Remote Method Invocation)是一種基於Java的遠程方法調用技術,是java 持有的一種RPC實現。
-
Hessian
Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI功能,相比WebService,Hessian更加簡單、快捷。採用的是二進制RPC協議,因爲採用的二進制協議,因此它更適合於發送二進制數據。
-
Dubbo
Dubbo是阿里開源的高性能的RPC框架,使應用可以通過高性能的RPC實現服務的輸入和輸出功能,可以和Spring框架無縫集成。
Dubbo是一款高性能、輕量級的RPC框架,主要提供三大核心能力:面向接口的遠程方法調用、智能容錯和負載均衡,以及服務的自動註冊與發現。
-
gRPC
gRPC是Google公司開源的一款高性能的遠程過程調用(RPC)框架,可以再任何環境運行。
該框架提供了負載均衡、跟蹤、智能監控、身份驗證等功能,可以實現系統之間的高效連接。
跨域調用
跨域
在分佈式系統中,調用其他系統,可能出現跨域問題。
跨域的實質是瀏覽器的一種保護處理。
如果產生了跨域,服務器在返回結果時候會被瀏覽器攔截(請求是正常發起的,只是瀏覽器進行了攔截),導致響應內容不可用。
可能產生跨域的情況有以下幾種:
當前頁面URL | 被請求頁面的URL | 是否跨域 | 原因 |
---|---|---|---|
http://www.test.com | http://www.test.com/index.html | 否 | 同源(協議,域名,端口相同) |
http://www.test.com | Https://www.test.com/index.html | 跨域 | 協議不同(http/https) |
http://www.test.com | http://www.baidu.com | 跨域 | 主域名不同(test/baidu) |
http://www.test.com | http://sub.test.com | 跨域 | 子域名不同(www/sub) |
http://www.test.com:8080 | http://www.test.com:8090 | 跨域 | 端口號不同(8080/8090) |
跨域解決方案
-
使用jsonp解決跨域問題
缺點:不支持post請求,代碼書寫複雜
-
使用HttpClient內部轉發
-
設置響應頭允許跨域
respose.setHeader("Access-Control-Allow-Origin", "*");
-
基於Nginx搭建企業級API網關
-
使用zuul搭建微服務API網關
zuul是Spring Cloud的微服務網關。
網關:一個網絡 整體系統中,前置門戶入口。
請求首先經過網關,進行路徑的路由,定位到具體的服務節點上。
可以使用zuul過濾器的請求轉發來解決跨域問題。