1.熔斷/降級/限流
1.1.簡介
1.1.1.熔斷
A服務調用B服務某個功能,由于網(wǎng)絡不穩(wěn)定問題,或者B服務卡機,導致功能時間超長。如果這樣的次數(shù)太多,我們就可以直接將B服務斷路(A不再請求B接口),凡是調用B服務就直接返回降級數(shù)據(jù),不必等待B服務的超長執(zhí)行,這樣B服務的故障問題,就不會級聯(lián)影響到A。
1.1.2.降級
整個網(wǎng)站處于流量高峰期,服務器壓力劇增,根據(jù)當前業(yè)務情況及流量,對一些服務和頁面進行有策略的降級(停止服務,所有調用直接返回降級數(shù)據(jù)),以此緩解服務器資源的壓力,以保證核心業(yè)務的正常運行,同時也保持了客戶和大部分客戶得到正確的響應。
1.1.3.熔斷和降級的異同
相同點:
- 為了保證集群大部分服務的可用性和可靠性,防止崩潰,犧牲小我
- 用戶最終都是體驗到某個功能不可用
不同點:
- 熔斷是被調用方故障,觸發(fā)的系統(tǒng)主動規(guī)則
- 降級是基于全局考慮,人工停止一些正常服務,釋放資源
1.1.3.限流
對打入服務的請求流量進行控制,使服務能夠承擔不超過自己能力的流量壓力
1.2.Spring Cloud Alibaba - Sentinel
1.2.1.簡介
項目地址:https://github.com/alibaba/Sentinel
官方文檔:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5
隨著微服務的流行,服務和服務之間的穩(wěn)定性變得越來越重要。Sentinel 是面向分布式服務架構的流量控制組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統(tǒng)負載保護、熱點防護等多個維度來幫助開發(fā)者保障微服務的穩(wěn)定性。
1.2.2.Sentinel與Hystrix對比
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度保護服務的穩(wěn)定性;可以在控制臺中看到接入應用的單臺機器秒級數(shù)據(jù),甚至 500 臺以下規(guī)模的集群的匯總運行情況;Sentinel提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合;Sentinel 提供簡單易用、完善的 SPI 擴展接口,可以通過擴展接口來定制業(yè)務邏輯。
Hystrix是一個延遲和容錯庫,旨在隔離遠程系統(tǒng)、服務和第三方庫的訪問點,停止級聯(lián)故障,并在故障不可避免的復雜分布式系統(tǒng)中實現(xiàn)恢復能力;
Resilience4j是一個為Java8和函數(shù)式編程設計的容錯庫。提供高階函數(shù)(decorators)來增強任何功能接口、lambda表達式或方法引用,包括斷路器、速率限制器、重試或隔板??梢栽谌魏魏瘮?shù)接口、lambda表達式或方法引用上堆疊多個裝飾器。優(yōu)點是您可以選擇所需的裝飾器,而無需其他任何東西。
1.2.3.Sentinel使用步驟
官方文檔:https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
-
定義資源
- 主流框架的默認適配
- 拋出異常的方式定義資源
- 返回布爾值方式定義資源
- 注解方式定義資源
- 異步調用支持
-
定義規(guī)則
- 流量控制規(guī)則、熔斷降級規(guī)則、系統(tǒng)保護規(guī)則、來源訪問控制規(guī)則 和 熱點參數(shù)規(guī)則。
-
檢驗規(guī)則是否生效
1.2.4.Sentinel控制臺
下載地址:https://github.com/alibaba/Sentinel/releases/download/v1.8.0/sentinel-dashboard-1.8.0.jar
注意:Sentinel控制臺版本需要與引入的Sentinel依賴版本保持一致
啟動:
java -jar sentinel-dashboard-1.8.0.jar --server.port=8111
訪問:
http://192.168.139.10:8111
用戶名/密碼:sentinel/sentinel
1.2.5.Spring Boot整合Sentinel
1)導入依賴
gmall-common
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
gmall-seckill
<!--Endpoint 支持,顯示圖表->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2)配置Sentinel控制臺地址信息
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: 192.168.139.10:8111
# Endpoint 支持,暴露的 endpoint 路徑
management:
endpoints:
web:
exposure:
include: '*'
3)在Sentinel控制臺調整參數(shù),(默認所有的流控設置保存在內存中,重啟失效)
流控設置:資源名(/請求路徑)
- 簇點鏈路 -> 流控
- 流控規(guī)則 -> 新增流控規(guī)則
1.2.6.自定義Sentinel全局異常
package com.atguigu.gmall.seckill.config;
import com.alibaba.csp.sentinel.adapter.spring.webflux.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.spring.webflux.callback.WebFluxCallbackManager;
import com.atguigu.common.exception.BizCode;
import com.atguigu.common.utils.R;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
/**
* Sentinel 配置 {@link SentinelConfig}
*
* @author zhangwen
* @email: 1466787185@qq.com
*/
@Configuration
public class SentinelConfig {
/**
* 自定義Sentinel異常
*/
@PostConstruct
private void initBlockHandler(){
BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
R error = R.error(BizCode.TOO_MANY_REQUESTS.getCode(), BizCode.TOO_MANY_REQUESTS.getMessage());
return ServerResponse.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(error));
}
};
WebFluxCallbackManager.setBlockHandler(blockRequestHandler);
}
}
1.2.7.全服務引入Sentinel
1)導入依賴
<!--Endpoint 支持,顯示圖表->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2)配置Sentinel控制臺地址信息
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: 192.168.139.10:8111
# Endpoint 支持,暴露的 endpoint 路徑
management:
endpoints:
web:
exposure:
include: '*'
3)商城核心鏈路完整走一遍,查看Sentinel控制臺
- 首頁 -> 登錄 -> 商品檢索 -> 商品詳情 -> 加入購物車 -> 結算確認訂單 -> 提交訂單 -> 支付 -> 訂單列表
- 首頁 -> 秒殺 -> 商品詳情 -> 立即搶購 -> 搶購成功(創(chuàng)建訂單)-> 支付 -> 訂單列表
1.2.8.流控模式與效果
流控模式:
- 直接
- 關聯(lián)
- 鏈路
流控效果:
- 快速失敗
- Warm Up(預熱啟動/冷啟動)
- 排隊等待
1.2.9.Feign支持(熔斷)
使用Sentinel來保護feign遠程調用
1)調用方熔斷保護
feign:
sentinel:
enabled: true
gmall-product
package com.atguigu.gmall.product.feign;
import com.atguigu.common.utils.R;
import com.atguigu.gmall.product.fallback.SeckillFeignServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* 秒殺服務遠程接口 {@link SeckillFeignService}
*
* @author zhangwen
* @email: 1466787185@qq.com
*/
@FeignClient(value = "gmall-seckill", fallback = SeckillFeignServiceFallback.class)
public interface SeckillFeignService {
/**
* 獲取商品秒殺信息
* @param skuId
* @return
*/
@GetMapping("/sku/seckill/{skuId}")
R getSkuSeckillInfo(@PathVariable("skuId") Long skuId);
}
package com.atguigu.gmall.product.fallback;
import com.atguigu.common.exception.BizCode;
import com.atguigu.common.utils.R;
import com.atguigu.gmall.product.feign.SeckillFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 秒殺接口調用失敗熔斷處理 {@link SeckillFeignServiceFallback}
*
* @author zhangwen
* @email: 1466787185@qq.com
*/
@Slf4j
@Component
public class SeckillFeignServiceFallback implements SeckillFeignService {
@Override
public R getSkuSeckillInfo(Long skuId) {
log.info("熔斷方法調用...getSkuSeckillInfo");
return R.error(BizCode.TOO_MANY_REQUESTS.getCode(), BizCode.TOO_MANY_REQUESTS.getMessage());
}
}
2)調用方手動指定遠程服務的降級策略。遠程服務被降級,就會觸發(fā)熔斷回調方法。
3)超大流量的時候,必須犧牲一些遠程服務。在服務的提供方(遠程服務)指定降級策略。提供方是在運行,但是不運行自己的業(yè)務邏輯,返回的是默認的熔斷數(shù)據(jù)(限流的數(shù)據(jù))。
1.2.10.自定義受保護資源
1)拋出異常的方式定義資源(基于代碼)
public List<SeckillSkuRedisTO> getCurrentSeckillSkus() {
//seckillSkus 資源名
try(Entry entry = SphU.entry("seckillSkus")) {
//業(yè)務邏輯
} catch (BlockException e) {
log.error("資源被限流,{}", e.getMessage())
}
}
Sentinel控制臺為資源 seckillSkus 添加流控,,降級規(guī)則
2)注解方式定義資源(基于注解)
/**
* blockHandler 函數(shù)會在原方法被限流/降級/系統(tǒng)保護的時候調用
* fallback 函數(shù)會針對所有類型的異常
*/
@SentinelResource(value = "getCurrentSeckillSkusResource",
blockHandler = "getCurrentSeckillSkusBlockHandler")
public List<SeckillSkuRedisTO> getCurrentSeckillSkus() {
//seckillSkus 資源名
try(Entry entry = SphU.entry("seckillSkus")) {
//業(yè)務邏輯
} catch (BlockException e) {
log.error("資源被限流,{}", e.getMessage())
}
}
private List<SeckillSkuRedisTO> getCurrentSeckillSkusBlockHandler(BlockException e) {
log.error("getCurrentSeckillSkusResource被限流了");
return null;
}
Sentinel控制臺為資源 getCurrentSeckillSkusResource 添加流控,降級規(guī)則
1.3.網(wǎng)關流控
1.3.1.簡介
官方文檔:
https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
Sentinel 支持對 Spring Cloud Gateway、Zuul 等主流的 API Gateway 進行限流。
1.3.2.Spring Cloud Gateway
gmall-gataway 引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
1.3.3.自定義Sentinel異常處理
1)配置方式
spring:
cloud:
sentinel:
scg:
fallback:
mode: response
response-body: '{"code":403,"msg":"請求流量過大,系統(tǒng)限流"}'
2)GatewayCallbackManager注冊回調進行定制
SentinelConfig
package com.atguigu.gmall.gateway.config;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.atguigu.common.exception.BizCode;
import com.atguigu.common.utils.R;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
/**
* Sentinel 配置 {@link SentinelConfig}
*
* @author zhangwen
* @email: 1466787185@qq.com
*/
@Configuration
public class SentinelConfig {
/**
* GatewayCallbackManager注冊回調進行異常定制
*/
@PostConstruct
private void initBlockHandler(){
BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
R error = R.error(BizCode.TOO_MANY_REQUESTS.getCode(), BizCode.TOO_MANY_REQUESTS.getMessage());
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(error));
}
};
// GatewayCallbackManager注冊回調進行異常定制
GatewayCallbackManager.setBlockHandler(blockRequestHandler);
}
}
1.3.4.網(wǎng)關流控原理
當通過 GatewayRuleManager 加載網(wǎng)關流控規(guī)則( GatewayFlowRule )時,無論是否針對請求屬性進行限流,Sentinel 底層都會將網(wǎng)關流控規(guī)則轉化為熱點參數(shù)規(guī)則( ParamFl owRule ),存儲在GatewayRuleManager 中,與正常的熱點參數(shù)規(guī)則相隔離。轉換時 Sentinel 會根據(jù)請求屬性配置,為網(wǎng)關流控規(guī)則設置參數(shù)索引( idx ),并同步到生成的熱點參數(shù)規(guī)則中。
外部請求進入 API Gateway 時會經(jīng)過 Sentinel 實現(xiàn)的 filter,其中會依次進行 路由/API 分組匹配、請求屬性解析和參數(shù)組裝。Sentinel 會根據(jù)配置的網(wǎng)關流控規(guī)則來解析請求屬性,并依照參數(shù)索引順序組裝參數(shù)數(shù)組,最終傳入 SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模塊向Slot Chain 中添加了一個 GatewayFlowSlot ,專門用來做網(wǎng)關規(guī)則的檢查。 GatewayFlowSlot 會從 GatewayRuleManager 中提取生成的熱點參數(shù)規(guī)則,根據(jù)傳入的參數(shù)依次進行規(guī)則檢查。若某條規(guī)則不針對請求屬性,則會在參數(shù)最后一個位置置入預設的常量,達到普通流控的效果。
上圖的整體流程如下:
- 外部請求進入API Gateway時會經(jīng)過Sentinel實現(xiàn)的filter,其中會依次進行路由/API分組匹配、請求屬性解析和參數(shù)組裝。
- Sentinel 會根據(jù)配置的網(wǎng)關流控規(guī)則來解析請求屬性,并依照參數(shù)索引順序組裝參數(shù)數(shù)組,最終傳入SphU.entry(res, args) 中。
- Sentinel API Gateway Adapter Common模塊向 Slot Chain 中添加了一個 GatewayFlowSlot,專門用來做網(wǎng)關規(guī)則的檢查。
- GatewayFlowSlot會從GatewayRuleManager中提取生成的熱點參數(shù)規(guī)則,根據(jù)傳入的參數(shù)依次進行規(guī)則檢查。若某條規(guī)則不針對請求屬性,則會在參數(shù)最后一個位置置入預設的常量,達到普通流控的效果。
注意:當通過 GatewayRuleManager加載網(wǎng)關流控規(guī)則GatewayFlowRule時,無論是否針對請求屬性進行限流,Sentinel底層都會將網(wǎng)關流控規(guī)則轉化為熱點參數(shù)規(guī)則ParamFlowRule,存儲GatewayRuleManager中,與正常的熱點參數(shù)規(guī)則相隔離。轉換時Sentinel會根據(jù)請求屬性配置,為網(wǎng)關流控規(guī)則設置參數(shù)索引idx,并同步到生成的熱點參數(shù)規(guī)則中。
1.3.5.網(wǎng)關流控控制臺
- 查看 API Gateway 實時的 route 和自定義 API 分組監(jiān)控
- 管理網(wǎng)關規(guī)則和 API 分組配置
快速刷新鏈接
2.Sleuth+Zipkin服務鏈路追蹤
2.1.為什么用?
微服務架構是一個分布式架構,它按業(yè)務劃分服務單元,一個分布式系統(tǒng)往往有很多個服務單元。由于服務單元數(shù)量眾多,業(yè)務的復雜性,如果出現(xiàn)了錯誤和異常,很難去定位。主要體現(xiàn)在,一個請求可能需要調用很多個服務,而內部實現(xiàn)分布式鏈路追蹤,去跟進一個請求到底有哪些服務參與,參與的順序又是怎樣的,從而達到每個請求的步驟清晰可見,出了問題,很快定位。
對于一個大型的幾十個、幾百個微服務構成的微服務架構系統(tǒng),通常會遇到下面一些問題,比如:
- 如何串聯(lián)整個調用鏈路,快速定位問題?
- 如何理清各個微服務之間的依賴關系?
- 如何進行各個微服務接口的性能分折?
- 如何跟蹤整個業(yè)務流程的調用處理順序?
鏈路追蹤組件有:
- Dapper(Google)
- Zipkin(Twitter)
- Eagleeye(Alibaba)
- SkyWalking(Apache)
Spring Cloud Sleuth為Spring Cloud提供了分布式跟蹤的解決方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的設計,幫我們解決像上面提到的問題。Spring Cloud Sleuth可以追蹤10種類型的組件:async、Hystrix,messaging,WebSocket,rxjava,scheduling,Web(SpringMVC Controller,Servlet),WebClient(Spring RestTemplate)、Feign/OpenFegin、Zuul;
Spring Cloud Sleuth對于分布式鏈路的跟蹤僅僅是生成一些數(shù)據(jù),這些數(shù)據(jù)不便于人類閱讀,所以我們一般把這種跟蹤數(shù)據(jù)上傳給Zipkin Server,由Zipkin通過UI頁面統(tǒng)一進行數(shù)據(jù)的展示。
2.2.基本術語
官方文檔:https://docs.spring.io/spring-cloud-sleuth/docs/3.0.1/reference/htmlsingle/
- Span(跨度):基本工作單元,發(fā)送一個遠程調度任務就會產生一個Span,Span是一個64位ID唯一標識,Trace是用另一個64位ID唯一標識,Span還有其他數(shù)據(jù)信息,比如摘要,時間戳時間,Span的ID,及進度ID
- Trace(跟蹤):一系列Span組成的一個樹狀結構。請求一個微服務系統(tǒng)的API接口,這個API接口,需要調用多個微服務,調用每個微服務都會產生一個新的Span,所有由這個請求產生的Span組成了這個Trace。
- Annotation(標注):用來及時記錄一個事件,一些核心注解用來定義一個請求的開始和結束,這些注解包括以下:
- cs: Client Sent,客戶端發(fā)送一個請求,這個注解描述了這個Span的開始
- sr:Server Received,服務器獲得請求并準備開始處理,如果將其sr減去cs時間戳,便可得到網(wǎng)絡傳輸時間
- ss:Server Sent,服務端發(fā)送響應,該注解表明請求處理的完成(當請求返回客戶端),如果ss的時間戳減去sr時間戳,就可以得到服務器請求的時間
- cr:Client Received,客戶端接收響應,此時Span的結束,如果cr時間戳減去cs時間戳,就可以得到整個請求所消耗的時間
2.3.Zipkin架構
2.3.1.架構概述
追蹤器駐留在你的應用程序里,并且記錄發(fā)生操作的時間和元數(shù)據(jù)。他們經(jīng)常裝配在庫上,所以對用戶來說是透明的。舉個例子,一個裝配過的 Web 服務器,會在接收請求和發(fā)送響應進行記錄。收集的追蹤數(shù)據(jù)叫做 Span(跨度)。
生產環(huán)境中的裝配器應該是安全并且低負載的。為此,帶內(in-band)只傳輸 ID,并且告訴接收器仍有一個追蹤在處理。完成的跨度在帶外(out-of-band)匯報給 Zipkin,類似于應用程序異步匯報指標一樣。
舉個例子,當追蹤一個操作的時候,該操作對外發(fā)送了一個 HTTP 請求,那么,為了傳輸 ID 就會添加一些額外的頭部信息。頭部信息并不是用于發(fā)送像是操作明這樣的詳細信息的。
裝配應用中用于向 Zipkin 發(fā)送數(shù)據(jù)的組件叫做 Reporter。Reporter 通過 Transport 發(fā)送追蹤數(shù)據(jù)到Zipkin 的 Collector,Collector 持久化數(shù)據(jù)到 Storage 中。之后,API 從 Storage 中查詢數(shù)據(jù)提供給 UI。
其中左邊部分代表了客戶端分別為:
- InstrumentedClient:使用了Zipkin客戶端工具的服務調用方
- InstrumentedServer:使用了Zipkin客戶端工具的服務提供方
- Non-InstrumentedServer:未使用Trace工具的服務提供方,當然還可能存在未使用工具的調用方
- 總結:一個調用鏈路是貫穿InstrumentedClient->InstrumentedServer的,每經(jīng)過一個服務都會以Span的形式通過Transport把經(jīng)過自身的請求上報的Zipkin服務端中
右邊線框內代表了Zipkin的服務端,其中各組件的功能如下:
- UI:提供web頁面,用來展示Zipkin中的調用鏈和系統(tǒng)依賴關系等
- Collector:對各個客戶端暴露,負責接受調用數(shù)據(jù),支持HTTP、MQ等
- Storage:負責與各個存儲適配后存儲數(shù)據(jù),支持內存,MySQL,Cassandra,ES等
- API:為web界面提供查詢存儲中的數(shù)據(jù)的接口
2.3.2.流程分析
正如概述中所提到的,標識符是在帶內發(fā)送的,細節(jié)以帶外形式發(fā)送到Zipkin。在這兩種情況下,跟蹤工具都負責創(chuàng)建有效的痕跡并正確渲染它們。例如,跟蹤器可確保它在帶內(下游)和帶外(向Zipkin異步)發(fā)送的數(shù)據(jù)之間進行平衡。
以下是用戶代碼調用資源 / foo 的 http 跟蹤示例序列。這會導致一個跨度,在用戶代碼收到http響應后異步發(fā)送到Zipkin。
跟蹤檢測報告異步跨越,以防止與跟蹤系統(tǒng)相關的延遲或故障延遲或破壞用戶代碼。
2.3.實現(xiàn)原理
服務調用依賴關系如下:
下圖表示請求鏈路,一條鏈路通過Trace Id唯一標識,Span標識發(fā)起的請求信息,各個Span通過parent id 關聯(lián)起來。
上圖簡化:
如 服務1的Span id=A parent id=null,
服務2的Span id=B parent id=A,
服務3的Span id=C parent id=B
如此形成一條或多條鏈路,由于Trace Id是唯一標識,所以可以清楚的知道每個服務請求的鏈路。
2.4.整合Sleuth+Zipkin
通過Sleuth產生的調用鏈監(jiān)控信息,可以得知微服務之間的調用鏈路,但監(jiān)控信息只輸出到控制臺不方便查看。我們需要一個圖形化的工具Zipkin。Zipkin是Twitter開源的分布式跟蹤系統(tǒng),主要用來收集系統(tǒng)的時序數(shù)據(jù),從而追蹤系統(tǒng)的調用問題。
官網(wǎng):https://zipkin.io/
2.4.1.docker安裝Zipkin服務器
docker run -d -p 9411:9411 openzipkin/zipkin
2.4.2.導入依賴
gmall-common
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
注意:引入zipkin后,就不需要在單獨引入sleuth,默認依賴了sleuth
2.4.3.zipkin配置
所有微服務都需要配置
spring:
application:
name: gmall-seckill
zipkin:
# zipkin服務器地址
base-url: http://192.168.139.10:9411
# 關閉服務發(fā)現(xiàn),否則Spring Cloud會把zipkin的url當做服務名稱
discovery-client-enabled: false
sender:
# 設置使用http的方式傳輸數(shù)據(jù)
type: web
sleuth:
sampler:
# 設置抽樣采集率為100%,默認為0.1,即10%
probability: 1
2.4.4.Zipkin控制臺
訪問核心鏈路:首頁 -> 登錄 -> 商品檢索 -> 商品詳情 -> 加入購物車 -> 結算確認訂單 -> 提交訂單 -> 支付 -> 訂單列表
進入zipkin控制臺:http://192.168.139.10:9411
默認是查詢所有,點擊 + 號,可以根據(jù)服務名、持續(xù)時間等進行篩選
2.5.Zipkin數(shù)據(jù)持久化
Zipkin默認是將監(jiān)控數(shù)據(jù)存儲在內存的,如果Zipkin掛掉或重啟,那么監(jiān)控數(shù)據(jù)就會丟失。所有如果想要搭建生成可用的Zipkin,就需要實現(xiàn)監(jiān)控數(shù)據(jù)的持久化。而想要實現(xiàn)數(shù)據(jù)數(shù)據(jù)化,自然就是得將數(shù)據(jù)存儲至數(shù)據(jù)庫。Zipkin支持將數(shù)據(jù)存儲至:
- In-Memory(默認)
- MySQL
- ElasticSearch
- Cassandra
Zipkin數(shù)據(jù)持久化官方文檔:https://github.com/openzipkin/zipkin#storage-component
Zipkin支持的這幾種存儲方式中,內存顯示是不適用于生產的,這一點開始也說了。而使用MySQL的話,當數(shù)據(jù)量大時,查詢較為緩慢,也不建議使用。Twitter官方使用的是Cassandra作為Zipkin的存儲數(shù)據(jù)庫,但國內大規(guī)模用Cassandra的公司較少,而且Cassandra相關文檔也不多。綜上,故采用ElasticSearch是個比較好的選擇。
2.5.1.elasticsearch-storage
https://github.com/openzipkin/zipkin/tree/master/zipkin-server#elasticsearch-storage
docker方式
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.139.10:9200 openzipkin/zipkin-dependencies
2.6.Zipkin界面分析
2.6.1.調用鏈路分析
2.6.2.依賴關系分析
文章來源:http://www.zghlxwxcb.cn/news/detail-615312.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-615312.html
到了這里,關于第27天-熔斷,降級,限流,網(wǎng)關流控,服務鏈路追蹤的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!