版本:
<properties> <spring-boot.version>2.1.9.RELEASE</spring-boot.version> <spring-cloud.version>Greenwich.SR4</spring-cloud.version> </properties>
所需依赖:
<properties> <spring-cloud.version>Greenwich.SR4</spring-cloud.version></properties> <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.1.9.RELEASE</version></parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--网关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency></dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>
配置文件:
spring: application: name: zuul-gateway-fallback server: port: 16163 eureka: client: service-url: defaultZone: http://root:[email protected]:8761/eureka/,http://root:[email protected]:8761/eureka/
熔断降级处理类:
package cn.arebirth.fallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; import java.nio.charset.Charset; @Component public class ProductProviderFallback implements FallbackProvider { private final Logger logger = LoggerFactory.getLogger(ProductProviderFallback.class); /** * getRoute方法的返回值就是要监听的挂掉的微服务的名字 * 如果需要所有服务都走这个熔断回退,则return "*" 或 return null * * @return */ @Override public String getRoute() { return "*"; } /** * 当服务无法执行的时候,返回托底信息 * * @param route * @param cause * @return */ @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { logger.info("--> route:{}进行熔断降级", route); return new ClientHttpResponse() { /** * ClientHttpResponse的fallback的状态码 * @return * @throws IOException */ @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } /** * ClientHttpResponse的fallback的状态码 * @return * @throws IOException */ @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } /** * ClientHttpResponse的fallback的状态码 * @return * @throws IOException */ @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); } /** * Close this response, freeing any resources created. */ @Override public void close() { } /** * 设置响应体 * @return * @throws IOException */ @Override public InputStream getBody() throws IOException { String content = "商品服务不可用,请与管理员联系"; return new ByteArrayInputStream(content.getBytes()); } /** * 设置响应头信息 * @return */ @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); MediaType mt = new MediaType("application", "json", Charset.forName("utf-8")); headers.setContentType(mt); return headers; } }; } }
启动类:
package cn.arebirth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class ZuulGatewayFallbackApp { public static void main(String[] args) { SpringApplication.run(ZuulGatewayFallbackApp.class, args); } }
这是正常请求服务的情况下:
当把服务关闭的情况下:
原文地址:https://www.cnblogs.com/arebirth/p/springcloudzuulfallbackone.html
时间: 2024-11-01 12:24:22