zuul功能
统一接入:智能路由、AB测试、灰度测试、负载均衡、容灾处理、日志埋点
流量监控:限流处理、服务降级
安全防护:鉴权处理、监控、机器网络隔离
1. zuul端点管理
便于直观查看Zuul的路径和微服务的映射。
# 忽略所有的服务
management:
endpoints:
web:
exposure:
include: "*"
2. 不暴露服务接口
zuul:
ignored-services: user-consumer
3. zuul过滤器
(1)过滤类型FilterType,请求的生命期:
PRE类型:过滤器在请求被路由之前调用。
ROUTING类型:过滤器将请求路由到微服务。
POST类型:过滤器在路由到微服务以后执行。
ERROR类型:其他阶段发生错误时执行过滤器。
(2)过滤顺序FilterOrder:
(3)自定义过滤器:
@Component
public class RequestTokenFilter extends ZuulFilter {
private final String REDIS_VAL = "abc123456";
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER;
}
@Override
public boolean shouldFilter() {
RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest req = rc.getRequest();
String token = req.getHeader("token");
if (REDIS_VAL.equalsIgnoreCase(token)) {
return false;
}
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest req = requestContext.getRequest();
String token = req.getHeader("token");
if (!REDIS_VAL.equalsIgnoreCase(token)) {
requestContext.setSendZuulResponse(false);
requestContext.setResponseBody("no token permission");
// 没有访问权限状态码
requestContext.setResponseStatusCode(401);
}
return null;
}
}
(4)禁用过滤器
zuul:
RequestTokenFilter:
pre:
disable: true
4. zuul容错回退
@Component
public class ServiceFallbackProvider implements FallbackProvider {
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.INTERNAL_SERVER_ERROR.value();
}
@Override
public String getStatusText() throws IOException {
return null;
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("当前服务不可用,请稍候再试!".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
return httpHeaders;
}
};
}
}
网友评论