首先导入相应的依赖,需在主程序类中加上@EnableZuulProxy注解
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
进行Yml配置,配置eureka,程序名,和zuul配置
zuul:
routes:
system-route:
path: /system/**
service-id: my-system
business-route:
path: /business/**
service-id: my-business
ignored-services: '*' #拦截非服务接口 移交给fallback
prefix: /api #加前缀
这是单个请求,上面是多个请求
#zuul:
# routes:
# my-system: /system/**
ignored-patterns: /**/test/** #忽略某种请求
如果不配置忽略,他就可以去调用business与system下所有的接口
前置过滤器,创建一个Filter继承ZuulFilter实现方法,在类上加上@Component让Spring管理它
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
顺序
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER -1;
}
//执行不执行
@Override
public boolean shouldFilter() {
return true;
}
//业务逻辑代码
@Override
public Object run() throws ZuulException {
//前置过滤器
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
StringBuffer requestURL = request.getRequestURL();
System.out.println("请求路径为"+requestURL.toString());
return requestURL.toString();
}
后置过滤器
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
顺序
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER -1;
}
执行不执行
@Override
public boolean shouldFilter() {
return true;
}
//业务逻辑代码
@Override
public Object run() throws ZuulException {
//后置过滤器
HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
response.setHeader("X-param","hello zuul");
System.out.println("后置过滤器执行");
return null;
}
当我们的zuul进行路由分发时,如果后端服务没有启动,或者调用超时,这时候我们希望Zuul提供一种降级功能,而不是将异常暴露出来。
创建一个类,并实现FallbackProvider实现它的所有接口,在类上加入@Component让它被Spring管理
返回值表示需要针对此微服务做回退处理(该名称一定要是注册进入 eureka 微服务中的那个 serviceId 名称);
@Override
public String getRoute() {
return "my-business";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
//这是一个状态码
网关向api请求失败了,但是消费者向网关请求的是成功的
不应该把404或500等问题抛给客户
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.REQUEST_TIMEOUT;
}
@Override
public int getRawStatusCode() throws IOException {
return this.getStatusCode().value();
}
@Override
public String getStatusText() throws IOException {
return this.getStatusText();
}
@Override
public void close() {
}
如果请求失败应该返回什么数据给客户
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("moveserver微服务不可用请稍后重试".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers=new HttpHeaders();
MediaType mt = new MediaType("application","json", Charset.forName("UTF-8"));
headers.setContentType(mt);
return headers;
}
};
}
跨域配置
/**
* 跨域配置
*/
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowedMethods(Arrays.asList("*"));
config.setMaxAge(300l);
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}