Spring Cloud(spring-cloud-starter-netflix-zuul)路由

依赖:

    <dependencies>
        <!-- eureka服务 -->
        <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>
    </dependencies>

需要在Spring Boot启动类上标注开启zuul功能

/**
 * 路由器
 * @EnableEurekaClient注解注册Eureka服务
 * @EnableZuulProxy注解开启zuul功能
 */
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ServiceZullApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceZullApplication.class, args);
    }
}

配置文件:

##########################
#这部分和普通服务是一致的
server:
  port: 4444
spring:
  application:
    name: zuul-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1111/eureka/
##########################
#注册路由
zuul:
  routes:
    #路由id
    api-ribbon:
      #请求路径
      path: /api/ribbon/**
      #服务派发,指定服务需在注册中心注册了
      serviceId: service-ribbon
    api-feign:
      path: /api/feign/**
      serviceId: service-feign

过滤器:
在程序初次加载的时候,首先会执行各过滤器的filterType方法和filterOrder方法,进行过滤器执行顺序进行排序,后续过滤中方法的执行顺序是
filterType()->shouldFilter()->shouldFilter()->run()
方法的详细介绍中代码注释中

/**
 * 只针对 /api/ribbon/**请求过滤
 */
@Slf4j
@Component
public class RibbonZuulFilter extends ZuulFilter {

    /**
     * 该函数返回一个字符串代表过滤器的类型,这个类型就是在http请求过程中定义的各个阶段
     *
     * @return pre:可以在请求被路由之前调用;routing:路由请求时被调用;post:在routing和error过滤器之后被调用;error:处理请求时发送错误时被调用
     */
    @Override
    public String filterType() {
        log.info("in RibbonZuulFilter filterType");
        return "pre";
    }

    /**
     * 通过int值来定义过滤器的执行顺序,数值越小优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        log.info("in RibbonZuulFilter filterOrder");
        return 0;
    }

    /**
     * 返回一个bool值来判断此过滤器的run()方法是否执行:true执行
     * @return
     */
    @Override
    public boolean shouldFilter() {
        log.info("in RibbonZuulFilter shouldFilter");
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        return StringUtils.hasText(request.getServletPath()) && request.getServletPath().startsWith("/api/ribbon/");
    }

	/**
     * 可以进行一些逻辑判断控制程序是否继续执行
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        log.info("in RibbonZuulFilter run");
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String name = request.getParameter("name");
        if(!StringUtils.hasText(name) || !"aa".equals(name)){
            try {
                RequestContext.getCurrentContext().getResponse().getWriter().write("name is error");
                RequestContext.getCurrentContext().getResponse().getWriter().flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41131531/article/details/88689506