一、前言介紹
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: authservice
user-safe:
path: /user/safe/**
serviceId: safeservice
user:
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: /api
routes:
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 #控制是否啟用過濾器
關注程式員小強公眾號更多編程趣事,知識心得與您分享

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227173.html
標籤:其他
下一篇:K8S安全-RBAC
