Java微服務(三):負載均衡、序列化、熔斷

来源:https://www.cnblogs.com/dz-boss/archive/2019/10/21/11717063.html
-Advertisement-
Play Games

本文接著上一篇寫的《Java微服務(二):服務消費者與提供者搭建》,上一篇文章主要講述了消費者與服務者的搭建與簡單的實現。其中重點需要註意配置文件中的幾個坑。 本章節介紹一些零散的內容:服務的負載均衡,序列化和熔斷 1.服務負載均衡 負載均衡可分為軟體負載均衡和硬體負載均衡。在我們日常開發中,一般很 ...


  本文接著上一篇寫的《Java微服務(二):服務消費者與提供者搭建》,上一篇文章主要講述了消費者與服務者的搭建與簡單的實現。其中重點需要註意配置文件中的幾個坑。

本章節介紹一些零散的內容:服務的負載均衡,序列化和熔斷

1.服務負載均衡

負載均衡可分為軟體負載均衡和硬體負載均衡。在我們日常開發中,一般很難接觸到硬體負載均衡。但軟體負載均衡還是可以接觸到的,比如 Nginx。dubbo提供的也是軟負載。

 

 

 

 

 

詳細內容可以閱讀dubbo官網關於負載均衡的介紹,這裡總結下負載均衡的方式:

  • 權重隨機演算法的 RandomLoadBalance

  RandomLoadBalance 是加權隨機演算法的具體實現,它的演算法思想很簡單。假設我們有一組伺服器 servers = [A, B, C],他們對應的權重為 weights = [5, 3, 2],權重總和為10。那麼就有5/10的請求達到A伺服器上,3/10和2/10分別達到B和C上。只要隨機數生成器產生的隨機數分佈性很好,在經過多次選擇後,每個伺服器被選中的次數比例接近其權重比例。當調用次數比較少時,Random 產生的隨機數可能會比較集中,此時多數請求會落到同一臺伺服器上。

  • 最少活躍調用數演算法的 LeastActiveLoadBalance

  每個服務提供者對應一個活躍數 active。初始情況下,所有服務提供者活躍數均為0。每收到一個請求,活躍數加1,完成請求後則將活躍數減1,在服務運行一段時間後,性能好的服務提供者處理請求的速度更快,因此活躍數下降的也越快,此時這樣的服務提供者能夠優先獲取到新的服務請求、這就是最小活躍數負載均衡演算法的基本思想,目前此演算法還引入了權重值。

  • 基於 hash 一致性的 ConsistentHashLoadBalance

  首先根據 ip 或者其他的信息為緩存節點生成一個 hash,並將這個 hash 投射到 [0, 232 - 1] 的圓環上。當有查詢或寫入請求時,則為緩存項的 key 生成一個 hash 值。然後查找第一個大於或等於該 hash 值的緩存節點,併到這個節點中查詢或寫入緩存項。如果當前節點掛了,則在下一次查詢或寫入緩存時,為緩存項查找另一個大於其 hash 值的緩存節點即可。

  • 基於加權輪詢演算法的 RoundRobinLoadBalance

  所謂輪詢是指將請求輪流分配給每台伺服器。舉個例子,我們有三台伺服器 A、B、C。我們將第一個請求分配給伺服器 A,第二個請求分配給伺服器 B,第三個請求分配給伺服器 C,第四個請求再次分配給伺服器 A。這個過程就叫做輪詢。輪詢是一種無狀態負載均衡演算法,實現簡單,適用於每台伺服器性能相近的場景下。加權輪詢是將伺服器賦一個權值,然後按照該權值進行輪訓。

 

代碼構建,本例使用輪訓演算法做demo

直接在yml配置文件中添加loadbalance註解就可以

 

 開啟2個服務提供者,並且使用服務消費者消費,查看日誌

 

 2.序列化

  Dubbo 中支持的序列化方式:

  • dubbo 序列化:阿裡尚未開發成熟的高效 java 序列化實現,阿裡不建議在生產環境使用它
  • hessian2 序列化:hessian 是一種跨語言的高效二進位序列化方式。但這裡實際不是原生的 hessian2 序列化,而是阿裡修改過的 hessian lite,它是 dubbo RPC 預設啟用的序列化方式
  • json 序列化:目前有兩種實現,一種是採用的阿裡的 fastjson 庫,另一種是採用 dubbo 中自己實現的簡單 json 庫,但其實現都不是特別成熟,而且 json 這種文本序列化性能一般不如上面兩種二進位序列化。
  • java 序列化:主要是採用 JDK 自帶的 Java 序列化實現,性能很不理想。

  dubbo自帶的序列化方式不成熟,而json和java序列化性能不理想。dubbo可以使用hessian2序列化,但是hessian2是跨語言的,沒有單獨對java語言做優化,所以很多單獨給java提供優化的工具性能比hessian2要好。我們為 dubbo 引入 Kryo 和 FST 這兩種高效 Java 序列化實現,來逐步取代 hessian2。

dubbo有關序列化的實例如下:

 

 代碼構建,首先增加依賴

 1   <dependency>
 2             <groupId>de.javakaffee</groupId>
 3             <artifactId>kryo-serializers</artifactId>
 4             <version>0.42</version>
 5         </dependency>
 6         <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
 7         <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
 8         <dependency>
 9             <groupId>org.springframework.cloud</groupId>
10             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
11             <version>2.0.1.RELEASE</version>
12         </dependency>
13         <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard -->
14         <dependency>
15             <groupId>org.springframework.cloud</groupId>
16             <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
17             <version>2.0.1.RELEASE</version>
18         </dependency>

在配置文件中增加配置的屬性即可:

 

 

 

此時序列化配置完成,以下總結了常見序列化方式的性能

 

 

 3.熔斷

  由於網路和自身的原因,RPC之間的調用並不能保證100%可用,如果伺服器產生了宕機,同時又有大量的請求過來,就會出現雪崩,為瞭解決此問題,業界提出了熔斷。熔斷器打開後,為了避免連鎖故障,通過 fallback 方法可以直接返回一個固定值。此時fallback中可以做很多邏輯處理,比喻日誌或者郵件通過開發人員,及時對伺服器進行問題排查,降低風險度。

代碼構建,首先增加依賴

 1 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
 2         <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
 3         <dependency>
 4             <groupId>org.springframework.cloud</groupId>
 5             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
 6             <version>2.0.1.RELEASE</version>
 7         </dependency>
 8         <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard -->
 9         <dependency>
10             <groupId>org.springframework.cloud</groupId>
11             <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
12             <version>2.0.1.RELEASE</version>
13         </dependency>

其中第二個依賴是在熔斷儀錶盤中使用的。具體代碼和相關解釋如下如下:

 

 

 

 熔斷儀錶盤的配置,這裡需要註意spring boot2和1的配置是有區別的,具體可以參考官網文檔

 1 package com.edu.hello.dubbo.service.user.consumer.config;
 2 
 3 import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
 4 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 5 import org.springframework.context.annotation.Bean;
 6 import org.springframework.context.annotation.Configuration;
 7 
 8 /**
 9  * @ClassName HystrixDashboardConfiguration
10  * @Deccription TODO
11  * @Author DZ
12  * @Date 2019/9/3 23:10
13  **/
14 @Configuration
15 public class HystrixDashboardConfiguration {
16     @Bean
17     public ServletRegistrationBean getServlet() {
18         HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
19         ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
20         registrationBean.setLoadOnStartup(1);
21         registrationBean.addUrlMappings("/hystrix.stream");
22         registrationBean.setName("HystrixMetricsStreamServlet");
23         return registrationBean;
24     }
25 }

 啟動服務,查看結果。這裡只啟動了服務消費者,沒有啟動服務提供者,製造服務超時。

 訪問http://localhost:9090/hystrix查看熔斷界面,其他詳細信息可以查看詳細信息,其中儀錶盤的訪問地址是來自於config中,儀錶盤如下:

 

 

  訪問http://localhost:9090/hystrix.stream查看熔斷儀錶盤界面,更加詳細查看熔斷相關的信息

 儀錶盤中相關參數解釋如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python對於跨包調用函數時,經常會提示模塊不存在的問題,主要是python程式執行時,搜索路徑導致的,python程式執行的路徑依次是: (1)程式根目錄(2)環境變數(3)標準庫目標(D:\Python27\Lib 標準庫是在lib文件下)(4)第三方庫的目錄(D:\Python27\Lib\ ...
  • 2019-10-21-23:30:24 ArrayList類[集合] What:java.util.ArrayList是大小可變的數組的實現,存儲在內的數據稱為元元素,此類提供一些方法來操作內部存儲的元素 Why:ArrayList大小可變,所以AttayList中可不斷添加元素,其大小也自動增長。 ...
  • 前幾周,很流行一個手機游戲,叫《家國夢》。我在手機上玩了一兩天後,發現了兩個問題: 1. 收貨收金幣太沒意思,只需要手指滑在固定的路線,一會兒就煩了 2. 怎麼追趕也追不上手快的人(當然也需要一定策略) 我剛玩這個游戲的時候,還能在好友里排名第一,但三四天後就落到了第三,真是比不過年輕人。。。 正好 ...
  • 本人3年開發經驗、18年年底開始跑路找工作,在互聯網寒冬下成功拿到阿裡巴巴、今日頭條、滴滴等公司offer,崗位是 Java後端開發,最終選擇去了阿裡巴巴。 面試了很多家公司,感覺大部分公司考察的點都差不多,所以將自己的心得記下來,希望能給正在找或者準備找工作的朋友提供一點幫助。另外,目前在阿裡也做 ...
  • 廢話不多說,上代碼 1.從類名開始(我真是太貼心了,給自己點個贊) 首先數組類需要帶有泛型,這個不多說。需要註意的是在java中,數組只能存放同一個類型的。 2.成員變數 插個題外話: 關於size和索引,最開始學數組時讓我很傷神,首先數組的索引是從0開始,而size是指數組中元素的 的個數,假設數 ...
  • Python是一種面向對象的編程語言,語法簡潔而清晰,具有豐富和強大的類庫。Python在設計上堅持了清晰劃一的風格,這使得Python成為一門易讀、易維護,並且被大量用戶所歡迎的、用途廣泛的語言。對於初學編程者來說,首選Python是個非常棒的選擇。 零基礎學編程 零基礎學編程,用python入門 ...
  • 兩種併發編程模型 多進程 進程間通信常用的幾種方式: 文件 管道 消息隊列 多線程 一個進程中存在的多個線程,通常通過共用記憶體來通信,(說的非常非常粗俗,就是通過類似“全局變數”的一些數據對象來通信。不知道這種說對不對) 兩者優缺點 多線程優點 線程被稱為“輕量級進程”,一般啟動更快,而開啟一個進程 ...
  • 庸置疑,Spring 早已成為 Java 後端開發事實上的行業標準,無數的公司選擇 Spring 作為基礎的開發框架,大部分 Java 後端程式員在日常工作中也會接觸到 Spring ,因此,如何用好 Spring ,也就成為 Java 程式員的必修課之一。 同時,Spring Boot 和 Spr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...