學習主題:httpPool&Hystrix
學習目標:
對應視頻:
http://www.itbaizhan.cn/course/id/85.html
對應文檔:
無
對應作業
1. 編寫支持Gzip壓縮案例
(1) 修改Consumer的全局配置文件,添加Gzip相關配置。
spring.application.name=eureka-consumer-httpclientserver.port=9002#-----------------------------feign gzip#配置請求 GZIP 壓縮feign.compression.request.enabled=true#配置響應 GZIP 壓縮feign.compression.response.enabled=true#配置壓縮支持的 MIME TYPEfeign.compression.request.mime-types=text/xml,application/xml,application/json#配置壓縮數據大小的最小閥值,默認 2048feign.compression.request.min-request-size=512#2.2.2對客戶端瀏覽器的請求以及 Consumer 對 provider 的請#求與響應做 Gzip 壓縮#-----------------------------spring boot gzip#是否啟用壓縮server.compression.enabled=trueserver.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain#啟用httpclientfeign.httpclient.enabled=true#設置服務注冊中心地址,指向另一個注冊中心eureka.client.service-url.defaultZone=http://user:123@eureka2:8761/eureka/,http://user:123@eureka1:8761/eureka/
2. 為什么http連接池能提升性能
(1) Http的背景原理是什么?
1. 兩臺服務器建立http連接的過程是很復雜的一個過程,涉及到多個數據包的交喚1,并且也很耗時
2. Http連接需要的3次握手4次分手開銷很大.這一開銷對于大量的比較小的http消息來說更大
(2) Http優化解決方案有哪些?
a. 如果我們直接采用 http 連接池,節約了大量的 3 次握手 4 次分手;這樣能大大提升吞
吐率。
b. feign 的 http 客戶端支持 3 種框架;HttpURLConnection、httpclient、okhttp;默認是
HttpURLConnection。
c. 傳統的 HttpURLConnection 是 JDK 自帶的,并不支持連接池,如果要實現連接池的
機制,還需要自己來管理連接對象。對于網絡請求這種底層相對復雜的操作,如果有可用的
其他方案,也沒有必要自己去管理連接對象。
d. HttpClient 相比傳統 JDK 自帶的 HttpURLConnection,它封裝了訪問 http 的請求頭,
參數,內容體,響應等等;它不僅使客戶端發送 HTTP 請求變得容易,而且也方便了開發人
員測試接口(基于 Http 協議的),即提高了開發的效率,也方便提高代碼的健壯性;另外
高并發大量的請求網絡的時候,還是用“連接池”提升吞吐量。
3. 編寫支持Http連接案例
(1) 使用Gzip壓縮Http連接的原理是什么?
實際是將json格式的文本信息壓縮進行傳輸 增加傳遞效率
(2) 使用Gzip壓縮Http連接在處理參數時需要注意什么?
需要添加json格式的注解 @RequestBody
4. 在微服務的日志中記錄每個接口URL,狀態碼和耗時信息
(1) Logger.Level中NONE表示什么含義?
不記錄任何信息 ,默認
(2) Logger.Level中BASIC表示什么含義?
記錄請求方法,請求url,狀態碼,和用時
(3) Logger.Level中HEADERS表示什么含義?
在BASIC基礎上再記錄一些常用信息
(4) Logger.Level中FULL表示什么含義?
記錄請求和響應的所有信息
5. 配置Feign負載均衡請求超時時間
(1) 配置Feign負載均衡請求超時時間的作用是什么?
可能由于服務處理的請求較長就中斷了該連接是不對的
(2) 配置Feign負載均衡請求超時時間分為幾種方式?
全局配置 或者 局部配置
#全局配置/指定配置#對所有操作請求都進行重試eureka-provider.ribbon.OkToRetryOnAllOperations=true#對當前實例的重試次數eureka-provider.ribbon.MaxAutoRetries=2#切換實例的重試次數eureka-provider.ribbon.MaxAutoRetriesNextServer=0#設置eureka-provider生產者的ribbon鏈接超時時間eureka-provider.ribbon.ReadTimeout=3000# 請求連接的超時時間默認的時間為1秒eureka-provider.ribbon.ConnectTimeout=3000
分享/講解/擴展思考
點名提問從第一節課到最后一節課分別學到了什么,直到同學們把所有的知識點都說出來并且保證無誤。
第242次(httpPool&Hystrix)
學習主題:httpPool&Hystrix
學習目標:
對應視頻:
http://www.itbaizhan.cn/course/id/85.html
對應文檔:
無
對應作業
6. 什么是服務災難性雪崩效應
(1) 什么是災難性雪崩效應?
在微服務架構中,一個請求需要調用多個服務是非常常見的。如客戶端訪問A服務,而A服務需要調用B服務,B服務需要調用C服務,由于網絡原因或者自身的原因,如果B服務或者C服務不能及時響應,A服務將處于阻塞狀態,直到B服務C服務響應。此時若有大量的請求涌入,容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,造成連鎖反應,會對整個微服務系統造成災難性的嚴重后果,這就是服務故障的“雪崩”效應。
(2) 造成雪崩原因是什么?

7. 如何解決災難性雪崩效應
(1) 解決災難性雪崩效應有哪些方式?
降級:
超時降級 , 資源不足時(線程或信號量)降級,降級后可以配置降級接口返回托底數據,實現一個fallback方法,當請求后端服務出現異常的時候,可以使用fallback方法返回的值
隔離(線程池隔離和信號量隔離)
限制調用分布式服務的資源使用,某一個調用的服務出現問題不會影響其他服務調用
熔斷
當失敗率(如因網絡故障/超時造成的失敗率高)到達閾值自動觸發降級,熔斷器觸發的快速失敗會進行快速恢復
緩存
提供了請求緩存
請求合并
提供了請求合并
(2) 每種方式的特點是什么?
8. 解決災難性雪崩效應-降級-創建項目
(1) 什么是服務降級?
超時,資源不足時 ,線程降級 ,降級后可以配合降級接口返回托底數據 實現一個fallback方法,當請求后端服務出現異常的時候, 可以使用fallback方法返回的值
(2) 查實@EnableCircuitBreaker注解的作用是什么?
開啟熔斷器 當某服務出現異常時,可以跳至其他方法處理
(3) @HystrixCommand注解的作用是什么?
此注解表示此方法是hystrix方法
9. 解決災難性雪崩效應-降級-服務降級處理
(1) 在幾種情況下會觸發getFallback的調用?
雪崩效應的服務的降級處理
當服務出現異常時觸發
方法拋出非HystrixBadRequestException異常
方法調用超時
熔斷器開啟攔截調用
線程池/隊列/信號量是否跑滿
10. 解決災難性雪崩效應-請求緩存-創建項目
(1) 什么是請求緩存?
將相同請求的返回值和URL 存入redis數據庫 ,下次再有相同的請求時就可以直接響應結果
Hystrix為了降低訪問服務的概率,支持將一個請求與返回結果做緩存處理,如果再次請求的URL沒有變化,那么Hystrix不會請求服務,而是直接從緩存中將結果返回,這樣可以大大降低訪問服務的壓力
Hystrix自帶緩存,有兩個缺點
1. 是一個本地緩存,再集群情況下緩存是不能同步的
2. 不支持第三方緩存容器,Redis,memcache不支持的可以使用spring的cache
(2) @EnableCaching注解的作用是什么?
開啟緩存
11. 解決災難性雪崩效應-請求緩存-請求緩存處理
(1) @CacheConfig注解的作用是什么?
這個用于配置該類會用到的一些共用的緩存配置 ,
例如:
@CacheConfig(cacheNames=”users”) : 配置了該數據訪問對象中返回的內容將存儲于名為users的對象中,我們也可以不用該注解,直接通過@Cacheable自己配置緩存集的名字來定義
(2) @CacheEvict注解的作用是什么?
刪除數據時自動去redis數據庫中刪除緩存
(3).@Cacheable :配置了此注解的返回值將被加入緩存,同時在查詢時,會從緩存中獲取,如果不存在緩存才發起對數據庫的訪問
12. 解決災難性雪崩效應-請求合并-創建項目
(1) 什么是請求合并?
將多個類似的請求合并成一個請求 再去請求數據

(2) 什么情況下使用請求合并?
在高并發情況下,通信次數的增加會導致總的通信時間增加,同時,線程池的資源也是有限的,高并發環境會導致大量的線程處于等待狀態,進而導致響應延遲
進而需要Hystrix的請求合并
(3) 請求合并有哪些缺點?
設置請求合并之后,本來一個請求可能 5ms 就搞定了,但是現在必須再等 10ms 看看還 有沒有其他的請求一起的,這樣一個請求的耗時就從 5ms 增加到 15ms 了,不過,如果我們 要發起的命令本身就是一個高延遲的命令,那么這個時候就可以使用請求合并了,因為這個時候時間窗的時間消耗就顯得微不足道了,另外高并發也是請求合并的一個非常重要的場 景。
13. 解決災難性雪崩效應-請求合并-請求合并處理
(1) @HystrixCollapser注解的作用是什么?
使用hystrix的合并請求
被@HystrixCollapser標注的方法,返回類型必須為Future,使用異步方法,否則無法進行請求并行
(2) @HystrixProperty注解的作用是什么?
設置請求并行參數
(3) @HystrixCommand注解的作用是什么?
配置屬性
(4) @HystrixCollapser注解中的batchMethod屬性的作用是什么?
合并請求的方法
方法只能接受一個參數,如果你需要傳遞多個參數,那么請將他們封裝成一個類參數
(5) @HystrixCollapser注解中的scope屬性的作用是什么?
請求方式 默認REQUEST
請求方式: 分為 REQUEST,GLOBAL
REQUEST范圍只對一個request請求內的多次服務請求進行合并
GlOBAL 是多單個應用中的所有線程的請求中的多次服務請求進行合并
(6) @HystrixCollapser注解中的timerDelayInMiliseconds屬性的作用是什么?
請求時間間隔在10ms(默認)之內的請求會被合并為一個請求
(7) @HystrixCollapser注解中的maxRequestsInBatch屬性的作用是什么?
設置觸發批處理執行之前, 在批處理中允許的最大請求數 默認Integer.MAX_VALUE

14. 解決災難性雪崩效應-服務熔斷-創建項目
(1) 什么是服務熔斷?
當電壓過大時,保險絲自動熔斷的意思

分享/講解/擴展思考
點名提問從第一節課到最后一節課分別學到了什么,直到同學們把所有的知識點都說出來并且保證無誤。