SpringCloud之初識Zuul(網關)---動態路由,許可權驗證

来源:https://www.cnblogs.com/zhaosq/archive/2019/03/15/10521098.html
-Advertisement-
Play Games

通過前面的學習,使用Spring Cloud實現微服務的架構基本成型,大致是這樣的: 我們使用Spring Cloud Netflix中的Eureka實現了服務註冊中心以及服務註冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了 ...


通過前面的學習,使用Spring Cloud實現微服務的架構基本成型,大致是這樣的:

我們使用Spring Cloud Netflix中的Eureka實現了服務註冊中心以及服務註冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了應用多環境的外部化配置以及版本管理。為了使得服務集群更為健壯,使用Hystrix的融斷機制來避免在微服務架構中個別服務出現異常時引起的故障蔓延。

 

在該架構中,我們的服務集群包含:內部服務Service A和Service B,他們都會註冊與訂閱服務至Eureka Server,而Open Service是一個對外的服務,通過均衡負載公開至服務調用方。我們把焦點聚集在對外服務這塊,直接暴露我們的服務地址,這樣的實現是否合理,或者是否有更好的實現方式呢?

 

先來說說這樣架構需要做的一些事兒以及存在的不足:

  • 首先,破壞了服務無狀態特點。

    • 為了保證對外服務的安全性,我們需要實現對服務訪問的許可權控制,而開放服務的許可權控制機制將會貫穿並污染整個開放服務的業務邏輯,這會帶來的最直接問題是,破壞了服務集群中REST API無狀態的特點。

    • 從具體開發和測試的角度來說,在工作中除了要考慮實際的業務邏輯之外,還需要額外考慮對介面訪問的控制處理。

  • 其次,無法直接復用既有介面。

    • 當我們需要對一個即有的集群內訪問介面,實現外部服務訪問時,我們不得不通過在原有介面上增加校驗邏輯,或增加一個代理調用來實現許可權控制,無法直接復用原有的介面。

面對類似上面的問題,我們要如何解決呢?答案是:服務網關

為瞭解決上面這些問題,我們需要將許可權控制這樣的東西從我們的服務單元中抽離出去,而最適合這些邏輯的地方就是處於對外訪問最前端的地方,我們需要一個更強大一些的均衡負載器的 服務網關。

服務網關是微服務架構中一個不可或缺的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了許可權控制等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,為微服務架構提供了前門保護的作用,同時將許可權控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集群主體能夠具備更高的可復用性和可測試性。

 

一:簡介

官網:https://github.com/Netflix/zuul

Zuul:維基百科:

電影《捉鬼敢死隊》中的怪獸,Zuul,在紐約引發了巨大騷亂。

事實上,在微服務架構中,Zuul就是守門的大Boss!一夫當關,萬夫莫開!

1.1:Zuul加入後的架構

  

   不管是來自於客戶端(PC或移動端)的請求,還是服務內部調用。一切對服務的請求都會經過Zuul這個網關,然後再由網關來實現 鑒權、動態路由等等操作。    Zuul就是我們服務的統一入口。

1.2.快速入門

1.2.1.新建工程

填寫基本信息:

 

添加Zuul依賴:

 

1.2.2.編寫啟動類

通過@EnableZuulProxy註解開啟Zuul的功能:

@SpringBootApplication
@EnableZuulProxy // 開啟Zuul的網關功能
public class ZuulDemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(ZuulDemoApplication.class, args);
  }
}

1.2.3.編寫配置

server:
  port: 10010 #服務埠
spring:
  application:
    name: api-gateway #指定服務名

1.2.4.編寫路由規則

我們需要用Zuul來代理user-service服務,先看一下控制面板中的服務狀態:

  • ip為:127.0.0.1

  • 埠為:8081

映射規則:

zuul:
  routes:
    user-service: # 這裡是路由id,隨意寫
      path: /user-service/** # 這裡是映射路徑
      url: http://127.0.0.1:8081 # 映射路徑對應的實際url地址 

我們將符合path 規則的一切請求,都代理到 url參數指定的地址

本例中,我們將 /user-service/**開頭的請求,代理到http://127.0.0.1:8081

1.2.5.啟動測試:

訪問的路徑中需要加上配置規則的映射路徑,我們訪問:http://127.0.0.1:8081/user-service/user/10

1.3.面向服務的路由

  在剛纔的路由規則中,我們把路徑對應的服務地址寫死了!如果同一服務有多個實例的話,這樣做顯然就不合理了。

  我們應該根據服務的名稱,去Eureka註冊中心查找 服務對應的所有實例列表,然後進行動態路由才對!

   1.3.1.添加Eureka客戶端依賴

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

   1.3.2.開啟Eureka客戶端發現功能

@SpringBootApplication
@EnableZuulProxy // 開啟Zuul的網關功能
@EnableDiscoveryClient
public class ZuulDemoApplication {

   public static void main(String[] args) {
     SpringApplication.run(ZuulDemoApplication.class, args);
  }
}

1.3.3.添加Eureka配置,獲取服務信息

eureka:
  client:
    registry-fetch-interval-seconds: 5 # 獲取服務列表的周期:5s
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1

1.3.4.修改映射配置,通過服務名稱獲取

    因為已經有了Eureka客戶端,我們可以從Eureka獲取服務的地址信息,因此映射時無需指定IP地址,而是通過服務名稱來訪問,而且Zuul已經集成了Ribbon的負載均衡功能。

zuul:
  routes:
   user-service: # 這裡是路由id,隨意寫
     path: /user-service/** # 這裡是映射路徑
     serviceId: user-service # 指定服務名稱

 

1.3.5.啟動測試

  再次啟動,這次Zuul進行代理時,會利用Ribbon進行負載均衡訪問:

日誌中可以看到使用了負載均衡器:

1.4.簡化的路由配置

  在剛纔的配置中,我們的規則是這樣的:

  • zuul.routes.<route>.path=/xxx/**: 來指定映射路徑。<route>是自定義的路由名

  • zuul.routes.<route>.serviceId=/user-service:來指定服務名。

而大多數情況下,我們的<route>路由名稱往往和 服務名會寫成一樣的。因此Zuul就提供了一種簡化的配置語法:zuul.routes.<serviceId>=<path>

比方說上面我們關於user-service的配置可以簡化為一條:

zuul:
  routes:
    user-service: /user-service/** # 這裡是映射路徑

省去了對服務名稱的配置。

1.5.預設的路由規則

  在使用Zuul的過程中,上面講述的規則已經大大的簡化了配置項。但是當服務較多時,配置也是比較繁瑣的。因此Zuul就指定了預設的路由規則:

  • 預設情況下,一切服務的映射路徑就是服務名本身。

    • 例如服務名為:user-service,則預設的映射路徑就是:/user-service/**

  也就是說,剛纔的映射規則我們完全不配置也是OK的,不信就試試看。

1.6.路由首碼

  配置示例:

zuul:
  prefix: /api # 添加路由首碼
  routes:
    user-service: # 這裡是路由id,隨意寫
      path: /user-service/** # 這裡是映射路徑
      service-id: user-service # 指定服務名稱

我們通過zuul.prefix=/api來指定了路由的首碼,這樣在發起請求時,路徑就要以/api開頭。

路徑/api/user-service/user/1將會被代理到/user-service/user/1

1.7.負載均衡和熔斷

   Zuul中預設就已經集成了Ribbon負載均衡和Hystix熔斷機制。但是所有的超時策略都是走的預設值,比如熔斷超時時間只有1S,很容易就觸發了。因此建議我們手動進行配置:

zuul:
  retryable: true
ribbon:
  ConnectTimeout: 250 # 連接超時時間(ms)
  ReadTimeout: 2000 # 通信超時時間(ms)
  OkToRetryOnAllOperations: true # 是否對所有操作重試
  MaxAutoRetriesNextServer: 2 # 同一服務不同實例的重試次數
  MaxAutoRetries: 1 # 同一實例的重試次數
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMillisecond: 6000 # 熔斷超時時長:6000ms


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關鍵步驟: 1.傳兩個參數:pageCount (每頁條數)、pageIndex (頁碼數); 2.bind方法的調用 本例對特別請求特別多數據時,該方法大有用處。僅作參考。如有疑問,請聯繫。。。 ...
  • 對象就是無序鍵值對的集合 ...
  • 1. ios中音頻不自動播放; 原因:出於節省流量的初衷,ios系統禁止音視頻自動播放。 解決方案:使用微信的JS-SDK。 DEMO: 先引入微信的JS-SDK, 然後在wx.ready中調用play方法播放。 2. 微信升級到7.0版本以後,填寫表單信息彈出鍵盤會把頁面頂上去,鍵盤消失的時候頁面 ...
  • 第一次寫博客,想了半天先從簡單的三層架構開始吧,希望能幫助到你! 簡單介紹一下三層架構, 三層架構從上到下分:表現層(UI),業務邏輯層(BLL),數據訪問層(DAL)再加上數據模型(Model),用ef訪問資料庫,Model也就是與資料庫表映射的實體。廢話少說,上代碼。 Model層 為方便說明, ...
  • 程式員在普通人的印象里是一份嚴(ku)謹(bi)的職業,也是一個被搞怪吐槽樂此不疲的職業,程式員們面對複雜的代碼敲打電腦時連眉頭都不會皺一下,但是有一個詞卻是他們痛苦的根源,它就是Bug。 有不少的新手程式員,剛開始都是從修BUG開始做起的。 修bug有助於熟悉項目,瞭解大概哪些類參與了執行線路,相 ...
  • 一,如何渲染數據 什麼是渲染數據:簡單的說就是把後臺數據渲染到頁面當中去。 1.渲染數據的方式有四種 (1)字元串拼接 1.案例分析 原有的list中有三個li,並且每個li身上有onmouseover事件 2.字元串拼接是最常用的方法 3.優點:只進行一次dom迴流 4.缺點:原有dom的事件都會 ...
  • RabbitMQ簡介 RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟體(亦稱面向消息的中間件)。 RabbitMQ是一套開源(MPL)的消息隊列服務軟體,是由LShift提供的一個Advanced Message Queuing Protocol(AMQP)的開源實現,由以高性 ...
  • 最近幫朋友做個網站,實現用郵箱訂閱功能,所以現在把這個發送郵件的功能放在這裡,算是這兩天工作的總結吧! 首先,想要實現訂閱功能,要把郵箱保存,但是這個做的是個小網站,前後臺交互的太少了,所以我就直接保存在了文件裡面,用到的時候,直接讀取。 下麵是保存郵箱號到本地文件的代碼。 這裡用到的就是簡單的輸入 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...