使用zuul可以对微服务提供的api进行路由和保护。本节将阐述zuul在微服务中的两种用法:路由和过滤。
1、环境约束
- win10 64为操作系统
- idea2018.1.5
- maven-3.0.5
- jdk-8u162-windows-x64
2、前提约束
- 已经创建好一个注册中心并已启动 https://www.jianshu.com/p/0c4ac4b0c128
假设该注册中心端口为7561 - 已经在注册中心上注册了一个服务 https://www.jianshu.com/p/b730990d1daf
假设已经注册的服务名称为provider-service,并提供一个GET方式的/query接口,端口为8001
3、操作步骤
3.1 路由
- 创建一个springcloud项目,包括springweb、eureka client、zuul模块,关键依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
注意:springboot的版本是2.1.8.RELEASE,springcloud的版本是Greenwich.SR2
- 修改application.properties,内容如下:
server.port=8003
eureka.client.service-url.defaultZone=http://localhost:7561/eureka
spring.application.name=zuul-service
zuul.routes.traditional-url.path=/api/url/**
zuul.routes.traditional-url.url=http://localhost:8001
zuul.routes.orient-service-url.path=/api/service/**
zuul.routes.orient-service-url.service-id=provider-service
zuul.prefix=/wanho
- 在主启动类上除@SpringBootApplication之外,加入以下注解:
@EnableEurekaClient
@EnableZuulProxy
- 先启动eureka,再启动该模块,在浏览器中输入以下url,均能响应到内容:
http://localhost:8003/wanho/api/url/query
或者
http://localhost:8003/wanho/api/service/query - 创建一个springcloud项目作为consumer,确保其中的访问路径变成以上两个接口内容之一,即可完成consumer访问zuul,再有zuul路由到provider,从而保护了provider中的接口隐密性。
3.2 过滤
- 以完成3.1操作为基础,在主启动类的同级目录下加入PasswordFilter.java
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
@Component
public class PasswordFilter extends ZuulFilter {
@Override
public String filterType() {
return "post"; // 请求处理完成后执行的filter
}
@Override
public int filterOrder() {
return 1; // 优先级为0,数字越大,优先级越低
}
@Override
public boolean shouldFilter() {
boolean enable = true;//为true一定会执行run
return enable;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String password= request.getParameter("password");
if(StringUtils.isEmpty(password) || !password.equalsIgnoreCase("123456")){
//不放行
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(500);
ctx.setResponseBody("password is empty");
return null;
}else{
//放行
ctx.setSendZuulResponse(true);
ctx.setResponseStatusCode(200);
return null;
}
}
}
- 重启zuul所在的cloud项目,此时,只有在浏览器中输入以下的url才会看到响应数据,否则只会看到“password is invalid”
http://localhost:8003/wanho/api/service/query?password=123
或者
http://localhost:8003/wanho/api/url/query?password=123
以上就是zuul的路由和过滤功能。