今天在整合SpringCloud alibaba Sentinel 時發現一個意想不到的事情,那就是設置攔截資源,自定義返回結果的時候WebCallbackManager類實現UrlBlockHandler 死活
無法實現,上網查了很久,沒有一點用處,說到這里,不得不吐槽一下有些博主,你們寫博客就算要借鑒別人的,你好歹稍微改改標點符號呀,標題呀,你們完全是照着抄寫ctry c+ctry v 啊,我也是醉了,搜到的內容真的慘不忍睹。。。好了開始正題
都知道,之前的版本升級,高版本都是能兼容低版本的,可是這次2.2.0的升級不知道為啥,就是沒兼容低版本的sentinel,之前的版本基於==sentinel-web-servlet ==實現
而2.2.0 是依賴 sentinel-spring-webmvc-dapter , 基於 Spring 的 Interceptor 攔截資源,而不再是 CommonFilter。
實現接口發現變化
// 之前版本
public class PigxUrlBlockHandler implements UrlBlockHandler {
@Override
public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {
// 降級業務處理
}
}
// v2.2.0
public class PigxUrlBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
// 降級業務處理
}
}
請求解析器
實現接口的包發生變化
//舊版本
import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
// v2.2.0
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
// 請求解析器實現
public class PigxHeaderRequestOriginParser implements RequestOriginParser {
private static final String ALLOW = "Allow";
@Override
public String parseOrigin(HttpServletRequest request) {
return request.getHeader(ALLOW);
}
}
** 默認情況下只攔截 /* 請求** 注意:只有斜杠后面只有一個 *
上文提到V2.2.0 是基於 Interceptor 實現,默認攔截規則為 /*, 也就是只有 請求URI 為 / ,/a 的請求可以被sentinel處理,dashboard 也只會顯示被攔截的資源,需要配置一下攔截規則。
spring:
cloud:
sentinel:
filter:
url-patterns: /**
** 默認情況: spring boot admin 顯示部分服務為 down,控台只顯示部分服務**
訪問服務 IP:PORT/actuator/health 顯示sentinel 狀態為 down,默認情況下 sentinel 是懶加載的,在啟動時不會立即給 sentinel-server 發送心跳,導致SentinelHealthIndicator 將狀態判為 false ,進而導致 Spring Boot Admin 讀取到 actuator 信息為 down
可以設置飢餓加載,啟動加載時就會加載,並發送心跳
spring:
cloud:
sentinel:
eager: true
最后說一下,最后找到解決辦法是在開源中國找過的,大家有事沒事可以去這個網站逛逛,比百度里面一些文章靠譜。。。