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

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

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

1.服務負載均衡web

負載均衡可分爲軟件負載均衡和硬件負載均衡。在咱們平常開發中,通常很難接觸到硬件負載均衡。但軟件負載均衡仍是能夠接觸到的,好比 Nginx。dubbo提供的也是軟負載。算法

 

 

 

 

 

詳細內容能夠閱讀dubbo官網關於負載均衡的介紹,這裏總結下負載均衡的方式:spring

  • 權重隨機算法的 RandomLoadBalance

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

  • 最少活躍調用數算法的 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。這個過程就叫作輪詢。輪詢是一種無狀態負載均衡算法,實現簡單,適用於每臺服務器性能相近的場景下。加權輪詢是將服務器賦一個權值,而後按照該權值進行輪訓。網絡

 

代碼構建,本例使用輪訓算法作demoapp

直接在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查看熔斷儀表盤界面,更加詳細查看熔斷相關的信息

 儀表盤中相關參數解釋以下:

相關文章
相關標籤/搜索