乐趣区

spring-cloud-2x版本-Zuul路由网关教程

前言

 本文采用 Spring cloud 本文为 2.1.8RELEASE,version=Greenwich.SR3

本文基于前两篇文章 eureka-server、eureka-client、eureka-ribbon 和 eureka-feign 的实现。
参考

  • eureka-server
  • eureka-client
  • eureka-ribbon
  • eureka-feign

概念

Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,例如将请求 /api/goods 转发到商品服务上、/api/order 转发到订单服务上等。

Zull 默认和 Ribbon 结合实现了负载均衡功能。

创建 Zuul 工程

1.1 创建 sping boot 工程:eureka-zuul

1.2 添加 pom.xml 相关依赖

<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>

1.3 application 添加配置信息

spring:
  application:
    name: eureka-zuul
server:
  port: 8400

eureka:
  instance:
    hostname: localhost
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
  client:
    service-url:
      defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

zuul:
  routes:
    eureka-ribbon: #对应服务名称, 可以自定义(最好保持一致)path: /ribbon/*
      serviceId: eureka-ribbon #对应服务名称
    eureka-feign:
      path: /eureka-feign/*
      serviceId: eureka-feign #对应服务名称 

1.4 启动类 EurekaZuulApplication 增加注解

package spring.cloud.demo.eurekazuul;

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

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

}

@EnableZuulProxy: 开启 Zuul 网关注解

1.5 启动 eureka-zuul 服务

打开浏览器,分别输入 http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello, 显示结果分别如下:

可以看到 Zuul 按照路由转发的配置规则,把 /ribbon/ 的请求转发到 eureka-ribbon 服务上,把 /eureka-feign/ 的请求转发到 eureka-feign 的服务上。

至此,一个简单基于 Zuul 路由网关就搭建完成了。

彩蛋

添加自定义过滤器

Zuul 过滤器有四种类型分别是

  • pre 路由前
  • route 路由时
  • post 路由完毕
  • error 发生错误时

创建自定义过滤器 filter

package spring.cloud.demo.eurekazuul.fillter;

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;

/**
 * 简单 filter 过滤器
 * @auther: maomao
 * @DateT: 2019-09-17
 */
public class CommonFilter extends ZuulFilter {

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

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

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

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

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

        // 校验 token 是否可以通过
        if (StringUtils.isNotBlank(token) && token.equals("maomao")) {requestContext.setSendZuulResponse(true);
            requestContext.setResponseStatusCode(200);
            requestContext.set("code", 1);
        } else {requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            HttpServletResponse response = requestContext.getResponse();
            response.setHeader("content-type", "text/html;charset=utf-8");
            requestContext.setResponseBody("网关认证失败,停止路由");
            requestContext.set("code", 0);
        }
        return null;
    }
}

将过滤器加入 Bean,增加 Config 类

package spring.cloud.demo.eurekazuul.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.cloud.demo.eurekazuul.fillter.CommonFilter;

/**
 * @auther: maomao
 * @DateT: 2019-09-17
 */
@Configuration
public class ZuulFilterConfig {

    @Bean
    public CommonFilter commonFilter() {return new CommonFilter();
    }
}

启动工程

在浏览器分别输入 http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello, 显示结果如下:

显示结果证明,过滤器已经生效。因为过滤 CommonFilter 中要求输入参入带 token=maomao,所以请求被拦截,Zuul 停止转发。

在浏览器中 URL 中增加 token 参数,显示如下:

显示结果证明,在 token 正确的情况下,Zuul 转发成功。

至此,自定义的过滤器就演示完成。

总结

本文要实现了简单的 Zuul 路由转发应用。

代码地址

gitHub 地址


<center><font color=red>《Srping Cloud 2.X 小白教程》目录 </font></center>

  • spring cloud 2.x 版本 Eureka Server 服务注册中心教程
  • spring cloud 2.x 版本 Eureka Client 服务提供者教程
  • spring cloud 2.x 版本 Ribbon 服务发现教程 (内含集成 Hystrix 熔断机制)
  • spring cloud 2.x 版本 Feign 服务发现教程 (内含集成 Hystrix 熔断机制)
  • spring cloud 2.x 版本 Zuul 路由网关教程
  • spring cloud 2.x 版本 config 分布式配置中心教程
  • spring cloud 2.x 版本 Hystrix Dashboard 断路器教程

转载请注明出处,

  • 联系方式:4272231@163.com

转载请注明出处,联系方式:4272231@163.com

退出移动版