微服務實戰——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 Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...