場景:服務user,有一個接口/getUserOrder.do,調用服務order的/getOrder.do接口,獲取用戶訂單信息。
若調用失敗,需要進行降級處理,返回"已進行降級相關處理"字符串。
一,Feign整合Sentinel實現降級處理
新建配置類
public class FeignConfiguration {
@Bean
public OrderProviderFallback orderProviderFallback() {
return new OrderProviderFallback();
}
}
Feign調用服務接口
@FeignClient(name = "order", fallback = OrderProviderFallback.class, configuration = FeignConfiguration.class)
public interface OrderProvider {
@GetMapping("/getOrder.do")
String getOrder();
}
新建降級處理類
public class OrderProviderFallback implements OrderProvider{
@Override
public String getOrder() {
return "已進行降級相關處理";
}
}
添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
application.yml配置
feign:
sentinel:
enabled: true
二,實現服務降級有兩種方案
1.設置ribbon超時時間,調用超時後,自動會降級
(如果不設置,自己測試了一下兩個屬性默認都是2秒,即不設置則自動使用2秒超時服務降級方案)
ribbon:
#連接服務超時時間爲5秒
ConnectTimeout: 5000
#連接後,處理請求的超時時間爲5秒
ReadTimeout: 5000
2.設置Sentinel降級配置,如設置超過平均響應時間則降級
下載Sentinel控制檯jar,地址https://github.com/alibaba/Sentinel/releases
啓動控制檯
java -Dserver.port=1992 -Dcsp.sentinel.dashboard.server=localhost:1992 -Dproject.name=sentinel-dashboard -jar newgitwp/SpcUser/doc/sentinel/sentinel-dashboard-1.7.1.jar
默認賬號密碼都是sentinel
添加依賴
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.3.0-GA</version>
</dependency>
application.yml配置
spring:
application:
name: user
cloud:
nacos:
discovery:
server-addr: localhost:1991 #使用nacos做註冊中心
sentinel:
transport:
dashboard: localhost:1992 #sentinel控制檯地址
# 取消Sentinel控制檯懶加載
eager: true
添加以下代碼實現降級配置(可以放在啓動的main方法裏面執行,若放在@Configuration類的靜態代碼塊中執行會註冊不了,有bug)
private static void initRtRule() {
List<DegradeRule> rules = new ArrayList<DegradeRule>();
DegradeRule rule = new DegradeRule();
rule.setResource("GET:http://order/getOrder.do");//資源名稱
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);//降級模式,根據平均響應時間降級
rule.setCount(1000);//設置平均響應時間爲1000ms
rule.setTimeWindow(10);//設置降級持續時間爲10s
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
說明:當持續進入的5個請求響應時間都超過1000ms,接下來的10s內對這個接口的調用都會直接返回並拋出DegradeException,然後執行降級方法
ps:添加以下代碼可以實現對接口的限流
private static void initFlowQpsRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("/getUserOrder.do");
rule.setCount(1);//限制每秒只能接受1個請求
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//默認
rule.setLimitApp("default");//默認
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
配置完成後整個服務的流程(以上代碼處理都是在user項目中實現,order項目不用動):
user服的getUserOrder.do接口 通過Feigin調用--> order服的getOrder.do接口
對getUserOrder.do進行限流處理,每秒只能接受1個請求
對GET:http://order/getOrder.do進行降級處理,若持續進入的5個請求平均響應時間都超過1000ms則接下來10s內的請求都降級,返回"已進行降級相關處理"字符串
三,官方鏈接
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8