SpringCloud Zuul网关的简单理解

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() {}

示例代码如下:
https://github.com/firefoxer1992/SpringCloudProject/blob/master/zuul/src/main/java/com/example/demo/filter/AccessFilter.java

参考资料:

《SpringCloud微服务实战》

原文地址:https://www.cnblogs.com/expiator/p/10778213.html