持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
14、Zuul框架介绍使用
1、关于Zuul
Spring Cloud 集群提供了多个组件,用于进行集群内部的通信,例如服务管理组件 Eureka ,负载均衡组件 Ribbon 。如果集群提供了 API 或者 Web 服务,需要与外部进行通信,比较好的方式是添加一个网关,将集群的服务都隐藏到网关后面。 这种做法对于外部客户端来说。 无须关心集群的内部结构,只需关心网关的配置等信息:对于 Spring Cloud 集群来说, 不必过多暴露服务 提升了集群的安全性。 代理层作为应用集群的大门,在技术选取上尤为重要,很多传统的解决方案,在软件 上选择了 Nginx 、Apache 等服务器。 Netflix 提供了自己的解决方案: Zuul。 Zuul是 Netflix的一个子项目 Spring Cloud将 Zuul 进行了进一步的实现与封装,将其整合到 spring-netflix项目中,为微服务集群提供代理、过滤、路由等功能。
2、Zull的功能
Zuul 将外部的请求过程划分为不同的阶段,每个阶段都提供了一系列过滤器, 这些过 滤器可以帮助我们实现以下功能。
- 身份验证和安全性: 对需要身份认证的资源进行过滤,拒绝处理不符合身份认证的请求。
- 观察和监控: 跟踪重要的数据, 为我们展示准确的请求状况。
- 动态路由: 将请求动态路由到不同的服务集群。
- 负载分配: 设置每种请求的处理能力,删除那些超出限制的请求。
- 静态晌应处理: 提供一些静态的过滤器,直接响应一些请求,而不将它们转发到集群内部。
- 路由的多样化: 除了可以将请求路由到 Spring Cloud 集群外,还可以将请求路由到其他服务。
Web项目整合Zuul
新建一个 gateway-router 的 web项目,依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
记录一次错误
NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.([Ljava/lang/Object;)V
由于Spring Boot 和Spring Cloud版本不兼容,解决方案,Spring Boot 由 2.1.1 改为 1.5.12 spring-cloud-starter-netflix-zuul 由 1.4.4改为 1.4.0
另一个问题: -- 此问题只是针对本小节 波波用的是这个 spring-cloud-starter-netflix-zuul 书上是 spring-cloud-starter-zuul -- 这个出错
启动类上添加 @EnableZuulProxy
@SpringBootApplication
@EnableZuulProxy
public class SrlGatewayRouterApplication {
public static void main(String[] args) {
SpringApplication.run(SrlGatewayRouterApplication.class, args);
}
}
提供一个端口 为 8888 的hello服务,沿用以前的服务 ,返回 Hello World。
修改配置文件:添加配置
zuul.routes.books.url=http://localhost:8888
加入以上配置后,发送给 http ://localhost: 8080/books 的所有请求会被转发到 8888 口, 也就是访问 gateway-router 项目,实际上最终会调用 8888 的服务。启动两个应用, 在浏览器中输入地址 http ://localhost: 8080/books/hello ,可以看到浏览器输出Hello World。
例如:http://localhost:8080/books/hello 请求会转发到:http://localhost:8888/hello
过滤器运行机制
在前面的路由项目中,我们使用了@EnableZuulProxy 注解。开启该注解后,在 Spring 容器初始化时,会将 Zuul 的相关配置初始化,其中包含一个 Spring Boot 的 Bean: ServletRegistrationBean, 该类主要用于注册 Servlet。 Zuul 提供了一个 ZuulServlet 类,在Servlet service 方法中,执行各种 Zuul 过滤器( ZuulFilter)。下图 所示为 HTTP 请求在ZuulServlet 中的生命周期。 ZuulServlet的 service 方法接收到请求后,会执行 pre 阶段的过滤器,再执行 routing 阶段的过滤器,最后执行 post 阶段的过滤器。其中 routing 阶段的过滤器会将请求转发到“源服务”,源服务可以是第三方的 Web 服务,也可以是 Spring Cloud 的集群服务。在执行 pre和routing 阶段的过滤器时,如果出现异常,则会执行 error 过滤器。整个过程的 HTTP 请求、 响应、状态等数据,都会被封装到一个 RequestContext 对象中,这将在后面章节中讲述。 大致了解了 Zuul 的运行机制后,下面开始讲解如何在 Spring Cloud 中使用 Zuul。