Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验、登录校验等在微服务架构中的冗余问题,逻辑上来说,本质上和微服务应用自身的业务并没有多大的关系,所以他们完全可以独立成一个单独的服务存在,只是他们被剥离和独立出来之后,是在 API 网关统一调用来对微服务接口做前置过滤,以实现对微服务接口的拦截和校验。Spring Cloud Zuul 提供了一套过滤机制,可以很好的支持这样的任务,开发者可以通过使用 Zuul 来创建各种校验过滤器,然后指定哪些规则的请求需要执行校验逻辑,只有通过校验的才会被路由到具体的微服务接口,使得我们的微服务应用可以更专注与业务逻辑的开发,同时微服务的自动化测试也变得更容易实现。

快速入门

  • 创建一个基础的 Spring Boot 工程,命名为 gateway-zuul,并在 pom.xml 中引入 spring-cloud-starter-zuul 依赖,具体如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

        <modelVersion>4.0.0</modelVersion>

       

        <groupId>org.lixue</groupId>

        <artifactId>gateway-zuul</artifactId>

        <version>0.0.1-SNAPSHOT</version>

        <packaging>jar</packaging>

        <name>gateway-zuul</name>

   

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.6.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

   

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <java.version>1.8</java.version>

        <spring-cloud.version>Dalston.SR3</spring-cloud.version>

    </properties>

   

    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-zuul</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>

   

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-dependencies</artifactId>

                <version>${spring-cloud.version}</version>

                <type>pom</type>

                <scope>import</scope>

            </dependency>

        </dependencies>

    </dependencyManagement>

  </project>

对于 Spring-Cloud-starter-zuul 依赖,可以通过查看他的依赖内容了解到,该模块不仅包含了 zuul-core 核心依赖,还包括了一下重要依赖:

  • spring-cloud-starter-hystrix:该依赖用来在网关服务中实现对微服务转发时候的保护机制,通过线程隔离和断路器,防止微服务的故障引发 API 网关资源无法释放,从而影响其他应用的对外服务
  • spring-cloud-starter-ribbon:该依赖用来实现在网关服务进行路由转发时候,客户端负载均衡以及请求重试。
  • spring-boot-starter-actuator:该依赖用来提供常规的微服务管理端点,在 Spring Cloud Zuul 中还提供了 /routes 端点来返回当前的所有路由规则
  • 创建应用主类 GatewayZuulApplication ,使用 @EnableZuulProxy 注解开启Zuul的API网关服务功能,代码如下:

    @EnableZuulProxy

    @SpringBootApplication

    public class GatewayZuulApplication {

       

            public static void main(String[] args) {

                    SpringApplication.run(GatewayZuulApplication.class, args);

            }

    }

  • application.yml 中配置 Zuul 应用的基础信息,比如应用名称、端口号等,具体内容如下:

    server:

        port: 9300

    spring:

        application:

            name: gateway-zuul

    完成上面的步骤,基本的 Zuul 实现的 API 网关服务就构建完成了,下面将增加请求路由相关配置。

请求路由

传统路由方式

使用 Spring Cloud Zuul 实现路由功能非常简单,只需要增加一些关于路由的配置,就能实现传统的路由转发功能,比如:

zuul:

    routes:

        api:

            path: /api/**

            url: http://localhost:8080

该配置定义了发往 API 网关服务的请求中,所有符合 /api/** 规则的访问都被路由转发到 http://localhost:8080 地址上,配置属性中的 api 部分为路由的名字,可以任意定义,但是一组 path url 映射关系的路由名要相同。

面向服务的路由

传统的路由配置方式对于我们来说并不友好,需要运维人员花费大量的时间来维护各个路由 path url 的关系,为了解决这个问题 Spring Cloud Zuul 实现了与 Spring Cloud Eureka 的无缝整合,我们可以让路由的 path 不是映射具体的url,而是让映射到具体的服务,而具体的 url 则交给 Eureka 的服务发现机制去自动维护。

  • 为了与 Eureka 整合,我们需要增加 spring-cloud-starter-eureka 依赖,具体如下:

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-starter-eureka</artifactId>

            </dependency>

    调整在 application.yml 中配置,增加 eureka 的注册中心的配置,并配置服务路由,具体如下:

    eureka:

        client:

            service-url:

                defaultZone: http://eurekaserver2:9002/eureka,http://eurekaserver1:9001/eureka

    zuul:

        routes:

            api:

                path: /api/**

                serviceId: org.lixue.helloworld

            consumer:

                path: /consumer/**

                serviceId: eureka-feign-consumer

    # 增加 zuul 超时相关

        host:

            connect-timeout-millis: 10000

            socket-timeout-millis: 5000

    # 增加断路器超时时间

    hystrix:

            command:

                    default:

                            execution:

                                    isolation:

                                            thread:

                                                    timeoutInMilliseconds: 60000

通过面向服务的路由配置方式,我们不需要再为各个路由维护微服务应用的具体实例的位置,而是通过简单的path 与 serviceId 的映射组成,是的维护供桌变得非常简单。

   

posted @ 2017-09-10 22:47  立3807  阅读(1142)  评论(0编辑  收藏  举报