认识Zuul

在微服务架构中,Zuul 可以作为 API Gateway(API 网关),它充当着客户端和服务端之间的桥梁。使用 Zuul
作为网关有几个优点:

  1. 简化客户端:通过将所有对外服务的请求集中在一个网关上,客户端只需要与这个单一的入口点打交道,而不是与多个微服务直接交互。这减少了客户端的复杂度。

  2. 跨域支持:Zuul 可以配置来处理跨域资源共享(CORS)的问题,这意味着它可以更轻松地管理来自不同源的请求。

  3. 易于重构:当需要调整微服务边界时,Zuul 可以帮助隔离变化,减少客户端受到的影响。这意味着可以在不改变客户端代码的情况下调整服务端结构。

  4. 安全性和防护:Zuul 可以用来实施统一的安全策略,如认证和授权。此外,它还可以提供防火墙功能,保护内部服务不受外部恶意请求的影响。

  5. 路由和负载均衡:Zuul 可以根据请求的 URL 和其它条件决定请求应该被发送到哪个服务实例,同时可以利用 Ribbon 进行智能负载均衡。

  6. 请求过滤器:Zuul 支持请求前后的过滤器机制,允许开发者在请求进入服务之前或响应返回给客户端之前执行一些操作,比如记录请求日志、修改请求/响应等。

  7. 断路器模式:Zuul 可以与 Hystrix 结合使用,来实现服务间的断路器模式,当某个服务出现问题时,可以快速失败而不影响整个系统的稳定性。


简单的例子

好的,让我们用一个简单的例子来解释 Zuul 在微服务架构中的作用。

想象一下,你正在经营一家大型购物中心。这家购物中心里有很多不同的店铺,每个店铺都销售不同类型的商品,比如服装店、书店、餐厅等。这些店铺就像是一个个独立的微服务,它们各自负责一部分业务逻辑。

现在,假设你是顾客,想要在这个购物中心里购物。如果购物中心没有统一的入口,你每次想要购物时,就需要知道每个店铺的确切位置,甚至可能还需要了解不同店铺的营业时间和特别规定。这会让购物体验变得非常复杂和不便。

为了解决这个问题,购物中心设置了一个统一的大门,也就是“服务网关”。这个大门就像是 Zuul,在这里,顾客(客户端)只需要知道购物中心的位置,不需要知道具体店铺在哪里。当你进入大门后,会有工作人员(类似于 Zuul 中的过滤器)帮助你导航到你需要去的店铺,并处理可能出现的各种问题,如维护期间的临时关闭、排队等候等。

此外,如果购物中心里的店铺位置发生变化(对应于微服务的重构),你作为顾客并不需要知道这些变化,因为你总是通过同一个大门进入购物中心。这就像 Zuul 帮助隐藏了服务变更,从而让客户端的体验保持一致。

再者,购物中心的大门也可以帮助处理一些公共事务,比如安全检查(身份验证)、控制人流(负载均衡)、处理紧急情况(断路器)等等。所有这些功能都可以在顾客接触到具体的店铺之前处理好,确保了顾客有一个顺畅的购物体验。

所以,Zuul 就像是购物中心的大门,它帮助客户简化了访问流程,同时提供了额外的安全性和便利性。


第一个Zuul程序

步 骤:

1.搭建eureka-server项目

2.搭建服务提供者eureka-provider项目

3.搭建服务消费者eureka-consumer项目

4.搭建网关服务gateway-zuul项目

5.项目测试

步骤1:创建父工程zuul-1

将搭建的Eureka基本应用中的3个子项目都复制到zuul-1父工程中,并依次添加为Maven项目。
在这里插入图片描述

步骤2:创建HystrixController类

改造服务提供者eureka-provider项目

新建controller包,在controller包下创建HystrixController类:
在这里插入图片描述

步骤3:搭建服务消费者eureka-consumer项目

改造服务消费者eureka-consumer项目

(1)创建一个config包,在config包下新建配置类RestConfig

在这里插入图片描述

(2)创建一个service包,在service包下新建LocalItemService类

在这里插入图片描述

(3)创建一个controller包,在controller包下新建LocalItemController类

在这里插入图片描述

步骤4:创建网关服务gateway-zuul项目

(1)创建gateway-zuul项目,导入依赖

使用Spring Initializr方式创建一个名称为gateway-zuul的Spring Boot项目,这里将Group命名为com.bushuo,将Artifact命名为gateway-zuul,添加Zuul、Test、Eureka Client、Web依赖。其中,Zuul依赖具体如下:

 <dependency>

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

            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

        <dependency>

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

            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

注意版本号要与springboot一致最好
springboot的版本号

添加配置文件

(2)在配置文件进行相关配置

引入依赖后,在全局配置文件application.yml进行相关配置,包括配置程序名称、端口号,服务注册地址等,配置后的application.yml代码如下:
在这里插入图片描述

server:
  port: 8835
spring:
  application:
    name: gateway-zuul
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7071/eureka/
zuul:
  routes:
    eureka-consumer:
      path: /eureka-consumer/**

(3)开启Zuul功能

在项目gateway-zuul的启动类GatewayZuulApplication添加@EnableZuulProxy注解开启服务网关Zuul功能。
在这里插入图片描述
项目测试

依次启动项目eureka,eureka-provider,eureka-consumer,gateway-zuul。启动成功后,使用浏览器访问http://localhost:7071。
在这里插入图片描述

这里我们访问消费者服务跟之前有所不同,通过网关服务访问消费者需要在访问地址前加上在application.yml文件中配置的Zuul路由的前缀/eureka-consumer,访问路径:http://localhost:8835/eureka-consumer/hi?id=1,观察效果。
在这里插入图片描述

思考:

1.该地址等价于?

实际等价的具体地址取决于 eureka-consumer 服务的具体配置和部署情况。
http://localhost:7071/eureka/

2.什么是spring cloud zuul?

Spring Cloud Zuul 是一个用于微服务架构的 API网关。它主要负责将外部请求路由到后端服务,并提供了过滤器机制来处理请求的预处理和后处理任务。具体来说,Zuul 具有以下功能:

路由功能:作为前端网关,Zuul 根据配置的规则将请求转发到不同的微服务。

过滤器模式:Zuul 允许在请求生命周期的不同阶段执行自定义逻辑,如认证、日志记录、请求和响应的修改等。

负载均衡:通过与 Ribbon 的集成,Zuul可以实现请求到后端服务实例的智能分配。

容错机制:利用 Hystrix 断路器,Zuul 提高了系统的健壮性,防止因单个服务故障导致整体系统不可用。

1. 路由功能

  • 理解:Zuul 作为 API 网关,就像机场的安检和登机口,负责检查和引导乘客(请求)到正确的航班(服务)。
  • 应用:假设你有一个电商平台,用户的所有请求(如登录、购物车、订单)都先经过 Zuul,然后 Zuul 根据请求类型(如 URL 路径)将其路由到相应的微服务(如用户服务、购物车服务、订单服务)。

2. 过滤器模式

  • 理解:Zuul 的过滤器类似于机场的安全检查站,可以检查行李(请求数据),并在乘客(请求)登机(到达服务)前后执行特定任务。
  • 应用:在请求到达服务之前,Zuul 可以执行认证(检查用户是否已登录)、日志记录(记录请求详情)、请求修改(如增加请求头或参数)。在请求完成后,还可以修改响应(如添加响应头)。

3. 负载均衡

  • 理解:Zuul 可以像机场调度中心一样,智能地分配飞机(服务实例)来处理乘客(请求)。
  • 应用:如果用户的请求需要访问“订单服务”,而“订单服务”有多个实例,Zuul 会根据负载均衡策略(如轮询、随机)选择一个合适的实例来处理请求。

4. 容错机制

  • 理解:Zuul 使用 Hystrix 断路器,就像电路中的保险丝,当电流(请求)过大时(如服务故障),会自动切断电流(停止请求),防止整个电路(系统)烧毁。
  • 应用:如果某个服务暂时不可用,Zuul 会停止向该服务发送请求,并返回一个友好的错误消息,而不是让整个系统崩溃。

5. 总结

  • 理解:Zuul 不仅是一个门卫,还是一个多才多艺的助手,不仅引导请求到正确的位置,还能在过程中做很多有用的工作,从而增强系统的安全性、可维护性和性能。
  • 应用:通过 Zuul,开发人员可以集中管理所有的外部请求,确保每个请求都被恰当地处理,同时也能快速定位和解决潜在的问题。

结合实际场景加深理解

想象一下,你在设计一个在线教育平台,平台上有多种服务,如课程服务、支付服务、评论服务等。使用 Zuul 可以让你的架构更加清晰,同时还能增强系统的鲁棒性和扩展性。用户的所有请求首先到达 Zuul,然后 Zuul 决定请求应路由到哪个服务,并在必要时执行过滤逻辑,如认证、日志记录等。

总结

在编程当中,我需要明白有风有雨是生活的常态,以风雨无阻的心态去面对,保持风雨的兼程的状态。
这是我对 Zuul 的初步认识,欢迎各位专业人士给予指点并予以纠正。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐