1、首先在POM文件添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
2、在Spring boot入口类添加注解:
@EnableZuulProxy
3、在application.properties配置文件中配置服务路由,以上面的feign-service为例,其中find为路由名,之后通过访问http://gate-service:9001/find/**,由find路由将请求转发到feign-service服务上:
zuul.routes.hello.path=/find/**
zuul.routes.hello.serviceId=feign-service
4、增加对请求的前置过滤,例如对所有到各微服务的请求都要进行token校验:
public class AccessFilter extends ZuulFilter {
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
return null;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public String filterType() {
return "pre";
}
}
5、为了使过滤器生效,还需要创建对应的Bean,我们创建了一个FilterBean来配置所有的过滤器Bean:
@Configuration
public class FilterBean {
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
}
5、可能遇到的问题:
① Zuul转发失败,报错XX timed-out and no fallback available
原因:Zuul集成了Hystrix组件,Hystrix缺省超时判断为1秒钟,由于网络问题,有些请求超过1秒钟之后才接收到。但是由于没给Zuul开发fallback代码,所以请求失败报了这个错。
解决办法:在application.properties配置修改Hystrix的超时时间或关掉Hystrix超时。
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=80000
或
hystrix.command.default.execution.timeout.enabled=false
② Zuul转发失败,报错Read timed out
原因:Zuul集成了Ribbon组件,当请求量过大时,后面的请求积压时间会超过Ribbon的超时时间,从而导致失败。
解决办法:在application.properties配置修改Ribbon的超时时间。
ribbon.ConnectTimeout=60000
ribbon.ReadTimeout=60000
ribbon.OkToRetryOnAllOperations=true
ribbon.MaxAutoRetriesNextServer=1
ribbon.MaxAutoRetries=0