Feign整合Sentinel實現降級處理

場景:服務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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章