zuul入门

zuul入门

Zuul将外部的请求过程划分为不同的阶段,每个阶段都提供了一系列的过滤器,这些过滤器可以帮助我们实现以下功能:

  • 身份验证和安全性:对需要身份认证的资源进行过滤,拒绝处理不符合身份认证的请求
  • 观察和监控:跟踪重要的数据,展现准确的请求状况
  • 动态路由:将请求动态路由到不同的服务集群
  • 负载分配:设置每种请求的处理能力,删除那些超出限制的请求
  • 静态响应处理:提供一些静态的过滤器,直接响应一些请求,而不将它们转发到集群内部
  • 路由的多样化:除了可以将请求路由到Spring Cloud集群外,还可以将请求路由到其他服务

First Zuul

新建一个Maven项目,first-zuul,其pom依赖为:

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

然后删除src目录,新建两个模块:

  1. first-zuul-server:zuul服务端,作为路由转发用
  2. first-zuul-provider:zuul后端,服务提供方。请求都会通过zuul,转发到provider上

first-zuul-server

pom依赖为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
</dependencies>

httpClient的依赖一定要加,zuul底层需要。

启动类为:

1
2
3
4
5
6
7
8
@EnableZuulProxy
@SpringBootApplication
public class ZuulServer {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulServer.class).properties("server.port=8080").run(args);
}
}

这里,注解@EnableZuulProxy表示开启Zuul的支持

first-zuul-provider

其pom依赖为:

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.12.RELEASE</version>
</dependency>
</dependencies>

启动类和Rest Controller为:

1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootApplication
@RestController
public class BookApplication {
@RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
public String hello(@PathVariable String name) {
return "Hello, " + name;
}

public static void main(String[] args) {
new SpringApplicationBuilder(BookApplication.class).properties("server.port=8090").run(args);
}
}

这里启动了一个Book Service,开放了一个/hello/{name}接口,为了把Book Service相关的接口都转发到provide来,需要在first-zuul-server的resources目录下,添加application.yml配置:

1
2
3
4
zuul:
routes:
books:
url: http://localhost:8090

表示将/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对象中。

参考资料

疯狂Spring Cloud微服务架构实战

0%