springCloud搭建微服務集群+Zuul服務器端負載均衡


  • 概述
     最近研究了一下springCloud的微服務集群,主要用到了SpringCloud的服務發現和服務器端負載均衡,所有的項目都是用的springboot,
    可以和springCloud無縫對接。

  • 技術選型

    服務發現:eureka
    負載均衡:zuul

  • 實現
    Eureka集群(eurekaServer):8001、8002、8003
    服務提供方(eurekaClient):9001、9002
    服務端負載均衡服務:9100

    1、新建工程eureka服務器,用idea創建springboot項目,引入eureka依賴

    下面是三台服務器的配置文件
    //第一台
    server:
      port: 8001
    
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        use-read-only-response-cache: false  #禁用readOnlyMap,分為ReadWriteMap和ReadOnlyMap
        eviction-interval-timer-in-ms: 3000  #主動失效檢測時間
      instance:
        hostname: server8001
      client:
    #    register-with-eureka: false  #false表示不將自己也作為服務注冊到eureka
    #    fetch-registry: false
        service-url:
          #集群設置,搭建eureka集群,用逗號分隔
          defaultZone: http://localhost:8002/eureka/,http://localhost:8003/eureka/
    
    //第二台
    server:
      port: 8002
    
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        use-read-only-response-cache: false
        eviction-interval-timer-in-ms: 3000
      instance:
        hostname: server8002
      client:
    #    register-with-eureka: false #表示不將自己作為服務注冊進eureka
    #    fetch-registry: false
        service-url:
          #集群設置,搭建eureka集群,用逗號分隔,defaultZone是map類型,所以沒有提示
          defaultZone: http://localhost:8001/eureka/,http://localhost:8003/eureka/
    
    //第三台
    server:
      port: 8003
    
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        use-read-only-response-cache: false
        eviction-interval-timer-in-ms: 3000
      instance:
        hostname: server8003
      client:
    #    register-with-eureka: false #表示不將自己作為服務注冊進eureka
    #    fetch-registry: false
        service-url:
          #集群設置,搭建eureka集群,用逗號分隔,defaultZone是map類型,所以沒有提示
          defaultZone: http://localhost:8001/eureka/,http://localhost:8002/eureka/
    
    在入口處加上EnableEurekaServer注解

     

     
    2、服務提供者
    //第一台
    server:
      port: 9001
    
    spring:
      application:
        name: eureka-client
    
    eureka:
      client:
        service-url:
          # 指定集群服務器列表
          defaultZone: http://localhost:8001/eureka/,http://localhost:8002/eureka/,http://localhost:8003/eureka/
      instance:
        instance-id: client9001.com
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 5       #發送心跳包服務刷新時間
        lease-expiration-duration-in-seconds: 15  #服務過期時間
    
    //第二台
    server:
      port: 9002
    spring:
      application:
        name: eureka-client
    
    eureka:
      client:
        service-url:
          # 指定集群服務器列表
          defaultZone: http://localhost:8001/eureka/
      instance:
        instance-id: client9002.com
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 5       #發送心跳包服務刷新時間
        lease-expiration-duration-in-seconds: 15  #服務過期時間
    

    添加EnableEurekaClient注解,並添加api業務測試接口

     

     
    3、zuul負載均衡服務

    server:
      port: 9100
    
    spring:
      application:
        name: zuul-gateway
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8001/eureka,http://localhost:8002/eureka,http://localhost:8003/eureka
        registry-fetch-interval-seconds: 5  #拉取服務列表時間
      instance:
        instance-id: gateway-9100.com
        prefer-ip-address: true
    
    zuul:
      prefix: /gateway
      ignored-services: eureka-client
      routes:
        eureka-client.serviceId: eureka-client
        eureka-client.path: /client/**
    

     依次啟動Eureka服務器、服務提供者client,zull服務,訪問其中一台Eureka服務器的控制台顯示如下

     

     


     

    問題:
    1)、在配置eureka時,defaultZone是個map類型,不提供檢測,所以會發現在配置時沒有提示,直接寫就行;
    2)、eurekaServer的hostname起的作用暫不明確,在控制台顯示的都是application的name,三台eureka集群和兩台服務提供客戶端的application.name分別是一樣的;
    3)、eureka服務器的服務清單分為ReadWriteMap和ReadOnlyMap,其他服務讀取時是從ReadOnlyMap讀取的,當有服務注冊時,寫入的是ReadWriteMap,然后會同步到
    ReadOnlyMap,這是為了解決讀寫鎖的問題。當一台服務提供應用宕機之后會發現控制台還是有這台服務器的信息,表示沒有將服務下線,服務清單列表沒有刪除這台
    服務器的信息,導致zuul在負載均衡時,有時會調用到宕機的那台應用導致返回異常,解決方法是禁用掉eureka服務器的ReadOnlyMap,設置主動失效檢測時間,讓服務器定時
    去檢測服務,服務提供者設置服務失效時間和發送心跳包的時間,zuul設置拉取服務清單的時間間隔
    4)、zuul路由設置,設置路徑前綴和服務的匹配關系

  • 測試

     

     

     

     不停刷新頁面,會在9001和9002之間切換,證明配置成功,關閉9002應用,刷新頁面,剛開始還會出現訪問失敗,過了一段時間后就穩定了,
    會有一個時間差,也可以給zuul配置熔斷器來進行服務降級或者轉發請求到其他正常服務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM