zuul入门
Zuul将外部的请求过程划分为不同的阶段,每个阶段都提供了一系列的过滤器,这些过滤器可以帮助我们实现以下功能:
- 身份验证和安全性:对需要身份认证的资源进行过滤,拒绝处理不符合身份认证的请求
- 观察和监控:跟踪重要的数据,展现准确的请求状况
- 动态路由:将请求动态路由到不同的服务集群
- 负载分配:设置每种请求的处理能力,删除那些超出限制的请求
- 静态响应处理:提供一些静态的过滤器,直接响应一些请求,而不将它们转发到集群内部
- 路由的多样化:除了可以将请求路由到Spring Cloud集群外,还可以将请求路由到其他服务
First Zuul
新建一个Maven项目,first-zuul,其pom依赖为:
1 | <dependencyManagement> |
然后删除src目录,新建两个模块:
- first-zuul-server:zuul服务端,作为路由转发用
- first-zuul-provider:zuul后端,服务提供方。请求都会通过zuul,转发到provider上
first-zuul-server
pom依赖为:
1 | <dependencies> |
httpClient的依赖一定要加,zuul底层需要。
启动类为:
1 |
|
这里,注解@EnableZuulProxy表示开启Zuul的支持
first-zuul-provider
其pom依赖为:
1 | <dependencies> |
启动类和Rest Controller为:
1 |
|
这里启动了一个Book Service,开放了一个/hello/{name}接口,为了把Book Service相关的接口都转发到provide来,需要在first-zuul-server的resources目录下,添加application.yml配置:
1 | zuul: |
表示将/book/*的请求都转发到localhost:8090地址上
运行
在浏览器中输入地址http://localhost:8080/books/hello/huhansi访问,可以获得如下结果
总结
总调用流程如下图所示:
在上面的项目中,我们使用了@EnableZuulProxy注解。开启该注解后,在Spring容器初始化时,会将Zuul的相关配置初始化,其中包含一个Spring Boot的Bean:ServletRegistrationBean,该类主要用于注册Servlet。Zuul提供了一个ZuulServlet类,在Servlet的service 方法中,执行各种Zuul过滤器(ZuulFilter)。
ZuulServlet的service方法接收到请求后,会执行pre阶段的过滤器,再执行routing阶段的过滤器,最后执行post阶段的过滤器。其中routing阶段的过滤器会将请求转发到“源服务”,源服务可以是第三方的Web服务,也可以是Spring Cloud的集群服务。在执行pre和routing阶段的过滤器时,如果出现异常,则会执行error过滤器。整个过程的HTTP请求、HTTP响应、状态等数据,都会被封装到一个RequestContext对象中。