API网关
- 后台服务统一调用入口
- 转发的路由规则
zuul:
routes:
# 远程服务: 调用路径
# 配置的是默认规则,不配置也可以自动配置
# 如果不配置,可以根据注册表自动配置
item-service: /item-service/**
user-service: /user-service/**
oredr-service: /order-service/**
- 主启动类添加@EnableZuulProxy注解
统一的权限校验
通过继承ZuulFilter过滤器,来实现权限判断
http://localhost:3001/item-service/y4y5y4 没登录阻止访问
http://localhost:3001/item-service/y4y5y4?token=sds5556 已登录允许访问
package cn.tedu.sp11.filter;
import cn.tedu.sp01.util.JsonResult;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import sun.misc.Request;
import javax.servlet.http.HttpServletRequest;
/*
* 自定义zuul过滤器,只需要添加@Component注解
* zull会自动配置这个过滤器
* */
@Component
public class AccessFiltre extends ZuulFilter {
//前置,后置,路由,错误处理
@Override
public String filterType() {
// return "pre"
return FilterConstants.PRE_TYPE;
}
//顺序号
@Override
public int filterOrder() {
return 6;
}
//针对当前请求,是否要执行过滤代码
@Override
public boolean shouldFilter() {
/*
* 如果请求商品,执行过滤
* 如果请求用户或订单,跳过过滤
* */
//获取请求上下文对象
RequestContext ctx = RequestContext.getCurrentContext();
//获取调用的服务id
String serviceId =(String) ctx.get(FilterConstants.SERVICE_ID_KEY);
return "item-service".equalsIgnoreCase(serviceId);
}
//过滤代码,权限判断
@Override
public Object run() throws ZuulException {
//判断请求中有没有token信息
//获取request对象
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
//接受token参数
String token= request.getParameter("token");
//如果没有token
if (StringUtils.isBlank(token)) {
//阻止继续访问
ctx.setSendZuulResponse(false);
//直接返回响应
//JsonResult ---{code:200,msg:"xxx",data:null}
ctx.setResponseStatusCode(JsonResult.NOT_LOGIN);
ctx.addZuulResponseHeader("content-Type", "application/json;");
ctx.setResponseBody(JsonResult.err().code(JsonResult.NOT_LOGIN).msg("not login").toString());
}
return null; //zull当前版本中,这个返回值没有使用,不发挥任何作用,返回任何数据都无效
}
}
zuul集成ribbon
默认启用了负载均衡,但没有启用重试
启用重试
- 添加spring-retry依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
- zuul.retryable=true
# zuul 路由转发规则
zuul:
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
retryable: true #启用重试
- 有默认重试参数