zuul

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

默认启用了负载均衡,但没有启用重试

启用重试

  1. 添加spring-retry依赖
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>
  1. zuul.retryable=true
# zuul 路由转发规则
zuul:
  routes:
    item-service: /item-service/**
    user-service: /user-service/**
    order-service: /order-service/**
  retryable: true  #启用重试

  1. 有默认重试参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值