注:本教程均是参考"程序猿DD"大佬的SpringCloud教程:http://blog.didispace.com/spring-cloud-learning/实践结合自己的理解和总结编写
服务网关:
在SpringCloud学习Day06中讲到服务网关,客户端调用无需要直接与特定微服务打交道,只需要通过统一的网关入口即可访问到。Zuul允许开发者在API网关上通过定义过滤器来实现对请求的拦截与过滤,实现的方法非常简单,我们只需要继承ZuulFilter抽象类并实现它定义的四个抽象函数就可以完成对请求的拦截和过滤了。
Filter实现
1.定义Filter继承自ZuulFilter
public class AccessFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
log.warn("access toke is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
log.info("access token ok");
return null;
}
}
1.filterType:过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为pre,代表会在请求被路由之前执行。
- pre:可以在请求被路由之前调用,可用于做身份验证
- route:在路由请求时候被调用,过滤器用于构建发送给微服务的请求
- post:在route和error过滤器之后被调用
- error:处理请求时发生错误时被调用
2.filterOrder:过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行。
3.shouldFilter:判断该过滤器是否需要被执行。这里我们直接返回了true,因此该过滤器对所有请求都会生效。实际运用中我们可以利用该函数来指定过滤器的有效范围。
4,run:过滤器的具体逻辑。这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以进一步优化我们的返回,比如,通过ctx.setResponseBody(body)对返回body内容进行编辑等。
2.定义Bean
@EnableZuulProxy
@SpringCloudApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ApiGatewayApplication.class).web(true).run(args);
}
@Bean
public AccessFilter accessFilter(){
return new AccessFilter();
}
}
3.测试一下
启动eureka-server、eureka-client、eureka-consumer、api-gateway分别尝试访问
http://localhost:1101/eureka-client/dc?accessToken=12
返回services:[eureka-consumer, eureka-client, api-gateway]
http://localhost:1101/eureka-client/dc
返回401
可以发现只有访问路径包含accessToken=12才能正常响应,说明我们的Filter生效了
通过SpringCloudZuul使用Swagger汇总API接口文档
http://blog.didispace.com/Spring-Cloud-Zuul-use-Swagger-API-doc/