一、前言介绍
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 #控制是否启用过滤器
关注程序员小强公众号更多编程趣事,知识心得与您分享