本案例源码获得地址
SpringCloudDemo
在Zuul上配置熔断器
ZuulFallbackProvider.java
public interface ZuulFallbackProvider {
String getRoute();
ClientHttpResponse fallbackResponse(String var1, Throwable var2);
}
MyFallbackProvider.java
@Component
class MyFallbackProvider implements ZuulFallbackProvider {
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse(String var1, Throwable var2) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "OK";
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("error,fallback!".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
return headers;
}
};
}
// @Override
// public String getRoute() {
// return "eureka-client";
// //如果需要所有的路由服务都加熔断器功能,只需要在getRoute()方法上返回"*"的匹配符
// //return "*";
// }
}
在Zuul中使用过滤器
MyFilter.java
@Component
public class MyFilter extends ZuulFilter {
private static Logger log = (Logger) LoggerFactory.getLogger(MyFilter.class);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("token");
if(accessToken == null){
log.warning("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
} catch (IOException e) {
return null;
}
}
log.info("ok");
return null;
}
}
MyFilter这个Bean注入IoC容器之后,对请求进行了过滤,并在请求路由转发之前进行了逻辑判断。在实际开发中,可以用此过滤器进行安全验证。