zuul 在微服务中主要有两个作用
1、路由转发
2、服务过滤
当然路由转发也是基于服务过滤实现的
以下是基于springboot来进行讲解的:
1、添加pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
2、启动添加@EnableZuulProxy注解
@SpringBootApplication @EnableZuulProxy public class SpringCloudStuApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudStuApplication.class, args); } }
3、配置文件yml中配置路由规则:
path-url模式:
zuul: routes: demo: //可以根据业务自定义名字 path: /test/hello/** //对请求地址进行拦截 url: https://www.baidu.com //转发的地址
path-serviceId模式(要用到consul,eureka服务注册中心,下一节会将consul注册中心)
zuul: routes: demo: path: /test/hello/** serviceId: hello-service //具体微服务实例id
path匹配规则:
/api-a/? 可以匹配 /api-a/ 之后拼接一个任务字符的路径 , 比如 /api-a/a , /api-a/b , /api-a/c
/api-a/* 可以匹配 /api-a/ 之后拼接任意字符的路径, 比如 /api-a/a, /api-a/aaa, /api-a/bbb . 但它无法匹配 /api-a/a/b 这种多级目录路径
/api-a/** 可以匹配 /api-a/* 包含的内容之外, 还可以匹配形如 /api-a/a/b 的多级目录路径
4、添加zuulFilter(继承ZuulFilter)
public class RequestFilter extends ZuulFilter { /*这里有四个值供选择 public static final String ERROR_TYPE = "error"; public static final String POST_TYPE = "post"; public static final String PRE_TYPE = "pre"; public static final String ROUTE_TYPE = "route";
不出错的情况执行顺序为:pre-->route-->post
出错的情况:pre-->route-->error-->post
*/ @Override public String filterType() { return PRE_TYPE; } //在filterType相等的时候的,可以根据filterOrder来排序执行过滤器,越小的值越先执行 @Override public int filterOrder() { return 0; } //执行过滤的业务逻辑 @Override public boolean shouldFilter() { System.out.println("----------------------------RequestFilter------------------------------"); return true; } //当shouldFilter返回为true才会执行run方法 @Override public Object run() throws ZuulException { return null; } }
在springBoot项目有两种方式使上述过滤器生效:
1、在类声明的时候添加@Component注解
2、声明一个bean如下:
@Configuration public class FilterConfig { @Bean public RequestFilter requestFilter() { return new RequestFilter(); } }