微服務實戰——Spring Cloud + Zuul Gateway + Eureka集成

来源:https://www.cnblogs.com/qupengkun/archive/2020/03/31/12607551.html
-Advertisement-
Play Games

上一篇簡單說了SpringCloud與Eureka的集成。主要解決了微服務間的服務註冊及調用的問題。這一篇集成Zuul,而後結合SpringCloud、Eureka、Zuul環境下進行真實系統聯調,幫助更好的對這些組件的理解。畢竟,實戰才是學習最快的方法。 一、聊聊網關 上篇也提到過,微服務下,各個 ...


上一篇簡單說了SpringCloud與Eureka的集成。主要解決了微服務間的服務註冊及調用的問題。這一篇集成Zuul,而後結合SpringCloud、Eureka、Zuul環境下進行真實系統聯調,幫助更好的對這些組件的理解。畢竟,實戰才是學習最快的方法。

一、聊聊網關

上篇也提到過,微服務下,各個業務模塊都被拆分成相互獨立的微服務。雖然註冊中心(如Eureka)解決了服務內部的註冊發現、健康檢查等問題。但是如何與外部服務進行通信又是一個新的問題了。

舉個慄子

某初創公司,剛剛經歷了一次大的架構改革。將原有的單體架構分解成了很多的微服務進行獨立部署。這些微服務包括用戶鑒權系統、訂單系統、定時任務系統等等。而原有的JSP也被改造成基於HTML下的靜態頁面進行前後端分離部署。

那麼問題來了,因為前後端是分開的,前端同學在調用後端不同服務時要定義各種不同的URI進行調用,管理起來太麻煩,而且,這種情況下一旦後端服務郵編,有需要重新對功能變數名稱進行解析,這也側面增加了運維同學的工作量。而更可怕的是這又與現在大家都在提倡的DevOps完全相悖了。

二、說了這麼多我用Nginx不就行了麽

是的,用Nginx的確是能幫助解決服務統一入口的問題。但是因為Nginx比較偏運維性質,而且其路由配置全部都是基於配置文件的硬編碼方式進行處理。一旦後臺服務發生變化,配置也需要及時更改。這樣也沒有完全解決上述問題。

這時候,網關的出現讓我看到了曙光。通過服務名就可以進行路由轉發,熔斷限流,日誌監控,最主要的是可以開發人員自己通過配置就能輕鬆實現,不用每次都求運維人員去做解析。這樣豈不是也是更符合DevOps了呢。

三、Zuul

Zuul簡單介紹

Zuul在英文中是怪獸的意思,寓意看門神獸。由大名鼎鼎的Netflix開源。並被Pivotal集成入Spring Cloud體系。當前流行的為1.X與2.X系列。主要區別為Zuul從2.X系列開始採用非阻塞非同步模式,大大提升了其性能。他是基於filter機制進行工作。有統一入口、健康檢查、藍綠部署、金絲雀發佈、日誌監控、路由轉發等功能。也可集成Ribbon、Hystrix增加負載均衡、熔斷的功能。

Zuul架構

20200119214049

Spring Cloud Zuul

實際開發中可以根據選擇去集成Zuul網關。也可直接選擇Spring集成好的Spring Cloud Zuul方便更快的使用起來。本篇重點是集成Spring Cloud Zuul。

關於Spring Cloud Zuul與Netflix Zuul相比還是有些許不一樣的。他是基於SpringBoot + Netflix Zuul內核而成,去掉了原有的動態過濾器載入。所以生產環境中還是根據需要自己選擇。

四、話不多說請看代碼

老規矩,附上源碼地址SpingCloud+Zuul+Eureka

操作步驟

  • 還是在原來的spring-cloud-demo(上一篇地址SpringCloud+Eureka)項目上,右鍵創建一個新的model.具體步驟不再贅述。創建完成後項目結構如下:
    20200119215800

  • 引入Zuul依賴
    主要依賴如下:

    <!-- 引入Zuul starter -->
    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter</artifactId>
      </dependency>
      <!-- 連接Eureka -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
    
  • 創建業務模塊provider、consumer,方法跟上一步一樣。創建後項目結構如下:
    20200119220736

    • 其中provider為服務提供者,提供基礎服務的微服務
    • consumer為服務的主要調用者。下一章會講服務之間基於介面(Feign)的調用
  • 配置Zuul路由轉發以及ribbon、hystrix

      spring.application.name = zuul-gateway
      logging.level.org.spring.framework.security = INFO
      #hystrix設置 時間要大於Ribbon時間總和
      hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 90000
      eureka.instance.instance-id = ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
      eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
      #通過eureka發現的服務。使用ribbon
      ribbon.ReadTimeout = 20000
      ribbon.ConnectTimeout = 20000
      zuul.ignoredServices = '*'
      #設置不走ribbon的time-out時間
      zuul.host.connect-timeout-millis = 20000
      zuul.host.socket-timeout-millis = 20000
      #只要訪問以/api/開頭的多層目錄都可以路由到服務名為kxtop-provider的服務上.
      zuul.routes.kxtop-provider.path = /api/**
      zuul.routes.kxtop-provider.service-id= kxtop-provider
      zuul.routes.kxtop-provider.stripPrefix = false
      #kxtop-consumer配置
      zuul.routes.kxtop-consumer.path = /consumer/**
      zuul.routes.kxtop-consumer.service-id = kxtop-consumer
      zuul.routes.kxtop-consumer.stripPrefix = false
      server.port = 4000
      management.endpoints.web.exposure.include = *
    
  • 創建Zuul啟動類

      @EnableDiscoveryClient  //作為Eureka發現者
      @EnableZuulProxy        //開啟Zuul
      @SpringBootApplication
      public class ZuulGatewayApplication {
    
          public static void main(String[] args) {
              SpringApplication.run(ZuulGatewayApplication.class);
          }
      }
    
  • 分別配置provider、consumer配置文件及啟動類

    provider

    spring.application.name = kxtop-provider
    server.port = 5000
    eureka.instance.instance-id = ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
    logging.level.org.spring.framework.security = INFO
    server.servlet.context-path = /api
    management.endpoints.web.exposure.include = *
    -------------------------
    
    @EnableDiscoveryClient
    @SpringBootApplication
    public class ProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class);
        }
    }
    

    consumer

    spring.application.name = kxtop-consumer
    server.port = 6000
    eureka.instance.instance-id = ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
    
    logging.level.org.spring.framework.security = INFO
    server.servlet.context-path = /consumer
    management.endpoints.web.exposure.include = *
    --------------------------
    
    @EnableDiscoveryClient
    @SpringBootApplication
    public class ConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class);
        }
    }
    
  • 整體測試

    1. 啟動Eureka並瀏覽器打開localhost:8761
      20200119222937
    2. 分別啟動項目Zuul、provider、consumer
      20200119223556
      • 保證每個服務都正常運行
      • 服務埠對照
        服務名 埠號
        zuul-gateway 4000
        provider 5000
        consumer 6000
    3. 刷新瀏覽器查看效果(可以看到,服務都已經註冊成功且處於UP狀態)
      20200119224623
    4. postman測試網關調用
    • provider模塊新建TestGatewayController,並重啟provider

        @RestController
        @RequestMapping("/test-gateway")
          public class TestGatewayController {
              @GetMapping
              public String testGateway() {
                  return "Hi! 我是Consumer服務中的TestGatewayController.";
              }
          }
      
    • 訪問localhost:4000/api/test-gateway

      20200119225241

    • 出現上面這句話,訪問成功。請註意:我們訪問的是localhost的4000 埠,也就是配置的Zuul的埠哦,而輸出【Hi! 我是Consumer服務中的TestGatewayController】這句話的方法則是在埠為5000的consumer模塊中定義的。這就就證明我們以配置的網關和服務註冊發現是正確的。當然你也可以做更多的測試。

五、後續

下一篇會針對以上的整合做更加詳細的配置,我們會基於ZuulGateway去做更豐富測試(比如provider、consumer模塊如果是部署集群網關該怎樣處理?他們之間的負載均衡策略又是怎樣的?連接超時、惡意訪問怎樣做熔斷限流?服務之間如何調用?),進行接近生產級項目的配置。敬請關註!

持續學習,記錄點滴。更多文章請訪問 文章首發


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

-Advertisement-
Play Games
更多相關文章
  • 首先保證這些條件滿足: 然後全局安裝vue cnpm install -g vue-cli 安裝完成後可以使用vue -h查看vue的幫助文檔 vue -list 查看vue支持的模板 我們接下來會用到的是webpack vue init webpack mall 項目名輸入必須是英文,我這裡輸入m ...
  • HTML URL代表HTML 統一資源定位器(Uniform Resource Locators),URL是一個網頁地址,URL可以由字母組成,如"W3CSchools.cc",或互聯網協議(IP)地址: 192.68.20.50;大多數人進入網站使用網站功能變數名稱來訪問,因為 名字比數字更容易記住。 U ...
  • 關於object標簽,現在已經很少使用了,但在考慮到相容性的問題上,還是會用到object標簽的。 在對object標簽的使用中,會出現播放視頻的 object 標簽遮蓋住其他 div 標簽,使其不能正常顯示。 1 <div class="btn-group" style="width:100px; ...
  • jquery 動畫 隱藏與顯示 1. hide(ms,callback)——隱藏 2. show()——顯示 3. toggle()——隱藏或者顯示 + 可以帶一個整數參數,表示動畫的時間;callback參數表示回調函數 + 動畫效果是向左上角收縮或打開的。 淡入淡出 1. fadeIn(ms,c ...
  • 官方文檔:React 中一個常見模式是為一個組件返回多個元素。Fragments 可以讓你聚合一個子元素列表,並且不在DOM中增加額外節點。 作用:代替div作為外層的包裹層。 Fragments看起來像是一個空的標簽。 render() { return ( <> <ChildA /> <Chil ...
  • 官網 http://mint-ui.github.io/#!/zh-cn 安裝 cnpm install mint-ui -S 在main.js中引入改插件 Toast效果演示: 查看文檔 在頁面中調用插件 Message box效果演示: 這是移動端插件,所以調整到移動端演示: 底部tabbar演 ...
  • 聊聊服務發現註冊 服務多,迭代快是微服務的明顯特征。那麼在快速小版本迭代業務時,如果按照傳統的方式發佈更新服務,手動的修改一些服務與服務之間的調用關係是非常麻煩且累人的。一個典型的場景可能是,一個微服務升級迭代之後,硬體環境發生改變(IP等的變化)。傳統的做法是修改與其有調用關係的微服務調用地址然後 ...
  • 說在前面 大概是三年前,因一些原因公司原項目最初為單體結構部署,所有業務模塊都在一個項目裡面,而後隨著業務的不斷膨脹以及模塊之間的耦合,導致後面增加或修改一些簡單業務時的成本都會變的極大。新入職的同事更是苦不堪言,學習代碼的成本極高。基於這些原因,就開始了後面漫長的架構改造旅途。 這麼多微服解決方案 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...