简介
Zuul 是 Netflix 提供的一个开源的 API 网关服务器, SpringCloud 对 Zuul 进行了整合和增强. 服务网关 Zuul 聚合了所有微服务接口, 并统一对外暴露, 外部客户端只需与服务网关交互即可. 相对于内部服务而言, 能够防止其被外部客户端直接访问而暴露服务的敏感信息, 起到了保护作用. 除此之外, Zuul 还可以实现身份认证, 数据监控, 动态路由等功能.
项目介绍
sc-parent, 父模块(请参照 SpringCloud 学习笔记(1):Eureka 注册中心 https://www.cnblogs.com/seve/p/11502579.html )
sc-eureka, 注册中心(请参照 SpringCloud 学习笔记(1):Eureka 注册中心 https://www.cnblogs.com/seve/p/11502579.html )
sc-provider, 提供者(请参照 SpringCloud 学习笔记(1):Eureka 注册中心 https://www.cnblogs.com/seve/p/11502579.html )
sc-gateway, 服务网关
使用 Zuul 构建服务网关
1. 在父模块下创建子模块项目 sc-gateway,pom.xml:
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.cf</groupId>
- <artifactId>sc-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
- <artifactId>sc-gateway</artifactId>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
- </dependency>
- </dependencies>
- </project>
2. 创建启动类 gateway.GatewayApplication:
- package gateway;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
- @SpringBootApplication
- @EnableZuulProxy
- public class GatewayApplication {
- public static void main(String[] args) {
- SpringApplication.run(GatewayApplication.class, args);
- }
- }
@EnableZuulProxyh 和 @EnableZuulServer:
@EnableZuulProxy 是 @EnableZuulServer 的超集,@EnableZuulProxy 包含 @EnableZuulServer 导入的所有过滤器.
@EnableZuulProxy 使用反向代理,@EnableZuulServer 不使用任何代理.
3. 创建 application.YAML:
- server:
- port: 8088
- spring:
- application:
- name: sc-gateway
- eureka:
- client:
- serviceUrl:
- defaultZone: http://localhost:8080/eureka/
- zuul:
- routes:
- sc-provider: /sp/** #将 serviceId 为 sc-provider 的服务映射到 / sp/** 路径
- 4. 测试
- 依次启动注册中心 sc-eureka, 提供者 sc-provider, 网关 sc-gateway, 以下是通过 Zuul 访问提供者和直接访问提供者的结果:
- 其他常用配置
- 1. 忽略指定服务
- zuul:
- ignored-services: serviceId1,serviceId2 #忽略服务 serviceId1,serviceId2
- 2. 忽略所有服务, 只代理指定的服务
- zuul:
- ignored-services: '*' #* 为忽略所有服务, 只代理 sc-provider 服务
- routes:
- sc-provider: /sp/**
- 3. 指定访问路径前缀, 设置之后只能通过带前缀访问
- zuul:
- prefix: /yc
- routes:
- sc-provider: /sp/**
- 4. 指定服务的 url
- zuul:
- routes:
- sc-provider:
- path: /sp/**
- url: http://localhost:8081 #指定服务 sc-provider 的 url, 不从 Eureka 注册中心获取.
- 这种配置方式不会作为 HystrixCommand 执行, 也不会使用 Ribbon 来平衡多个 url 的负载. 要实现这些目标, 可以使用静态服务器列表 (listOfServers) 或者指定 serviceId.
- 5. 指定敏感 Header, 防止敏感 Header 外泄
- zuul:
- routes:
- sc-provider:
- path: /sp/**
- sensitiveHeaders: Cookie,Set-Cookie,Authorization #将会覆盖全局 zuul.sensitiveHeaders 的值
- url: http://localhost:8081
- 如果要设置全局的敏感 Header 可以设置 zuul.sensitiveHeaders 的值. Cookie,Set-Cookie,Authorization 为 sensitiveHeaders 的默认值, 如果不想设置敏感 header, 可以把 sensitiveHeaders 设置成空列表:
- zuul:
- routes:
- sc-provider:
- path: /sp/**
- sensitiveHeaders:
- url: http://localhost:8081
- 6. 忽略 Header
- zuul:
- ignoredHeaders: Header1, Header2 #Header1 和 Header2 将不会传播到其他的微服务中
- Zuul 的路由端点
- 当 @EnableZuulProxy 和 Spring Boot Actuator 配合使用时, Zuul 会暴露一个路由管理端点 / routes, 通过这个路由端点可以查看到 Zuul 当前映射的路由列表信息.
- 1. 修改 sc-gateway 的 pom.xml, 新增 Spring Boot Actuator 依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- 2. 修改 sc-gateway 的 application.YAML, 开启 / routes 端点的访问:
- management:
- endpoints:
- web:
- exposure:
- include: 'routes'
- 3. 访问 / routes 端点
- 依次启动注册中心 sc-eureka, 提供者 sc-provider, 网关 sc-gateway, 然后访问 http://localhost:8088/actuator/routes/details, 显示路由列表信息如下:
- Zuul 过滤器
- Zuul 的核心是一系列过滤器, 它们能够在 HTTP 请求和响应路由期间执行一系列操作. Zuul 提供了一个框架来动态读取, 编译和运行这些过滤器, 过滤器之间不直接通信, 它们通过对每个请求惟一的 RequestContext 共享数据.
- 1.Zuul 过滤器类型
- PRE Filters: 在请求路由到具体的服务之前执行.
- ROUTING Filters: 用于将请求路由到微服务.
- POST Filters: 在请求路由到微服务之后执行.
- ERROR Filters: 在其他阶段发生错误时执行.
- 2.Zuul 过滤器特性
- Type:Zuul 过滤器的类型, 决定过滤器在请求的哪个阶段起作用.
- Execution Order: 规定过滤器的执行顺序, 值越小, 越先执行.
- Criteria:Filter 执行所需的条件.
- Action: 如果满足条件, 则执行的操作.
- 3.Zuul 请求生命周期图
- 4. 自定义 Zuul 过滤器
- 新建类 gateway.filter.MyZuulFilter:
- package gateway.filter;
- import javax.servlet.http.HttpServletRequest;
- import com.netflix.zuul.ZuulFilter;
- import com.netflix.zuul.context.RequestContext;
- import com.netflix.zuul.exception.ZuulException;
- public class MyZuulFilter extends ZuulFilter{
- /**
- * 具体执行逻辑
- */
- @Override
- public Object run() throws ZuulException {
- RequestContext ctx = RequestContext.getCurrentContext();
- HttpServletRequest request = ctx.getRequest();
- if (request.getParameter("name") != null) {
- System.out.println("你好," + request.getParameter("name"));
- }
- return null;
- }
- /**
- * 判断你该过滤器是否要执行
- */
- @Override
- public boolean shouldFilter() {
- return true;
- }
- /**
- * 过滤器执行顺序
- */
- @Override
- public int filterOrder() {
- return 1;
- }
- /**
- * 过滤器类型
- */
- @Override
- public String filterType() {
- return "pre";
- }
- }
启动类 GatewayApplication 中添加配置:
- @Bean
- public MyZuulFilter MyZuulFilter(){
- return new MyZuulFilter();
- }
依次启动注册中心 sc-eureka, 提供者 sc-provider, 网关 sc-gateway, 然后访问 http://localhost:8088/sp/book/list?name = 小明, MyZuulFilter 过滤器将会执行, 控制台输出: 你好, 小明.
SpringCloud 学习笔记(6): 使用 Zuul 构建服务网关
来源: http://www.bubuko.com/infodetail-3204735.html