0%

SpringCloud-Zuul

Zuul简介

  • zuul简介

    Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

Zuul使用

zuul转发功能

  • 创建一个工程并添加依赖:

       <!--web-->
      <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>
    
  • 启动类添加注解

      @SpringBootApplication
      @EnableEurekaClient
      @EnableZuulProxy
      public class ZuulApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(ZuulApplication.class, args);
          }
      }
      
    
  • application.yml配置文件

      spring:
        application:
          name: service-zuul
      eureka:
        client:
          service-url:
            defaultZone: http://172.96.251.101:8761/eureka
      server:
        port: 8085
      zuul:
        routes:
          api-a:
            path: /api-a/**
            serviceId: service-ribbon
          api-b:
            path: /api-b/**
            serviceId: service-feign
      
      #请求示例
      #http://localhost:8085/api-a/product/list?productId=11
      
      #filter过滤后的请求示例
      ##http://localhost:8085/api-b/product/list?productId=11&token=1111
    

zuul过滤器功能

  • 过滤功能

    1.创建MyZuulFilter继承ZuulFilter

      package com.ux.zuul.filter;
    
      import com.netflix.zuul.ZuulFilter;
      import com.netflix.zuul.context.RequestContext;
      import com.netflix.zuul.exception.ZuulException;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.stereotype.Component;
      
      import javax.servlet.http.HttpServletRequest;
      
      @Slf4j
      @Component
      public class MyZuulFilter extends ZuulFilter {
      
          @Override
          public String filterType() {
              return "pre";
          }
      
          @Override
          public int filterOrder() {
              return 0;
          }
      
          @Override
          public boolean shouldFilter() {
              return true;
          }
      
          @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参数为空~~");
                  ctx.setSendZuulResponse(false);
                  ctx.setResponseStatusCode(401);
                  try {
                      ctx.getResponse().getWriter().write("token is required~~~~~");
                  } catch (Exception e) {
                  }
      
                  return null;
              }
              log.info("成功~~");
              return null;
          }
      }
    

    2.此时访问#filter过滤后的请求示例

      ##http://localhost:8085/api-b/product/list?productId=11&token=1111
      如果token为空(http://localhost:8085/api-b/product/list?productId=11),会提示“token参数为空~~“
    

    3.filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

      pre:路由之前
      routing:路由之时
      post: 路由之后
      error:发送错误调用
      filterOrder:过滤的顺序
      shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
      run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
    

小结

  • 小结

    1.配置文件中配置转发规则>>>用户请求后根据转发规则访问不同服务
    2.zuul不仅只是路由,并且还能过滤,做一些安全验证,通过创建MyZuulFilter继承ZuulFilter并重写其中的方法,实现过滤规则,增加安全系数。