美文网首页
zuul路由网关

zuul路由网关

作者: 我是啵啵 | 来源:发表于2019-11-10 19:57 被阅读0次

    功能

    请求路由和校验过滤

    整合

    Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka 中获得其他微服 务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。 注意:Zuul服务终还是会注册进Eureka


    image.png

    实战

    建工程gateway
    导依赖

     <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>
    
            <!--zuul路由网关依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
    
    yml
    server:
      port: 7001
    
    spring:
      application:
        name: microservice-zuul-gateway
    
    eureka:
      client:
        registerWithEureka: true # 服务注册开关
        fetchRegistry: true # 服务发现开关
        serviceUrl: # 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
          # 单机版 Eureka 服务注册中心
          #defaultZone: http://localhost:6001/eureka
          # 集群版 Eureka 服务注册中心
          defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
      instance:
        instanceId: ${spring.application.name}:${server.port} # 指定实例ID,就不会显示主机名了
        preferIpAddress: true     #访问路径可以显示IP地址
    
    zuul:
      routes:
        provider-product:    # 路由名称,名称任意,路由名称唯一
          path: /product/** # 访问路径
          serviceId: microservice-product # 指定服务ID,会自动从Eureka中找到此服务的ip和端口
          stripPrefix: false # 代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时请求 /product/get/1,代理转发到/get/1
    
        # 如果多个服务需要经过路由,则同povider-product方式继续添加,例如:
        #provider-order:
          #path: /order/**
          #serviceId: microservice-order
          #stripPrefix: false
    

    启动测试


    image.png

    注册成功

    测试 通过7001 访问
    使用路由访问 (注意是 7001 端口), 当前要加上服务名
    http://localhost:7001/microservice-product/product/get/1

    配置路由映射

    • 隐藏了真实的路径 保护作用
      去掉服务名
    • stripPrefix是否去掉访问路径前缀 一般false
    zuul:
      routes:
        provider-product:    # 路由名称,名称任意,路由名称唯一
          path: /product/** # 访问路径
          serviceId: microservice-product # 指定服务ID,会自动从Eureka中找到此服务的ip和端口
          stripPrefix: false # 代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时请求 /product/get/1,代理转发到/get/1
    

    就没有服务的名字了
    http://localhost:7001/product/get/1

    image.png

    过滤器实战

    返回值的不同

    filterType:

    返回字符串代表过滤器的类型,返回值有:

    • pre:在请求路由之前执行
    • route:在请求路由时调用
    • post:请求路由之后调用, 也就是在route和errror过滤器之后调用
    • error:处理请求发生错误时调用
    filterOrder:

    此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
    shouldFilter:返回Boolean值,判断该过滤器是否执行。返回true表示要执行此过虑器,false不执行。
    run:过滤器的业务逻辑。
    话不多说直接上码

    
    package com.mengxuegu.springcloud.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    
    @Component //一定不要少了
    public class LoginFilter extends ZuulFilter {
        Logger logger = LoggerFactory.getLogger(getClass());
        /**
         * 返回值可取:
         * - pre:在请求路由之前执行
         * - route:在请求路由时调用
         * - post:请求路由之后调用, 也就是在route和errror过滤器之后调用
         * - error:处理请求发生错误时调用
         * @return
         */
        @Override
        public String filterType() {
            return "pre"; //
        }
    
        @Override
        public int filterOrder() {
            return 1; //返回值是int,会根据返回值进行定义过滤器的执行顺序,值越小优先级越大
        }
    
        @Override
        public boolean shouldFilter() {
            return true; //当前过滤器是否被执行,true则执行,false不执行
        }
    
        //定义 过滤功能
        @Override
        public Object run() throws ZuulException {
    
            //1.获取请求上下文
            RequestContext context = RequestContext.getCurrentContext();
            HttpServletRequest request = context.getRequest();
            String token = request.getParameter("token");
            //如果说请求带了token值,则表示已经登录过
            if(token == null) {
                logger.warn("此操作需要先登录系统");
                //没有登录 过,则不进行路由转发
                context.setSendZuulResponse(false);//拒绝访问
                context.setResponseStatusCode(200); //响应状态码
                try {
                    context.getResponse().getWriter().write("token is empty...");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
            //通过,会进行路由转发
            logger.info("通过,会进行路由转发");
            return null;
        }
    }
    
    

    这句代码用来设置是否转发
    context.setSendZuulResponse(false);//拒绝访问

    相关文章

      网友评论

          本文标题:zuul路由网关

          本文链接:https://www.haomeiwen.com/subject/yuljbctx.html