当我们对网关进行配置让其调用集群的服务时,将会执行 Ribbon 路由过滤器,该过滤器在进行转发时会封装为一个 Hystrix 命令予以执行,Hystrix 命令具有容错的功能,如果"源服务"出现问题(例如超时),那边所执行的 Hystrix 命令将会触发回退,我们需要实现 org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider 接口,该接口主要需要实现 getRoute 方法 、fallbackResponse 方法,getRoute 方法主要返回路由的名称,用于匹配 Hystrix 回退方法的路由;fallbackResponse 方法主要返回回退的返回信息,示例代码如下:
- 回退方法类
实现了 getRoute 方法,返回 HELLOWORLD-PROVIDER 表示该回退类,用于 HELLOWORLD-PROVIDER 服务,实现了 fallbackResponse 方法,表示回退方法返回的具体内容
package org.lixue.zuul;
import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class HelloWorldFallback implements ZuulFallbackProvider{
@Override
public String getRoute(){
return"HELLOWORLD-PROVIDER";
}
@Override
public ClientHttpResponse fallbackResponse(){
return new ClientHttpResponse(){
@Override
public HttpStatus getStatusCode()throwsIOException{
return HttpStatus.OK;
}
@Override
public int getRawStatusCode()throwsIOException{
return HttpStatus.OK.value();
}
@Override
public String getStatusText()throwsIOException{
returnH ttpStatus.OK.toString();
}
@Override
public void close(){
}
@Override
public InputStream getBody() throws IOException{
return new ByteArrayInputStream("fallback".getBytes());
}
@Override
public HttpHeaders getHeaders(){
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
return headers;
}
};
}
}
- Zuul 配置类
创建配置类,在配置类中创建回退类的实例 Bean 即可
package org.lixue.zuul;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ZuulFallbackConfiguration{
@Bean
public HelloWorldFallback helloWorldFallback(){
return new HelloWorldFallback();
}
}
- 增加路由配置
#配置应用名称
spring:
application:
name:spring-cloud-zuul-microservices
#服务端口
server:
port:9200
#设置eureka服务注册中心的地址,如果多个以逗号分割
eureka:
client:
service-url:
#defaultZone表示默认的区域的eureka服务地址,多个使用逗号分割
defaultZone:http://eurekaserver01:9000/eureka/
#zuul路由配置
zuul:
routes:
hello:
path:/hello/**
serviceId:HELLOWORLD-PROVIDER
- 测试验证
该项目依赖一个 eureka-sserver、service-provider 服务,首先启动 eureka-server 和 service-provider 服务,然后启动 spring-cloud-zuul-microservices 服务,访问 http://localhost:9200/hello/speaks?names=123 地址,可以看到能正常返回,如下:
{"123":"Hello World 123 Port=8080"}
此时,关闭 service-provider 服务,再次访问,可以看到已经无法访问 service-provider 服务了,返回的是回退方法的数据,如下:
fallback