【Java高級工程師蛻變之路】065 分佈式架構服務調用

分佈式架構服務調用

服務調用

和傳統單體架構相比,分佈式多了一個遠程服務之間的通信,不管soa還是微服務,本質都是對業務服務的提煉和複用。

遠程服務之間的調用,纔是實現分佈式的關鍵因素。

image-20220411220220544

實現方式

HTTP通信協議的框架

  1. HttpURLConnection

    https://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html

    java原生的HttpURLConnection是基於http協議的,支持get,post,put,delete等各種請求方式,最常用的是get和post

  2. Apache Common HttpClient

    https://hc.apache.org/

    HttpClient是Apache Common的子項目,可以提供高效的、最新的、功能豐富的支持http協議的客戶端編程工具包,並且支持http協議的最新版本。

    • 實現了所有的http方法,get,post,put,delete等
    • 支持https協議
    • 支持代理服務器

    備註:熔斷機制探索。

  3. OKhttp3

    https://github.com/square/okhttp

    OKhttp是主流的網絡請求開源框架,用於替代HttpURLConnection和Apache HttpClient。

    • 支持http2.0,對一臺機器的請求共享一個socket
    • 採用連接池技術,可以有效的減少請求數量
    • 無縫集成gzip壓縮
    • 支持Respose Cache,避免重複請求
    • 域名多ip支持
  4. RestTemplate

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

    Spring RestTemplate是Spring提供的訪問Rest服務的客戶端。

    RestTemplate提供了多種便捷訪問http服務的方法,能夠大大提高客戶端的效率,很多第三方都是用RestTemplate提供服務,例如Android。

    • 面向URL組件,必須依賴主機+端口+URI
    • RestTemplate不依賴於服務接口,僅關注Rest響應內容
    • Spring Cloud Feign

RPC框架

  1. Java RMI

    Java RMI(Remote Method Invocation)是一種基於Java的遠程方法調用技術,是java 持有的一種RPC實現。

    image-20220411224754951

  2. Hessian

    Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI功能,相比WebService,Hessian更加簡單、快捷。採用的是二進制RPC協議,因爲採用的二進制協議,因此它更適合於發送二進制數據。

    image-20220411225103011

  3. Dubbo

    Dubbo是阿里開源的高性能的RPC框架,使應用可以通過高性能的RPC實現服務的輸入和輸出功能,可以和Spring框架無縫集成。

    Dubbo是一款高性能、輕量級的RPC框架,主要提供三大核心能力:面向接口的遠程方法調用、智能容錯和負載均衡,以及服務的自動註冊與發現。

    image-20220411225808449

  4. gRPC

    gRPC是Google公司開源的一款高性能的遠程過程調用(RPC)框架,可以再任何環境運行。

    該框架提供了負載均衡、跟蹤、智能監控、身份驗證等功能,可以實現系統之間的高效連接。

    image-20220411230203277

跨域調用

跨域

在分佈式系統中,調用其他系統,可能出現跨域問題。

跨域的實質是瀏覽器的一種保護處理。

如果產生了跨域,服務器在返回結果時候會被瀏覽器攔截(請求是正常發起的,只是瀏覽器進行了攔截),導致響應內容不可用。

可能產生跨域的情況有以下幾種:

當前頁面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)

跨域解決方案

  1. 使用jsonp解決跨域問題

    缺點:不支持post請求,代碼書寫複雜

  2. 使用HttpClient內部轉發

  3. 設置響應頭允許跨域

    respose.setHeader("Access-Control-Allow-Origin", "*");

  4. 基於Nginx搭建企業級API網關

  5. 使用zuul搭建微服務API網關

    zuul是Spring Cloud的微服務網關。

    網關:一個網絡 整體系統中,前置門戶入口。

    請求首先經過網關,進行路徑的路由,定位到具體的服務節點上。

    可以使用zuul過濾器的請求轉發來解決跨域問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章