文档章节

spring 配置 zuul servlet

OrangeJoke
 OrangeJoke
发布于 03/27 11:37
字数 600
阅读 10
收藏 0

zuul servlet load by spring mvc

需求:

  1. dispatcher 的请求代理至ZuulServlet, 这个设计可配置
  2. 单独/zuul的请求不经过DispatcherServlet.

我们知道zuul的整个处理逻辑在ZuulServlet中实现,但是是怎样在Spring 中和spring DispatcherServlet 一起工作的呢。

zuul config 中会加载如下的servlet:

//  "/"路径下的业务处理
@Bean
public ZuulController zuulController() {
	return new ZuulController();
}

// "/zuul" 路径的servlet处理
@Bean
@ConditionalOnMissingBean(name = "zuulServlet")
public ServletRegistrationBean zuulServlet() {
	ServletRegistrationBean servlet = new ServletRegistrationBean(new ZuulServlet(),
			this.zuulProperties.getServletPattern());
	// The whole point of exposing this servlet is to provide a route that doesn't
	// buffer requests.
	servlet.addInitParameter("buffer-requests", "false");
	return servlet;
}
  1. ServletRegistrationBean 注册ZuulServlet的时候作为urlMapping /zuul, . 即所有来自以/zuul开头的path都会由ZuulServlet处理.

  2. ZuulController 所有进入Zuul的请求的入口都是ZuulController.

  3. ZuulHandlerMapping ZuulController的ZuulHandlerMapping默认把zuul.routes.[ITEM].path的请求交给ZuulServlet处理. 如果找不到对应的path的route, 则会走其他的DispatcherServlet

servlet context

  • Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.
  • There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.)

servlet lifecycle

spring DispatcherServlet design

关于context继承的问题,如下图所示如果应用有文件配置了/WEB-INF/golfing-servlet.xml,那么就会创建一个golfing(servlet name) WebApplicationContext,那么对应的bean会先在这个context里面找,找不到再去root中找。

其中可以自定义扩展可以让所有bean都包含在Root WebApplicationContext中,设置如下:

// This can be configured by setting an empty contextConfigLocation servlet init parameter, as shown below
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
</context-param>

root-context 的创建时机是由ContextLoaderListener加载(servlet 容器 contextInitialized(ServletContextEvent))方法被调用。

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

Dispacher servlet

参考SpringMVC处理流程图

总结:

  1. spring mvc 提供了servlet的很多可扩展性设计同dispacherServlet一同工作,比如 ServletWrappingController,ServletForwardingController
  2. 我们设计一个东西的时候可以不用考虑spring 的东西,都可以很好的整合到里面,这方面的设计包括spring boot的外部化配置。

参考:

https://docs.spring.io/spring/docs/4.3.22.RELEASE/spring-framework-reference/htmlsingle/#mvc

https://github.com/Netflix/zuul/wiki/How-it-Works

https://www.cnblogs.com/zhangminghui/p/4922306.html

© 著作权归作者所有

OrangeJoke
粉丝 40
博文 57
码字总数 39185
作品 0
江北
高级程序员
私信 提问
SpringCloud 之 Zuul源代码初识

Zuul 介绍 Zuul 处理 Http 请求都是基于 SpringMVC 上的,细心的你一定注意到了,当你搭建了一个zuul后配置后端隐射请求 /apps/ 到你的后端服务时,无论 /apps/ 还是 /zuul/apps/** 都能到达...

alexqdjay
2018/04/27
119
0
No mapping found for HTTP request with URI [/demo/WEB-INF/view/index.html] in DispatcherServlet with name 'SpringMVC'

错误:[org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/demo/WEB-INF/view/index.html] in DispatcherServlet with name 'SpringMVC' web.......

mhi
03/06
908
2
Spring管理filter和servlet

在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建。如果要在filter或者servlet中使用spring容器管理业务对象,通常...

加油_张
2013/04/25
495
1
Spring3中js/css/jpg/gif等静态资源无法找到

最近项目中使用到Spring3,在感叹Spring3注解配置清爽的同时竟然出现了这个不和谐的事情,实在无法忍受 问 题:部署项目后程序加载或用浏览器访问时出现类似的警告,2011-01-19 10:52:51,646...

零度的魚
2014/02/19
116
0
springmvc不能拦截到.jsp后缀的文件吗

在web.xml里的springmvc前端控制器. 如果配置*.do的话, springmvc只会解析.do结尾的路径去映射和适配controller中的方法, 而直接访问.jsp后缀(包括图片.js等静态资源)的页面会正常显示,所以拦...

初来乍到_
2016/11/29
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Stream Api 中的 skip 和 limit 操作

1. 前言 Java 8 Stream API 中的skip()和limit()方法具有类似的作用。它们都是对流进行裁剪的中间方法。今天我们来探讨一下这两个方法。 2. skip() skip(lang n) 是一个跳过前 n 个元素的...

码农小胖哥
32分钟前
1
0
看中华小当家第二集片段记录

最近正好在学习做饭,看看这片子,燃烧燃烧做饭的热情 哈哈,以下是摘的一些句子和个人理解 My name is Liu Mao Xing . More commonly known as Mao. 个人理解:我的名字叫 刘昴星, (commo...

T型人才追梦者
37分钟前
3
0
Python基础-6

1、注释 # 单行注释'''多行注释'''"""多行注释"""# 中文编码声明注释 ,在文件开头加上下面这行注释# encoding=utf-8或者# -*- encoding:utf-8 -*- (-*- 只是为了美观,没有实际......

zfskkk
37分钟前
5
0
我的这半年 / 2018 七夕著

浑然不觉,竟已至七夕, 今年已经过了一半 , 突然想给自己记录点什么 , 回顾下我的2018, 我的这上半年. 2018的第一件记事得从一月份下旬的那场大雪说起 , 一觉醒来 , 窗外整个银装素裹 , 在此之...

gxLong
42分钟前
3
0
NSS支持的数据库

NSS,简写自Name Service Switch。我把它译为“名字服务中心”。 在*nix操作系统中,NSS是C语言库(Library C或者glibc)的一部分,用以寻找名字。比如说,我们运行ls -lh查看一个目录中的文...

大别阿郎
58分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部