前言:
在学hystri时用到了fallback,当时在feignClient里面加的fallback,当请求微服务发生错误时,执行fallback,zuul集成了hystrix,也可以实现fallback,实现fallback时需要实现 FallbackProvider(springboot2.0)
利用上篇的代码:
加一个下面的类就可以了,有注释:
package com.xhx.springcloud.hystrix; import com.alibaba.fastjson.JSONObject; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; /** * xuhaixing * 2018/6/12 21:36 */ @Component public class ZuulFallBack implements FallbackProvider { @Override public String getRoute() { return "eureka-feign"; //服务id,可以用* 或者 null 代表所有服务都过滤 } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; //请求网关成功了,所以是ok } @Override public int getRawStatusCode() throws IOException { return HttpStatus.OK.value(); } @Override public String getStatusText() throws IOException { return HttpStatus.OK.getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { JSONObject json =new JSONObject(); json.put("state","501"); json.put("msg","后台接口错误"); return new ByteArrayInputStream(json.toJSONString().getBytes("UTF-8")); //返回前端的内容 } @Override public HttpHeaders getHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); //设置头 return httpHeaders; } }; } }
不启动客户端微服务或者启动后再停止,经过网关请求接口。
用postman请求后的结果: