简介:
是Netflix的一个子项目
提供代理,过滤,路由等功能
1、引入依赖
<dependency>
<!--zuul 网关依赖-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
2、配置文件配置转发规则
server:
port:9000
zuul:
routes:
source: #source只是一个路由的名称,可以任意改变名称
#配置的时候省略path,source就充当path
url: http://localhost:8080
3、启动
@SpringBootApplication
@EnableZuulProxy //开启zuul网关代理
public class ApiGateWayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGateWayApplication.class, args);
}
}
4、访问localhost:9000/source/hello/ 接口,路由会将它转发到8080的服务去执行。
zuul配置所有的请求转发
server:
port:9000
zuul:
routes:
sale: #sale只是一个路由的名称,可以任意改变名称
path: /sale/** #外部请求所有的source路径都会转发到下面的serviceId进行处理进行处理
serviceId: sale-service
简单路由(HostRoutingFilter):
zuul:
routes:
routeTest:
path:/routeTest/163
url:http://www.163.com #简单路由是url,格式是以http或者https开头的
配置http连接池:
zuul:
host:
#目标主机的最大连接数,默认值是200,配置该项,相当于调用
#PoolingHttpClientConnectionManager 的setMaxTotal方法
max-total-connections: 200
#每个主机的初始连接数,默认值是20,配置该项,相当于调用
@PoolingHttpClientConnectionManager的setDefaultMaxPerRoute方法。
max-per-route-connections: 20
跳转路由(SendForwardFilter):使用forward:
server:
port:9000
zuul:
routes:
testForward:
path: /fo/** #外部请求所有的fo路径都会转发到下面的serviceId进行处理进行处理
# /receive是服务内的一个地址
#跳转路由以forward:开头
url: forward: /receive
Ribbon路由: serviceId
zuul:
routes:
sale: #routerid,随便起名字
path: /sale/**
serviceId: zuul-sale-service
================分割线,上线两种方式效果一下====================
zuul:
routes:
zuul-sale-service: #如果不提供serviceId,默认将routerId作为serviceId
path: /sale/**
================分割线====================
zuul:
routes:
sale: #routerid,随便起名字
path: /sale/**
#如果url的格式既不是简单路由格式,也不是跳转路由格式,那么它会被当成serviceId进行处理
url: zuul-sale-service
自定义路由规则(PatternServiceRouteMappper)
@Configuration
public class MyConfig{
//访问网关的/XXXXXX/**,将被转发的zuul-xxxxx-service服务进行处理
@Bean
public PatternServiceRouteMapper patternServiceRouteMapper(){
// return new PatternServiceRouteMapper(
// "(zuul)-(?<module>.+)-(serivce)","${module}/**");
//sale的任何请求都会被spring-zuul-sale-service的服务id处理。
//<module>是后面的sale值
return new PatternServiceRouteMapper(
"(spring)-(zuul)-(?<module>.+)-(serivce)","${sale}/**");
}
}
排除一个服务或者多个服务不被路由到,可以使用:
zuul:
ignoredPatterns: /sale/noRoute #忽略/sale/noRoute路径,不会被路由到
ignoreServices: zuul-sale-service,zuul-order-service #忽略这些服务
#(全局配置)sensitiveHeaders会过滤客户端附带的headers
#也可以通过在router内进行配置
sensitiveHeaders: accept-language,cookie
#会过滤服务之间通信附带的headers
ignoreHeaders: accept-language,cookie
============局部配置=====
zuul:
routes:
users:
path: /myusers/**
sensitiveHeaders: Cookie,Set-Cookie,Authorization
url: https://downstream
sensitiveHeaders会过滤客户端附带的headers
敏感headers支持全局设置 zuul.sensitiveHeaders. 如果在单个路由中设置 sensitiveHeaders 会覆盖全局 sensitiveHeaders 设置.
例如:
sensitiveHeaders: X-ABC
如果客户端在发请求是带了X-ABC,那么X-ABC不会传递给下游服务
ignoredHeaders会过滤服务之间通信附带的headers
例如:
ignoredHeaders: X-ABC
如果客户端在发请求是带了X-ABC,那么X-ABC依然会传递给下游服务。但是如果下游服务再转发就会被过滤
还有一种情况就是客户端带了X-ABC,在ZUUL的Filter中又addZuulRequestHeader("X-ABC", "new"),
那么客户端的X-ABC将会被覆盖,此时不需要sensitiveHeaders。如果设置了sensitiveHeaders: X-ABC,那么Filter中设置的X-ABC依然不会被过滤。
路由端点
加人Actuator依赖,并且将安全认证managementsecurity设置为false关闭
配置中配置: management.security.enabled =false;
然后访问zuul的地址+/routes localhost:9000/routes 查看监测的端点
功能进阶
过滤器优先级
routing过滤器负责路由
@EnableZuulServer和@EnableZuulProxy区别
@EnableZuulServer(不具备简单路由和Ribbon路由的能力):不支持图中灰色的过滤器,如下: