1.Zuul四种标准过滤器类型(详细参考https://www.geekdigging.com/2019/08/31/2025584890/)
pre:执行之前
routing:执行阶段
ost:执行之后
error:发生错误时
2.创建TokenFilter类
public class TokenFilter extends ZuulFilter{
//是否需要开始过滤
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
//过滤逻辑代码
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
String token = request.getParameter("token");// 获取请求的参数
if (StringUtils.isNotBlank(token)) {
ctx.setSendZuulResponse(true); //对请求进行路由
ctx.setResponseStatusCode(200);
ctx.set("isSuccess", true);
return null;
} else {
ctx.setSendZuulResponse(false); //不对其进行路由
ctx.setResponseStatusCode(400);
ctx.setResponseBody("token is empty");
ctx.set("isSuccess", false);
return null;
}
}
//pre
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre";
}
//优先级,优先级越大则越晚执行
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
3.启动类添加
//将拦截器加入到拦截请求
@Bean
public TokenFilter tokenFilter() {
return new TokenFilter();
}
至此访问http://localhost:8280/spring-cloud-producer2/hello?name=spring
http://localhost:8280/spring-cloud-producer2/hello?name=spring&token=aa
4.定制熔断器返回内容
(1)创建ProducerFallback implements FallbackProvider
package com.springcloud.zuulsimple;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse;
public class ProducerFallback implements FallbackProvider{
@Override
public String getRoute() {
// TODO Auto-generated method stub
return "spring-cloud-producer2";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return fallbackResponse();
}
public ClientHttpResponse fallbackResponse(){
// TODO Auto-generated method stub
return new ClientHttpResponse() {
}
}
(2)修改eureka项目的application.yml
eureka:
server:
enable-self-preservation: true
(3)关闭producer2再访问http://localhost:8280/spring-cloud-producer2/hello?name=spring&token=aa
(4)eclipse中运行项目访问会直接报错Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Jun 16 00:41:28 CST 2021
There was an unexpected error (type=Internal Server Error, status=500).
GENERAL
5.可能遇到错误
运行euraka项目可能会报错
Attempted to load Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' but snakeyaml was not found on the classpath
解析:这是无法解析yaml文件,是编码出了问题,修改如下