zuul实现动态路由以及相关源码解析
2017-05-22 15:01
579 查看
关于zuul如何实现动态路由,已经有大神写博客详解过,这里不啰嗦了,文章地址:Spring Cloud Zuul实现动态路由,咱们就从这篇文章最后的一个问题讲起,作者在最后实现动态刷新路由规则时说:为什么不自己是手动重新加载Locator.dorefresh?非要用事件去刷新?这牵扯到内部的zuul内部组件的工作流程,不仅仅是Locator本身的一个变量,具体想要了解的还得去看源码。下面我们就来分析下zuul的源码看看为什么要这样做?
要讲清楚zuul的事件驱动模型,还得知道spring的事件驱动模型,因为zuul的实现正是利用了spring的事件驱动模型实现的。下面看看spring提供的事件模型图:
在zuul中有这样一个实现了ApplicationListener的监听器ZuulRefreshListener ,代码如下:
由此可知在发生ContextRefreshedEvent和RoutesRefreshedEvent事件时会执行this.zuulHandlerMapping.setDirty(true);
这样在spring容器启动完成后就刷新了路由规则。因此我们如果要主动刷新路由规则,只需要发布一个RoutesRefreshedEvent事件即可,代码如下
要讲清楚zuul的事件驱动模型,还得知道spring的事件驱动模型,因为zuul的实现正是利用了spring的事件驱动模型实现的。下面看看spring提供的事件模型图:
在zuul中有这样一个实现了ApplicationListener的监听器ZuulRefreshListener ,代码如下:
private static class ZuulRefreshListener implements ApplicationListener<ApplicationEvent> { @Autowired private ZuulHandlerMapping zuulHandlerMapping; private HeartbeatMonitor heartbeatMonitor = new HeartbeatMonitor(); @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextRefreshedEvent || event instanceof RefreshScopeRefreshedEvent || event instanceof RoutesRefreshedEvent) { this.zuulHandlerMapping.setDirty(true); } else if (event instanceof HeartbeatEvent) { if (this.heartbeatMonitor.update(((HeartbeatEvent) event).getValue())) { this.zuulHandlerMapping.setDirty(true); } } } }
由此可知在发生ContextRefreshedEvent和RoutesRefreshedEvent事件时会执行this.zuulHandlerMapping.setDirty(true);
public void setDirty(boolean dirty) { this.dirty = dirty; if (this.routeLocator instanceof RefreshableRouteLocator) { ((RefreshableRouteLocator) this.routeLocator).refresh(); } }
这样在spring容器启动完成后就刷新了路由规则。因此我们如果要主动刷新路由规则,只需要发布一个RoutesRefreshedEvent事件即可,代码如下
public void refreshRoute() { RoutesRefreshedEvent routesRefreshedEvent = new RoutesRefreshedEvent(routeLocator); this.publisher.publishEvent(routesRefreshedEvent); logger.info("刷新了路由规则......"); }
相关文章推荐
- yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源码解析
- Zuul动态路由及动态Filter实现
- spring-boot-starter-zuul实现动态路由和过滤器功能
- 关于JVM中方法调用的相关指令,以及解析(Resolution)和分派(Dispatch)的解释——重载的实现原理与重写的实现原理
- Redis 源码解析 string内部实现原理之简单动态字符串SDS
- ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁
- 利用jquery实现动态表格的相关操作以及列表全选功能
- Spring Cloud Zuul实现动态路由(zuul设计)
- Openstack Cinder中建立volume过程的源码解析(4)----以及taskflow相关解析
- Spring AOP源码解析——AOP动态代理原理和实现方式
- 基于jdk动态代理的实现与源码解析
- Unity Shader:实现菲涅尔+色散效果以及相关原理解析
- 基于cglib实现的动态代理原理与源码解析
- 使用dom4j解析xml文档以及用XPath实现相关的操作
- Openstack Cinder中建立volume过程的源码解析(6)----以及taskflow相关解析
- Java动态代理详解,以及底层JDK源码实现分析(基于Java8)。
- MyBatis源码解析(二)——动态代理实现函数调用
- 利用Spring Cloud Zuul实现动态路由示例代码
- Android Apk资源加载机制源码分析以及资源动态加载实现系列文章