springcloud——接口网关zuul

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值