• 部署eureka集群时defaultZone中为什么必须包含路径/eureka


    1、这是因为在eureka server的实现中存在一个web请求过滤器,其url模式就是【/eureka/*】。注意这不并是过滤应用的上下文路径,而是过滤剩下的请求路径,所以即使将【server.context-path】设置为【/eureka】,各个节点之间还是无法连通,只有将defaultZone设置为【http://eureka00.com/eureka/eureka】才行。

    2、eureka集群的各个节点是通过一系列接口进行通信的。

     3、但【spring-cloud-netflix-eureka-server】包中存在下图的【spring.factories】文件,根据SpringBoot加载规则,在应用启动时会加载配置类【EurekaServerAutoConfiguration】。

     4、在该配置类中先通过方法【jerseyApplication】收集被【Path】和【Provider】注释的资源类,然后在方法【jerseyFilterRegistration】中将资源类放入到过滤器【ServletContainer】中,再生成一个包含【径滤过滤】的注册类【FilterRegistrationBean】,随后SpringBoot会将该过滤器加入对web请求的过滤器链中。

     5、该过滤器的url过滤模式为常量【DEFAULT_PREFIX】即“/eureka”。

    6、SpringBoot执行配置过滤器注册Bean。

     7、tomcat将其加入到自己上下文过滤器集合中。

     8、tomcat在处理请求是将通过方法【createFilterChain】建立过滤器链,对于不符合url模式的请求将跳过前面提到的包含接口资源类的过滤器容器【ServletContainer】。

     9、在tomcat过滤器链【ApplicationFilterChain】的方法【internalDoFilter】中,对于非/eureka请求,比如/eureka1/apps请求,由于没有没有匹配其url模式的接口资源类,所以被当做普通静态资源的请求,由于也没有对应的资源,所以返回【404】错误。

    10、关于tomcat的过滤器链。

      由于采取了职责链设计模式,将由总链【ApplicationFilterChain】开始执行各个子过滤器,由于子过滤器持有对总链的引用,所以子过滤器执行完毕后,继续执行后续的子过滤器。当总链上的所有子过滤器都执行完毕后,将会执行【servlet instance】的方法【service】,即作为静态资源请求处理。但如果子过滤器执行完毕后不再调用总链的方法【doFilter】,则总链的子过滤器调用将中断,也意味着总链的调用完成。

    11、关于接口资源类的过滤器容器【ServletContainer】。

      在执行该容器的过滤方法【doFilter】时,如果它配置了静态资源的url模式且当前请求正好符合,则通过方法【chain.doFilter】继续回到总链执行后续子过滤器。

       当请求不符合静态资源的url模式模式时,将通过方法【service】找到请求路径在接口资源类中对应的方法并执行,执行完成后将不再执行总链的【doFilter】方法即终止执行总链的后续子过滤器。如果在接口资源类中未找到对应的方法,则返回的【status】为404,如果【forwardOn404】为true则还需要继续执行总链的【chain.doFilter】方法。

     

  • 相关阅读:
    bzoj 3155: Preprefix sum
    bzoj 1854: [Scoi2010]游戏
    UVA1608 不无聊的序列 Non-boring sequences
    UVA1747 【Swap Space】
    Luogu P5550 Chino的数列
    bzoj 1799: [Ahoi2009]self 同类分布
    bzoj 1054: [HAOI2008]移动玩具
    MATLAB工具箱,应用程序,软件和资源的精选清单
    论文格式排版Issue及解决办法
    《将博客搬至CSDN》
  • 原文地址:https://www.cnblogs.com/StarkBrothers/p/11974026.html
Copyright © 2020-2023  润新知