笔记:Spring Cloud Zuul 快速入门

时间:2021-08-05 00:59:30

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 的映射组成,是的维护供桌变得非常简单。