在上一篇中我們介紹 spring cloud zuul 不能刪除route
對于這個問題我們可以理解zuul 為了防止因為個別因素導致 zuul模塊通過config-service 拉取配置時出現(xiàn)拉取配置失敗從而導致所有route被刪除導致的一系列事故而做的容錯處理。但是這樣做的問題就是巷折,當我們某一次出現(xiàn)誤操作而刪除網(wǎng)關(guān)滑沧,因為這個容錯處理導致我們并沒有發(fā)現(xiàn)問題袱饭,后續(xù)我們再次重啟或者重推網(wǎng)關(guān)服務(wù)的話,就會發(fā)現(xiàn)出現(xiàn)問題而長時間沒有發(fā)現(xiàn)問題的根源,進而花費大量時間去定位問題,從而導致重大事故稿蹲,當然還有就是每次下網(wǎng)關(guān)route都需要重啟網(wǎng)關(guān)浪費人力物力資源。因此在我的理解這種問題應(yīng)該快速發(fā)現(xiàn)而不是將他隱藏鹊奖,當然我們也不能破壞他的這個容錯處理苛聘。所以我們可以采取一次只能刪除一定數(shù)量的route,這樣防止因為網(wǎng)絡(luò)問題等不確定因數(shù)導致刪除了不該刪的route而導致重大事故問題忠聚。
但是具體改怎么去刪除這個網(wǎng)關(guān)呢设哗?
源碼:
在ZuulProperties中我們可以發(fā)現(xiàn)route是被保存在一個map里面的
/**
* Map of route names to properties.
*/
private Map<String, ZuulRoute> routes = new LinkedHashMap<>();
public Map<String, ZuulRoute> getRoutes() {
return routes;
}
相信看到這里大家都知道改怎么樣去刪除這個網(wǎng)關(guān)了。
具體步驟就是:
- 從config-service 去拉取route的配置routeConfig
- 將這個routeConfig和zuul 的routes進行diff
- 然后將routeConfig路面少的route配置進行刪除
核心代碼
@Autowired
private ZuulProperties zuulProperties;
@Autowired
private RouteConfig routeConfig;
public void remove() {
Map<String, Object> configRoutes = routeConfig.getRoutes();
Map<String, ZuulProperties.ZuulRoute> oldRoutes = zuulProperties.getRoutes();
Set<String> configRoutesTemp = new HashSet<>(configRoutes.keySet());
Set<String> oldRoutesTemp = new HashSet<>(oldRoutes.keySet());
oldRoutesTemp.removeAll(configRoutesTemp);
for (String invalidKey:oldRoutesTemp) {
oldRoutes.remove(invalidKey);
}
zuulProperties.setRoutes(oldRoutes);
}
如果怕因為個別因數(shù)導致一次性刪除大量route两蟀,可以執(zhí)行對oldRoutesTemp的數(shù)量進來判斷网梢,或者其他個性化定制。
比如:
if(oldRoutesTemp.size() > 2 ){
logger.error("不能同時刪除兩個以上的route: {}",
JSON.toJSONString(oldRoutesTemp));
return;
}