部署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】方法。