文档章节

SpringCloud 之 Zuul源代码初识

alexqdjay
 alexqdjay
发布于 2018/04/27 22:44
字数 538
阅读 122
收藏 5

Zuul 介绍

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

那么这到达是如何实现的呢?

ZuulServlet

Zuul 有一个自制的 Servlet -- ZuulServlet, 它包含了 Zuul 所有的处理流程的主干支,这里不详细介绍,以后会篇章会详细介绍 Zuul 的处理流程。

SpringBoot 有个 ServletRegistrationBean 是专门用来注册自定义 Servlet 的。

    public ServletRegistrationBean zuulServlet() {
		ServletRegistrationBean servlet = new ServletRegistrationBean(new ZuulServlet(),
				this.zuulProperties.getServletPattern());
		servlet.addInitParameter("buffer-requests", "false");
		return servlet;
	}

这里还有一个定义路基path 的使用,默认是 /zuul,你可以通过配置文件定义成其他,如下就改成 /api 了

zuul.servletPath=/api

如果没有使用 SpringBoot 的话,那么其实老办法只要将 ZuulServlet 配置在 web.xml 中即可,路径也是 web.xml 中配置。

ZuulHandlerMapping

来看下这个是哪门哪派的。

RequestMappingHandlerMapping 不会陌生,SpringMVC默认使用的就是这个,它会捕捉所有 @Controller@RequetMapping 注解的方法来处理不同的URL。

SpringMVC3.1之前其实不是使用上面这个类,而是使用 AbstractUrlHandlerMapping  的派系 -- DefaultAnnotationHandlerMapping,这个类可是 ZuulHandlerMapping 一个派系的,都是根据 URL 来选择使用使用什么来处理。

那到底用什么来处理呢?ZuulHandlerMappingregisterHandlers 方法回答了这个问题

	private void registerHandlers() {
		Collection<Route> routes = this.routeLocator.getRoutes();
		if (routes.isEmpty()) {
			this.logger.warn("No routes found from RouteLocator");
		}
		else {
			for (Route route : routes) {
				registerHandler(route.getFullPath(), this.zuul);
			}
		}
	}

this.zuul 是什么? ZuulController

public class ZuulController extends ServletWrappingController

原来是 Servlet 包装成 Controller, 其实还是 ZuulServlet

public class ZuulController extends ServletWrappingController {

	public ZuulController() {
		setServletClass(ZuulServlet.class); // <<======= See Here!
		setServletName("zuul");
		setSupportedMethods((String[]) null); // Allow all
	}

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		try {
			return super.handleRequestInternal(request, response);
		}
		finally {
			RequestContext.getCurrentContext().unset();
		}
	}

}

小结:

Zuul 的 Request 怎么进来的到这已经清楚了,下面分析进来以后发生了什么。

详细代码解析见 SpringCloud 之 Zuul 源代码详细笔记

© 著作权归作者所有

alexqdjay
粉丝 35
博文 26
码字总数 31560
作品 0
浦东
高级程序员
私信 提问
SpringCloud微服务入门

SpringCloud微服务入门 初识SpringCloud Eureka注册中心 HelloWorld 1.初识SpringCloud 1.1 简介 : springCloud是基于SpringBoot的一整套实现微服务的框架。因为它不是一个组件,而是许多组件...

全世界最好的肥猪精
2018/12/03
0
0
史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0
springcloud eureka 服务注册中心

------------------------------------------------------------------------------------------------------------ springcloud (零) springboot 基础 下载 springcloud (一)服务注册中心 ......

curiousby
2017/02/08
0
0
springcloud 服务网关 gateway zuul

------------------------------------------------------------------------------------------------------------ springcloud (零) springboot 基础 下载 springcloud (一)服务注册中心 ......

curiousby
2017/02/17
0
0
springcloud 客户端负载均衡 ribbon

------------------------------------------------------------------------------------------------------------ springcloud (零) springboot 基础 下载 springcloud (一)服务注册中心 ......

curiousby
2017/02/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 运行时获取方法参数名

本文整理 Java 运行时获取方法参数名的两种方法,Java 8 的最新的方法和 Java 8 之前的方法。 Java 8 的新特性 翻阅 Java 8 的新特性,可以看到有这么一条“JEP 118: Access to Parameter Na...

xiaomin0322
15分钟前
3
0
varchar和nvarchar有什么区别?

只是nvarchar支持多字节字符吗? 如果是这种情况,除了存储问题之外,使用varchars什么意义吗? #1楼 nVarchar将帮助您存储Unicode字符。 如果要存储本地化数据,这是可行的方法。 #2楼 nvar...

javail
18分钟前
3
0
如何通过curl调用使用HTTP请求发送标头?

我希望在Linux机器上向我的Apache服务器发送一个标头。 如何通过卷曲调用实现此目的? #1楼 得到: 使用JSON: curl -i -H "Accept: application/json" -H "Content-Type: application/json......

技术盛宴
34分钟前
4
0
SQL语句的执行过程

(一)架构组件 (二)执行流程

麦馍
39分钟前
4
0
如何快速核对Excel数据表?这样操作不同的数据一目了然

怎么快速的核对两个Excel数据表呢?组长给了同事两份报表让他在半小时内核对完毕,不同的地方要标记起来,这时候同事抱怨起来:“数据那么多半小时怎么够呢”?虽然嘴上在抱怨,但是他还是乖...

百因必有果
45分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部