240 发简信
IP属地:北京
  • zuul是被spring集成在spring-cloud项目下的,一般都会配合eureak使用
    eureka-client包中,在DiscoveryClient初始化的时候,默认会开启一个定时器,每隔30秒发布一个HeartbeatEvent事件,而ZuulRefreshListener会监听这个事件,然后调用ZuulHandlerMapping.setDirty(true);

    所以,RouteLocator的refresh时间不能太长,不然后果很严重
    如果refresh结束之前,dirty值已经被改成false,当时确实更新的route不会生效,但是会在下一个HeartbeatEvent事件发布后生效

    如果,需要在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;
    }

  • zuul是被spring集成在spring-cloud项目下的,一般都会配合eureak使用
    eureka-client包中,在DiscoveryClient初始化的时候,默认会开启一个定时器,每隔30秒发布一个HeartbeatEvent事件,而ZuulRefreshListener会监听这个事件,然后调用ZuulHandlerMapping.setDirty(true);

    所以,RouteLocator的refresh时间不能太长,不然后果很严重
    如果refresh结束之前,dirty值已经被改成false,当时确实更新的route不会生效,但是会在下一个HeartbeatEvent事件发布后生效

    如果,需要在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;
    }

    spring cloud zuul使用记录(2)路由接入流程以及并发刷新问题

    最近在看spring cloud zuul(版本Finchley.SR1)的源代码,一不小心还看到了个bug(我认为是哈),更神奇的是,这个bug一年前已经有人提了issue...