一、说明
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分。
二、代码实现
引用jar包
<!--zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
application.properties配置
server.port=8081
spring.application.name=zuul
eureka.client.service-url.defaultZone= http://localhost:8083/eureka/
#zuul
#以eurekaClient2开头的请求都转发到eurekaClient2
zuul.routes.api-a.path=/eurekaClient1/**
zuul.routes.api-a.serviceId=eurekaClient1
zuul.routes.api-b.path=/EurekaClient2/**
zuul.routes.api-b.serviceId=EurekaClient2
启动类加上**@EnableZuulProxy**注解即可。
zuulFilter过滤器实现
@Component
public class MyZuulFilter extends ZuulFilter {
/**
* 返回一个字符串代表过滤器的类型
* pre:路由之前调用。实现身份验证
* routing:路由之时,过滤器将请求路由到微服务。用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务
* post: 路由之后,这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
* error:发送错误调用,在Zuul中生成响应,而不将请求转发到后端的微服务。
*/
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
//数字越小表示顺序越高,越先执行
return 0;
}
@Override
public boolean shouldFilter() {
return true; //表示是否需要执行该filter,true表示执行,false表示不执行
}
/**
* filter需要执行的具体操作
* http://localhost:8081/eurekaClient1/ribbonPersonById.do?token=2
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
// System.out.println(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
String accessToken = request.getParameter("token"); // 获取请求的参数
if(StringUtils.isNotBlank(accessToken)) {
//进行路由
ctx.setSendZuulResponse(true);
ctx.setResponseStatusCode(200);
ctx.set("isSuccess", true);
}else{
//不进行路由
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(400);
ctx.setResponseBody("token is empty");
ctx.set("isSuccess", false);
}
return