Zuul 是 Netflix 公司提供的一种网关服务。

zuul 的功能:

  1. 权限控制,可以做认证和授权
  2. 监控
  3. 动态路由
  4. 负载均衡
  5. 静态资源处理

Zuul 中的功能基本上都是基于过滤器来实现的,它的过滤器有几种不同的类型:

  • PRE
  • ROUTING
  • POST
  • ERROR

Hello,Zuul

  • 首先创建一个 spring boot 项目,添加 zuul 依赖。
  • 在 application.yml 中配置,注册到 eureka 中。
  • 在启动类上添加启动注解 @EnableZuulProxy // 开启网关代理。
  • 启动 eureka,provider,zuul 服务
  • 请求代理测试访问:localhost:2020/provider/hello,在这个地址中,provider 就是要访问的服务名称,/hello 就是访问的服务接口。

zuul 路由规则自定义

1
2
3
4
5
6
## 自定义 zuul 路由规则
zuul:
routes:
sihai-a:
path: /sihai-a/**
service-id: provider

上面这个配置,表示 /sihai-a/**,满足这个匹配规则的请求,将被转发到 provider 实例上。

简化配置方案:

1
2
3
4
5
## 自定义 zuul 路由规则
zuul:
routes:
## 简化访问规则
provider: /sihai-a/**

zuul 请求过滤

对于来自客户端的请求,我们可以在 zuul 中进行预处理,例如权限判断等。

定义一个简单的权限过滤器 /PermissFilter

重启项目后,接下来发送请求必须带上 username 和 password 参数,否则请求会被过滤器拦截,参数必须要和定义的相同才可以访问。

正常访问: localhost:2020/sihai-a/hello?username=sihai&password=root

非法访问: localhost:2020/sihai-a/hello?username=sihaisihai&password=rootroot


zuul 的其他配置

匹配规则

例如有两个服务,一个叫 consumer,另外一个叫 consumer-hello,同时在做路由规则设置的时候,如果出现了如下配置:

1
2
3
4
5
6
## 自定义 zuul 路由规则
zuul:
routes:
## 简化访问规则
consumer: /consumer/**
consumer-hello: /consumer/hello/**

那么此刻如果访问如下地址:http://localhost:2020/consumer/hello/123 ,会出现冲突情况。实际上,这个地址是希望和 consumer-hello 这个服务匹配上的,那么这个时候,只需要将配置文件改为 yml 格式就可以了。因为 properties 格式是无序的,而 yml 格式是有序的。


忽略路径

默认情况下,zuul 注册到 eureka 上之后,eureka 上的所有注册服务都会被自动代理。如果不希望给某一个服务做代理,可以忽略该服务。配置如下:

1
2
3
zuul:
## 忽略路径
ignored-services: provider

上面这个配置表示忽略 provider 服务,此时就不会自动代理 provider 服务了。

也可以忽略某一类地址:

1
2
3
zuul:
## 忽略包含 hello 的地址
ignored-patterns: /**/hello/**

上面配置表示请求路径中如果包含 hello,则不做代理。


请求前缀

也可以给路由添加请求前缀

1
2
zuul:
prefix: /sihai

这样,以后所有的请求地址自动多了前缀 /sihai