zuul是被spring集成在spring-cloud項目下的凭豪,一般都會配合eureak使用
eureka-client包中器腋,在DiscoveryClient初始化的時候顾腊,默認(rèn)會開啟一個定時器譬胎,每隔30秒發(fā)布一個HeartbeatEvent事件浴井,而ZuulRefreshListener會監(jiān)聽這個事件钦讳,然后調(diào)用ZuulHandlerMapping.setDirty(true);
所以鲫剿,RouteLocator的refresh時間不能太長,不然后果很嚴(yán)重
如果refresh結(jié)束之前涂佃,dirty值已經(jīng)被改成false励翼,當(dāng)時確實更新的route不會生效粮揉,但是會在下一個HeartbeatEvent事件發(fā)布后生效
如果,需要在refresh之后抚笔,立刻生效,也可以通過aop+反射來解決這個問題
private Logger logger = LoggerFactory.getLogger(CompositeRouteAop.class);
@Resource
private ZuulHandlerMapping handlerMapping;
@Pointcut("execution(* org.springframework.cloud.netflix.zuul.filters.CompositeRouteLocator.refresh(..))")
public void pointCut() {
}
@Around("pointCut()")
public Object resetDirty(ProceedingJoinPoint joinPoint) throws Throwable {
Object proceed = joinPoint.proceed(joinPoint.getArgs());
try {
Field dirty = ZuulHandlerMapping.class.getDeclaredField("dirty");
dirty.setAccessible(true);
dirty.setBoolean(handlerMapping, true);
} catch (Throwable e) {
logger.error("reset zuulHandlerMapping dirty value error after refresh route", e);
}
return proceed;
}
![240](https://cdn2.jianshu.io/assets/default_avatar/2-9636b13945b9ccf345bc98d0d81074eb.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240)