依赖:
<dependencies>
<!-- eureka服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- zuul路由 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
需要在Spring Boot启动类上标注开启zuul功能
/**
* 路由器
* @EnableEurekaClient注解注册Eureka服务
* @EnableZuulProxy注解开启zuul功能
*/
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ServiceZullApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceZullApplication.class, args);
}
}
配置文件:
##########################
#这部分和普通服务是一致的
server:
port: 4444
spring:
application:
name: zuul-service
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka/
##########################
#注册路由
zuul:
routes:
#路由id
api-ribbon:
#请求路径
path: /api/ribbon/**
#服务派发,指定服务需在注册中心注册了
serviceId: service-ribbon
api-feign:
path: /api/feign/**
serviceId: service-feign
过滤器:
在程序初次加载的时候,首先会执行各过滤器的filterType方法和filterOrder方法,进行过滤器执行顺序进行排序,后续过滤中方法的执行顺序是
filterType()->shouldFilter()->shouldFilter()->run()
方法的详细介绍中代码注释中
/**
* 只针对 /api/ribbon/**请求过滤
*/
@Slf4j
@Component
public class RibbonZuulFilter extends ZuulFilter {
/**
* 该函数返回一个字符串代表过滤器的类型,这个类型就是在http请求过程中定义的各个阶段
*
* @return pre:可以在请求被路由之前调用;routing:路由请求时被调用;post:在routing和error过滤器之后被调用;error:处理请求时发送错误时被调用
*/
@Override
public String filterType() {
log.info("in RibbonZuulFilter filterType");
return "pre";
}
/**
* 通过int值来定义过滤器的执行顺序,数值越小优先级越高
* @return
*/
@Override
public int filterOrder() {
log.info("in RibbonZuulFilter filterOrder");
return 0;
}
/**
* 返回一个bool值来判断此过滤器的run()方法是否执行:true执行
* @return
*/
@Override
public boolean shouldFilter() {
log.info("in RibbonZuulFilter shouldFilter");
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
return StringUtils.hasText(request.getServletPath()) && request.getServletPath().startsWith("/api/ribbon/");
}
/**
* 可以进行一些逻辑判断控制程序是否继续执行
*
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
log.info("in RibbonZuulFilter run");
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
String name = request.getParameter("name");
if(!StringUtils.hasText(name) || !"aa".equals(name)){
try {
RequestContext.getCurrentContext().getResponse().getWriter().write("name is error");
RequestContext.getCurrentContext().getResponse().getWriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}