当前位置: 代码迷 >> 综合 >> [SpringCould篇]之服务网关(zuul)介绍与配置
  详细解决方案

[SpringCould篇]之服务网关(zuul)介绍与配置

热度:11   发布时间:2023-12-03 19:38:28.0

一、前言介绍

1.什么是服务(API)网关?

服务网关也就是API网关,可以作为服务的统一入口。
可提供身份校验、动态路由、负载均衡、安全管理、统计、监控、流量管理、灰度发布、压力测试等功能。

API 网关有很多实现方式,如:Spring Cloud Zuul、 Nginx、Tyk、Kong。

本篇介绍的对象正是 Spring Cloud Zuul

Spring Cloud Zuul 是基于 Netflix Zuul 的微服务路由和过滤器的解决方案,也用于实现 API 网关。其中,路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入门的基础。而过滤功能是负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。

Spring Cloud Zuul 和 Eureka 进行整合时,Zuul 将自身注册到 Eureka 服务中,同时从 Eureka 中获取其他微服务信息,以便请求可以准确的通过 Zuul 转发到具体微服务上。

2.什么是Zuul?

Zuul是Netflix开源的服务网关/API网关,提供动态路由、监控、弹性、安全性等功能。

3.过滤器类型

Zuul中有以下几种典型的过滤器类型。

  • pre:在请求被路由到目标服务前执行;
  • routing:在请求被路由到目标服务时执行,这是使用Apache HttpClient或Netflix Ribbon构建和发送原始HTTP请求的地方;
  • post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;
  • error:请求在其他阶段发生错误时执行。

4.过滤器常见使用场景

  • 前置(Pre)
    • 限流
    • 鉴权
    • 参数校验调整
    • 日志打印
  • 后置(Post)
    • 统计
    • 日志

5.过滤器生命周期在这里插入图片描述

二、路由配置

1.路由配置参数说明

  • 路由配置基础参数说明
    | 配置项 | ken.io 的说明 |
    | — | — |
    | zuul.routes.{routename} | 路由名称,自定义,支持小写字母、- |
    | zuul.routes.{routename}.path | 要路由的路径,支持通配符:?、_ 、*_ |
    | zuul.routes.{routename}.serviceId | 注册在Eureka的ServiceName |
    | zuul.routes.{routename}.url | 如果应用没有注册在Eureka,也可以通过指定Url来路由 |
    | zuul.ignored-services | 忽略指定的服务,可以配置多个,以,间隔 |
    | zuul.ignored-patterns | 忽略指定的路径,可以配置多个,以,间隔。同样支持通配符 |

  • path通配符说明
    | 通配符 | 说明 | path举例 | 匹配示例 |
    | — | — | — | — |
    | ? | 匹配单个任意字符 | /test/? | /test/a、/test/b |
    | * | 匹配任意字符 | /test/* | /test/a、/test/b、/test/ab |
    | ** | 匹配任意字符且支持多级目录 | /test/** | /test/a、/test/b、/test/ab、/test/ab/c |

注:若对于通配符来说,没有特定的需求,使用**就好

2.路由配置示例

2.1路由到到不同的服务

zuul:routes:api-ribbon:path: /api-ribbon/**serviceId: server-consum-ribbon

适用于:服务随着业务的发展不断扩大需要拆分,这时候我们可以通过api兼容+路由配置来适配,可以对上游无感知。
例如用户服务(userservice)有三个核心模块,auth、info、safe,经过拆分拆出来两个服务:authservice、safeservice。那么拆分后的路由配置:

zuul:routes:user-auth:path: /user/auth/**serviceId: authserviceuser-safe:path: /user/safe/**serviceId: safeserviceuser:path: /user/**serviceId: userservice

因为路由规则匹配顺序是按配置顺序来的,所以未拆出去的配置在最后。

2.2路由到指定站点

当某应用并没有注册到服务注册中心(Eureka),但又需要可以通过指定url的访问

zuul:routes:ken-io:path: /ken/**url: https://ken.io/

2.3忽略指定路径

适用于某些通用的接口不暴露给外部,
例如每个应用都会有一个健康检查入口,但是这个入口是不应该暴露给外部的,就可以通过忽略规则屏蔽掉。

zuul:ignored-patterns: /**/hs,/**/health

2.4忽略指定服务

zuul:ignored-services: aservice,bservice

2.5配置访问前缀

可以通过以下配置来给网关路径添加前缀,此处添加了/api前缀,
这样我们需要访问http://xxx:port/api/xxxx才能访问到接口

zuul:prefix: /api #给网关路由添加前缀

2.6不同API路由统一前缀

在不同服务路由的开头附加一个的前缀是很常见的
比如希望在不同服务的路由的开头都加上一个/api的前缀,Zuul也是支持的。可以使用如下配置来实现这一功能:

zuul:ignored-services: '*'prefix: /apiroutes:organizationservice: /organization/**licenseservice: /license/**

2.7Header过滤及重定向添加Host

  • Zuul在请求路由时,默认会过滤掉一些敏感的头信息,以下配置可以防止路由时的Cookie及Authorization的丢失:
zuul:sensitive-headers: Cookie,Set-Cookie,Authorization #配置过滤敏感的请求头信息,设置为空就不会过滤
  • Zuul在请求路由时,不会设置最初的host头信息,以下配置可以解决:
zuul:add-host-header: true #设置为true重定向是会添加host请求头

2.8常用配置

zuul:routes: #给服务配置路由user-service:path: /userService/**feign-service:path: /feignService/**ignored-services: user-service,feign-service #关闭默认路由配置prefix: /proxy #给网关路由添加前缀sensitive-headers: Cookie,Set-Cookie,Authorization #配置过滤敏感的请求头信息,设置为空就不会过滤add-host-header: true #设置为true重定向是会添加host请求头retryable: true # 关闭重试机制PreLogFilter:pre:disable: false #控制是否启用过滤器

关注程序员小强公众号更多编程趣事,知识心得与您分享
在这里插入图片描述