SpringCloud2.0 Zuul 网关路由 基础教程(十)

时间:2021-11-24 17:03:00

1、启动基础工程

1.1、启动【服务注册中心】,工程名称:springcloud-eureka-server

1.2、启动【服务提供者】,工程名称:springcloud-eureka-client

1.3、启动【服务消费者】,工程名称:springcloud-eureka-ribbon

1.4、启动【服务消费者】,工程名称:springcloud-eureka-feign

2、创建【网关路由】,即 Eureka Zuul

2.1、新建 Spring Boot 工程,工程名称:springcloud-eureka-zuul

2.2、工程pom.xml文件添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2.3、在工程启动类中,添加注解 @EnableZuulProxy

package com.miniooc.eurekazuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

/**
 * EurekaZuulApplication
 *
 * @author 宋陆
 * @version 1.0.0
 */
@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {

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

}

2.4、创建工程配置文件application.yml,添加如下配置:

server:
  port: 8080

spring:
  application:
    name: eureka-gateway

eureka:
  instance:
    hostname: localhost
    # 表示eureka client间隔多久去拉取服务注册信息,默认为30秒,如果要迅速获取服务注册状态,可以缩小该值
    lease-renewal-interval-in-seconds: 5
    # 表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。
    # 默认为90秒
    # 如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
    # 如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
    # 该值至少应该大于 leaseRenewalIntervalInSeconds
    lease-expiration-duration-in-seconds: 10
  client:
    serviceUrl:
      defaultZone: http://localhost:9527/eureka/,http://localhost:9528/eureka/,http://localhost:9529/eureka/

zuul:
  routes:
    api-ribbon:
      path: /ribbon/*
      serviceId: eureka-discovery-ribbon
    api-feign:
      path: /feign/*
      serviceId: eureka-discovery-feign

2.5、启动工程

2.6、打开浏览器,分别访问 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo

SpringCloud2.0 Zuul 网关路由 基础教程(十)

SpringCloud2.0 Zuul 网关路由 基础教程(十)

【路由网关】按照路由转发规则,把 /ribbon/* 的请求,转发到了 eureka-discovery-ribbon 服务,把 /feign/* 的请求,转发到了 eureka-discovery-feign

3、为【网关路由】添加自定义过滤器

zuul过滤器有四种类型分别是:pre 路由前,route 路由时,post 路由完毕,error 发生错误时。

3.1、创建自定义过滤器 AuthFilter

package com.miniooc.eurekazuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * EurekaZuulApplication
 *
 * @author 宋陆
 * @version 1.0.0
 */
public class AuthFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre"; // 在请求被路由之前调用
    }

    @Override
    public int filterOrder() {
        return 0; // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
    }

    @Override
    public boolean shouldFilter() {
        return true; // 是否执行该过滤器,此处为true,说明需要过滤
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        String token = request.getParameter("token");// 获取请求的参数

        // 如果有token参数并且token值为miniooc,才进行路由
        if (StringUtils.isNotBlank(token) && token.equals("miniooc")) {
            ctx.setSendZuulResponse(true); //对请求进行路由
            ctx.setResponseStatusCode(200);
            ctx.set("code", 1);
        } else {
            ctx.setSendZuulResponse(false); //不对其进行路由
            ctx.setResponseStatusCode(401);
            HttpServletResponse response = ctx.getResponse();
            response.setHeader("content-type", "text/html;charset=utf8");
            ctx.setResponseBody("网关认证失败,停止路由");
            ctx.set("code", 0);
        }
        return null;
    }
}

3.2、创建应用配置类 EurekaRibbonConfig

package com.miniooc.eurekazuul.config;

import com.miniooc.eurekazuul.filter.AuthFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * EurekaZuulConfig
 * 应用配置类,初始化 Bean和配置信息
 *
 * @author 宋陆
 * @version 1.0.0
 */
@Configuration
public class EurekaZuulConfig {

    @Bean
    public AuthFilter authFilter(){
        return new AuthFilter();
    }
}

3.3、重新启动工程

3.4、打开浏览器,分别访问 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo

SpringCloud2.0 Zuul 网关路由 基础教程(十)

SpringCloud2.0 Zuul 网关路由 基础教程(十)

 

没有通过校验,zuul过滤器停止路由转发

3.5、打开浏览器,分别访问 http://localhost:8080/ribbon/ribbonInfo?token=miniooc,http://localhost:8080/feign/feignInfo?token=miniooc

SpringCloud2.0 Zuul 网关路由 基础教程(十)

 SpringCloud2.0 Zuul 网关路由 基础教程(十)

通过校验,zuul过滤器正常路由转发

至此,一个简单的【网关路由】搭建完成。


《SpringCloud2.0 基础教程》目录

SpringCloud2.0 概述 基础教程(一)

SpringCloud2.0 Eureka Server 服务中心 基础教程(二)

SpringCloud2.0 Eureka Client 服务注册 基础教程(三)

SpringCloud2.0 Ribbon 服务发现 基础教程(四)

SpringCloud2.0 Feign 服务发现 基础教程(五)

SpringCloud2.0 Hystrix Ribbon 基于Ribbon实现断路器 基础教程(六)

SpringCloud2.0 Hystrix Feign 基于Feign实现断路器 基础教程(七)

SpringCloud2.0 Hystrix Dashboard 断路器指标看板 基础教程(八)

SpringCloud2.0 Turbine 断路器集群监控 基础教程(九)

SpringCloud2.0 Zuul 网关路由 基础教程(十)