zuul接口网关
- 拦截所有请求,网关进行请求转发(类似nginx反向代理)
- 路由分发
- 请求参数验证(token)
- 不必再每个模块配置拦截器
zuul网关现实
- 搭建环境,项目依赖
<groupId>com.link</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zuul</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.link</groupId>
<artifactId>springcloud01</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
- 项目配置
server:
port: 8884
spring:
application:
name: service-zuul
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
# zuul路由分发,类似代理作用
# 以: /api-a/ 到 service-ribbon服务
# 例:http://localhost:8886/api-a/getUserList
# ==> http://service-ribbon的地址/getUserList
zuul:
routes:
api-a:
path: /api-a/**
serviceId: service-ribbon
api-b:
path: /api-b/**
serviceId: service-feign
- 配置网关过滤器
- 网关拦截参数
@Component
public class MyFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(MyFilter.class);
/**
* 路由时过滤类型,分四种:
* pre:路由前
* routing:路由时
* post:路由后
* error:发送错误
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤的顺序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否过滤请求:
* 逻辑判断,是否要过滤
* true: 过滤,执行过滤逻辑
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的具体逻辑
* 进行权限校验:
* 此处url不带token将被拦截
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
if(accessToken == null) {
log.warn("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
}catch (Exception e){
}
return null;
}
log.info("ok");
return null;
}
}
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ZuulApplication {}
- 启动服务
service-ribbon
service-feign
server-zuul
效果:
http://localhost:8884/api-a/getUserList ==> http://service-ribbon的地址/getUserList
http://localhost:8884/api-b/getUserList ==> http://service-feign的地址/getUserList