SpringCloud入坑记-Zuul 初探

在这里插入图片描述

简介(是什么)

服务拆分,使得原本清晰的业务线不那么明朗了,各个服务散落在不同角落,为了实现一个具体的业务逻辑,可能调用多个不同的服务,此时需要一个面向服务治理的组件——网关,Zuul就是在这种场景下诞生的。

在没有引入网关时,用户的请求的一个购买请求需要调用多个微服务。

在这里插入图片描述

此时可能遇到的问题:

  • 请求由客户端(网页、APP)控制,对其来说稍显复杂
  • 需要解决跨域问题
  • 很多服务需要认证授权

在引入网关后,用户请求直达网关,由网关决定之后的请求分发到哪个微服务。

在这里插入图片描述

此时带来的好处:

  • 请求由后端控制,易于监控
  • 认证、鉴权、登录一步搞定

Zuul is the front door for all requests from devices and web sites to the backend fo the Netflix streaming application.

Zuul像网站后端应用的前门,其底层是Servlet,本质是过滤器,从代码层面看是一系列Filter所构成的责任链。

案例(怎么用)

创建项目ms-g1-zuul,添加网关依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

添加注解:

@EnableZuulProxy

添加配置:

server:
  port: 10070
spring:
  application:
    name: zuul-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
zuul:
  routes:
    product:
      path: /product/**
      serviceId: product-service

这里Zuul网关的端口为 10070,项目名为zuul-server。
关于zuul的配置在最后几行:

  • product 我起的路由名称
  • path 表示将所有 /product开头的请求做URL映射
  • serviceId 即服务名称

依次启动3个项目:

  • ms-a1-eureka-server 注册中心
  • ms-c1-product-service 服务提供者
  • ms-g1-zuul 网关服务

路由配置

路由规则在实际项目中可能非常复杂,Zuul提供了多种方式来进行路由配置。

基础配置

zuul:
    routes:
        product-service: /product/**

product-service服务映射到 ‘/product’

忽略服务

zuul:
    ignored-services: product-service, user-service

这样Zuul就不会处理被忽略的服务,而代理其他服务。

zuul:
    ignored-patterns: /**/delete/**

忽略某些接口,屏蔽掉服务中含有delete的接口。

路由指定服务

zuul:
    ignored-services: '*'
    routes:
        product-service: /product/**

这样Zuul就只路由 product-service服务。

多个路由规则

zuul:
    routes:
        route-rule-a:
            serviceId: product-service
            path: /product/**
        route-rule-b:
            serviceId: user-service
            path: /user/**

这里的route-rule-a只是一个名称,没有实际意义。

路由某个URL

zuul:
    routes:
        user-route:
            url: http://localhost:8080/
            path: /user/**

这里不是路由某个服务,而是代理一个URL地址。

路由前缀

zuul:
    prefix: /ms-service
    strip-prefix: false
    routes:
        product-service: /product/**

在访问Zuul服务 /ms-service/product-service/s1路径时,请求会被转发到product-service服务的/ms-service/s1

失败重试

zuul:
    retryable: true  // 开启重试机制
ribbon:
    MaxAutoRetries: 2  // 服务失败重试次数
    MaxAutoRetriesNextServer: 1 //切换相同服务数量

某些场景下,开启自动重试能提升用户体验。

配置说明

在上面的举例中,映射路径使用的是/product/**,还有其他几种选项:

配置方式 说明 举例
/** 匹配任意路径 /product/add,/product/save,/product/id/123
/* 匹配单级路径 /product/add,/product/save,/product/list
/? 匹配一个字符 /product/a,/product/s

未完待续

Zuul是外界进入微服务应用内部的入口,其原理不复杂,但是需要面对的业务场景太多,因此需要较好的扩展性,Zuul还给用户暴露了更多了扩展能力,在下一节中将从Zuul的生命周期来探索更多可能。

项目代码托管于Github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章