Spring Cloud与微服务之Zuul

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZZY1078689276/article/details/85011489

Zuul的添加方式

  导入Zuul依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

  添加网关服务依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

  添加配置文件:

zuul:
  routes:
    item-service:   #item-service 这个名字是任意写的
      path: /item-service/** #配置请求URL的请求规则
      #url: http://127.0.0.1:8081 #真正的微服务地址
      serviceId: springcloud-goods-item #指定Eureka注册中心的服务id

  启用Zuul:

  在ApiGatewayApplication中添加下面的代码:

@EnableZuulProxy

添加过滤器

  创建过滤器的方式如下,就是创建一个类,这里创建的是UserLoginZuulFilter,使其继承Zuul的ZuulFilter,然后我们重写其中的方法,比如如下面的重写其中的run()方法。

package com.lyc.filters;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component  //加入到Spring容器
public class UserLoginZuulFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";    //设置过滤器类型为pre
    }

    @Override
    public int filterOrder() {
        return 0;   //设置执行顺序
    }

    @Override
    public boolean shouldFilter() {
        return true;   //该过滤需要执行
    }

    @Override
    public Object run() {  //编写业务逻辑
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String token = request.getParameter("token");
        if(StringUtils.isEmpty(token)){
            requestContext.setSendZuulResponse(false);   //过滤该请求,不对其进行路由
            requestContext.setResponseStatusCode(401);
            return null;
        }
        return null;
    }
}

  在上面代码中,我们实现功能是判断当前请求的url信息中是否含有登陆令牌token,如果含有,则放行,如果不含有,则返回401错误代码。

  然后在启动类ApiGatewayApplication中启用UserLoginZuulFilter。

	/**
     * 即便是所有的配置都写好了,如果不添加这个Bean方法,那还是不会执行任何的过滤方法
     * @return
     */
    @Bean
    public UserLoginZuulFilter userLoginZuulFilter(){
        return new UserLoginZuulFilter();
    }

  这样当我们通过服务网关访问商品服务时,如果我们含有token,我们的访问结果是这样的:

在这里插入图片描述

  当我们去掉token令牌时,访问被阻止:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZZY1078689276/article/details/85011489
今日推荐