
Zuul网关功能
请求路由、服务路由、请求过滤
请求路由
参数配置如下所示,所有能够配置path规则的请求,都会被zuul网关转发到对应的url上。
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.url=http://178.69.1.39:9104/
服务路由
参数配置如下所示,zuul会对服务user-service进行路由,所有能够配置path规则的请求,都会被zuul网关转发到serivce-id服务上。
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service/**
zuul.routes.user-service.strip-prefix=false
Zuul内置Hystrix和Ribbon
Zuul内置Hystrix和Ribbon模块的依赖,所以zuul天生就拥有线程隔离和断路器的自我保护功能,以及对服务调用的客户端负载均衡功能。
当使用path与url的映射关系来配置路由规则的时候,对于路由转发的请求不会采用hystrixCommand来包装,所以这类请求没有线程隔离和断路器的保护,并且也不会有负载均衡的能力。
因此,在使用zuul的时候尽量使用path和serviceId的组合(也就是服务路由)来进行配置,这样不仅可以保证api网关的健壮和稳定,也能用到ribbon的客户端负载均衡功能。
Zuul配置Hystrix和Ribbon,详情见:
https://www.cnblogs.com/expiator/p/10753746.html
请求过滤ZuulFilter
如果想过滤请求,可以继承ZuulFilter类,重写方法。
/**
*
* Standard types in Zuul are "pre" for pre-routing filtering,
* "route" for routing to an origin, "post" for post-routing filters, "error" for error handling.
*
* 过滤的类型,可以返回"pre"、"route"、"post"、"error"
* filterType() - 按类型对过滤器进行分类。 可以返回用于预路由过滤的“pre”,用于路由到原点的“route”,
* 用于后路由过滤的“post”,用于错误处理的“error”。
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
*
* filterOrder() must also be defined for a filter. Filters may have the same filterOrder if precedence is not
* important for a filter. filterOrders do not need to be sequential.
* 返回数字,表示过滤器执行的顺序。filterOrders返回的结果不需要是连续的顺序,如1,2,3,4。
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否过滤
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的具体逻辑。
* @return
*/
@Override
public Object run() {}
参考资料:
《SpringCloud微服务实战》