网站建设的知识和技能,磁力离心泵做网站,wordpress主页视频,营销网页 制作一、现象
发布新服务#xff0c;然后在数据库配置了路由#xff0c;使用服务路径访问404。然后重新发布新的服务#xff0c;就可以继续访问得到
#xff08;1#xff09;配置了路由第一次访问 #xff08;2#xff09;重新发布后访问 二、分析
#xff08;1#xf…一、现象
发布新服务然后在数据库配置了路由使用服务路径访问404。然后重新发布新的服务就可以继续访问得到
1配置了路由第一次访问 2重新发布后访问 二、分析
1查找RefreshableRouteLocator .refresh方法
Component
public class NacosRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {public NacosRouteLocator(ServerProperties serverProperties, ZuulProperties properties) {super(serverProperties.getServlet().getContextPath(), properties);}Overridepublic void refresh() {doRefresh();}Overrideprotected MapString, ZuulProperties.ZuulRoute locateRoutes() {//默认从配置文件中加载路由信息//return super.locateRoutes());//定制路由, 可以使用db的配置管理进行路由MapString, ZuulProperties.ZuulRoute routesMap DbUtils.loadRoutes();return routesMap;}}2ZuulHandlerMapping.setDirty方法
public class ZuulHandlerMapping extends AbstractUrlHandlerMapping {public void setDirty(boolean dirty) {this.dirty dirty;if (this.routeLocator instanceof RefreshableRouteLocator) {((RefreshableRouteLocator) this.routeLocator).refresh();}}
}
3ZuulRefreshListener.reset方法
private static class ZuulRefreshListenerimplements ApplicationListenerApplicationEvent {Autowiredprivate ZuulHandlerMapping zuulHandlerMapping;private HeartbeatMonitor heartbeatMonitor new HeartbeatMonitor();Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent|| event instanceof RefreshScopeRefreshedEvent|| event instanceof RoutesRefreshedEvent|| event instanceof InstanceRegisteredEvent) {reset();}else if (event instanceof ParentHeartbeatEvent) {ParentHeartbeatEvent e (ParentHeartbeatEvent) event;resetIfNeeded(e.getValue());}else if (event instanceof HeartbeatEvent) {HeartbeatEvent e (HeartbeatEvent) event;resetIfNeeded(e.getValue());}}private void resetIfNeeded(Object value) {if (this.heartbeatMonitor.update(value)) {reset();}}private void reset() {this.zuulHandlerMapping.setDirty(true);}}
4发现ApplicationEvent Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent|| event instanceof RefreshScopeRefreshedEvent|| event instanceof RoutesRefreshedEvent|| event instanceof InstanceRegisteredEvent) {reset();}else if (event instanceof ParentHeartbeatEvent) {ParentHeartbeatEvent e (ParentHeartbeatEvent) event;resetIfNeeded(e.getValue());}else if (event instanceof HeartbeatEvent) {HeartbeatEvent e (HeartbeatEvent) event;resetIfNeeded(e.getValue());}}
其中的实例注册事件InstanceRegisteredEvent会触发刷新路由。