+ * 网关的默认回退FallbackProvider的机制只适用于通过配置文件中配置的url来跨服务调用,而不拦截通过FeignClient跨服务调用, + * 也就是说要自己实现一个FeignClient服务的fallback才可以,但是如果通过FeignClient的服务要是特别多怎么办,每一个都要写一个不得累死, + * 这里想到了通过网关的错误过滤器来统一处理FeignClient跨服务调用出错的问题 + * + * @author : qinyingjie + * @version : 2.2.0 + * @date : 2023/1/11 12:48 + */ +@Component +public class GoodsServiceFallBackProvider implements FallbackProvider { + + @Override + public String getRoute() { + return "goods-service"; + } + + @Override + public ClientHttpResponse fallbackResponse(String route, Throwable cause) { + return new ClientHttpResponse() { + + @Override + public HttpHeaders getHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + return headers; + } + + @Override + public InputStream getBody() throws IOException { + return new ByteArrayInputStream("order-service is not available!".getBytes()); + } + + @Override + public HttpStatus getStatusCode() throws IOException { + return HttpStatus.BAD_REQUEST; + } + + @Override + public int getRawStatusCode() throws IOException { + return this.getStatusCode().value(); + } + + @Override + public String getStatusText() throws IOException { + return this.getStatusCode().getReasonPhrase(); + } + + @Override + public void close() { + + } + }; + } + +} diff --git a/springcloud-service-zuul/src/main/java/com/kwan/springcloud/ZuulApplication.java b/springcloud-service-zuul/src/main/java/com/kwan/springcloud/ZuulApplication.java index 72c97a29addfbb7ef5060b3030b25d20d8e1c294..2a4feb9d81ea9e5973dcd17e774d7da15ae6d562 100644 --- a/springcloud-service-zuul/src/main/java/com/kwan/springcloud/ZuulApplication.java +++ b/springcloud-service-zuul/src/main/java/com/kwan/springcloud/ZuulApplication.java @@ -1,6 +1,10 @@ package com.kwan.springcloud; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; + @EnableZuulProxy @SpringBootApplication public class ZuulApplication { diff --git a/springcloud-service-zuul/src/main/java/com/kwan/springcloud/filter/MyZuulFilter.java b/springcloud-service-zuul/src/main/java/com/kwan/springcloud/filter/MyZuulFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..edca4538b46ba407a6eb6ce881174dfb05bc2e34 --- /dev/null +++ b/springcloud-service-zuul/src/main/java/com/kwan/springcloud/filter/MyZuulFilter.java @@ -0,0 +1,49 @@ +package com.kwan.springcloud.filter; + +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import com.netflix.zuul.exception.ZuulException; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +@Component +public class MyZuulFilter extends ZuulFilter { + /** + * 表示当前的过滤器是否被调用 + */ + @Override + public boolean shouldFilter() { + return true; + } + + /** + * filterOrder表示执行的优先级,值越小表示优先级越高 + */ + @Override + public int filterOrder() { + return 0; + } + + /** + * pre: 在请求被路由之前调用 + * routing: 在请求被路由之中调用 + * post: 在请求被路由之后调用 + * error: 处理请求发生错误时调用 + */ + @Override + public String filterType() { + return "pre"; + } + + /** + * 真正执行Filter逻辑的方法 + */ + @Override + public Object run() throws ZuulException { + RequestContext ctx = RequestContext.getCurrentContext(); + HttpServletRequest request = ctx.getRequest(); + System.err.println("--------------uri: -------------- " + request.getRequestURI()); + return ctx; + } +} \ No newline at end of file diff --git a/springcloud-service-zuul/src/main/resources/application.yaml b/springcloud-service-zuul/src/main/resources/application.yaml index 665aa0fda042f988c15ecf9573c9f51f97d3019b..2e0e56865b56db0335d8d44fb97a3e8d3a61a0c8 100644 --- a/springcloud-service-zuul/src/main/resources/application.yaml +++ b/springcloud-service-zuul/src/main/resources/application.yaml @@ -6,6 +6,17 @@ spring: application: name: zuul-service #服务名称 +#路由规则: +zuul: + sensitiveHeaders: Cookie,Set-Cookie,Authorization + routes: + api-portal: + path: /portal-service/** #访问路径:http:/localhost:5001/hello-service/hello + serviceId: portal-service + api-goods: + path: /goods-service/** + serviceld: goods-service + #服务提供者 eureka: client: