springcloud中zuul网关服务
一、配置
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
1.验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
2.审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
3.动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
4.压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
5.负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
6.静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
7.多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
二、配置路由规则
zuul: routes: # 给服务配置路由 cloud-feign: path: /feign/**
默认路由规则
Zuul和Eureka结合使用,可以实现路由的自动配置,自动配置的路由以服务名称为匹配路径,相当于如下配置:
# 默认路由规则 zuul: routes: # 给服务配置路由 cloud-feign: path: /cloud-feign/**
去掉默认路由规则
zuul: #关闭默认路由配置 ignored-services: cloud-feign
配置访问前缀
zuul:
#不能用/zuul
prefix: /proxy
Header过滤及重定向添加Host
zuul: #配置过滤敏感的请求头信息,设置为空就不会过滤 sensitive-headers: Cookie,Set-Cookie,Authorization #设置为true重定向是会添加host请求头 add-host-header: true
三、过滤器
过滤器类型:
pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;
routing:在请求被路由到目标服务时执行,这是使用Apache HttpClient或Netflix Ribbon构建和发送原始HTTP请求的地方;
post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;
error:请求在其他阶段发生错误时执行。
自定义过滤器
/** * @auther: mufeng * @Date: 2019/11/26 16:25 */ @Slf4j public class AccessFilter extends ZuulFilter { /** * 过滤器类型,有pre、routing、post、error四种。 * @return */ @Override public String filterType() { return "pre"; } /** * 过滤器执行顺序,数值越小优先级越高。 * @return */ @Override public int filterOrder() { return 0; } /** * 是否进行过滤,返回true会执行过滤。 * @return */ @Override public boolean shouldFilter() { return true; } /** * 自定义的过滤器逻辑,当shouldFilter()返回true时会执行 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); log.info("send {} request to {}",request.getMethod(),request.getRequestURL().toString()); String token = request.getParameter("at"); if(1==2){ log.warn("access token is empty"); currentContext.setSendZuulResponse(false); currentContext.setResponseStatusCode(401); return null; } log.info("access token ok"); return null; } }
核心过滤器
过滤器名称 | 过滤类型 | 优先级 | 过滤器的作用 |
ServletDetectionFilter | pre | -3 | 检测当前请求是通过DispatcherServlet处理运行的还是ZuulServlet运行处理的。 |
Servlet30WrapperFilter | pre | -2 | 对原始的HttpServletRequest进行包装。 |
FormBodyWrapperFilter | pre | -1 | 将Content-Type为application/x-www-form-urlencoded或multipart/form-data的请求包装成FormBodyRequestWrapper对象。 |
DebugFilter | route | 1 | 根据zuul.debug.request的配置来决定是否打印debug日志。 |
PreDecorationFilter | route | 5 | 对当前请求进行预处理以便执行后续操作。 |
RibbonRoutingFilter | route | 10 | 通过Ribbon和Hystrix来向服务实例发起请求,并将请求结果进行返回。 |
SimpleHostRoutingFilter | route | 100 | 只对请求上下文中有routeHost参数的进行处理,直接使用HttpClient向routeHost对应的物理地址进行转发。 |
SendForwardFilter | route | 500 | 只对请求上下文中有forward.to参数的进行处理,进行本地跳转。 |
SendErrorFilter | post | 0 | 当其他过滤器内部发生异常时的会由它来进行处理,产生错误响应。 |
SendResponseFilter | post | 1000 | 利用请求上下文的响应信息来组织请求成功的响应内容。 |
禁用过滤器:
zuul: filterClassName: filter: disable: true
禁用PreLogFilter的示例配置
zuul: PreLogFilter: pre: disable: true