Spring Cloud 常用組件學習

SpringBoot 與 SpringCould 是什麼?它們的出現是爲了解決什麼問題?

Spring Boot:是一種服務開發技術;是爲了達到簡化項目的目的。

Spring Cloud:分佈式微服務架構的一站式解決方案,是多種微服務架構落地技術的集合體,俗稱微服務全家桶;是爲了解決大型項目中,各種出現的問題,提高系統的整體性能。

在對 Boot 和 Cloud 版本選擇注意事項:

  建議嚴格按照官方版本採用 Json 串中的來選擇。也可以在下圖的鏈接裏,找到當前 Cloud 推薦使用的 Boot 版本。
在這裏插入圖片描述

故,在本次的學習中,版本選擇如下:

  • Cloud:Hoxton.SR4
  • Boot:2.2.5.RELEASE
  • Java:1.8
  • Cloud Alibaba:??

Cloud 中的模塊及實例

在這裏插入圖片描述
  各個模塊都有不同的實現,但有些實現已經停更,選用時,需要權衡利弊。


Eureka: 服務治理、註冊、發現

Eureka:類似ZK的功能,其服務架構與 dubbo 的對比如下:
在這裏插入圖片描述
Eureka 的兩個組件:

  • Eureka Server:微服務中的各個節點到 Server 中去註冊自己的信息。
  • Eureka Client:一個 Java 客戶端,用於簡化與 Server 的交互。Client 會以 30 秒爲週期向 Server 端發送心跳,Server 在 90s 沒有收到某一個 Client 的心跳時,將會移除該節點。

Eureka 集羣

Q:爲什麼我們需要 Eurake 集羣?

A:爲保障服務註冊、服務調用的高可用性

搭建 Eureka 註冊中心集羣,各節點間 互相註冊,相互守望,實現 負載均衡 + 故障容錯 的功能。

Dubbo 是一個 RPC 調用方式的分佈式服務組件之一,Eureka 提供的是 REST API 的調用方式。

Eureka 在啓動類使用 @EnableEurekaServer 標識該應用爲註冊中心,在啓動類使用 @EnableEurekaClient 標識該應用爲服務提供方或消費方

1. 註冊中心配置文件

server:
  port: 7001
spring:
  application:
    name: eureka-server7001  #eureka服務端的實例名稱,當與 hostname 同時存在時,採用applicationName
      #在消費、提供方的應用中,該名稱爲Eureka中Application的值,若provider爲集羣,則name值應當一致,才能讓消費方通過一個name調用到多個提供方節點應用

eureka:
  instance:
    hostname: eurekaServer7001.com #eureka服務端的實例名稱
  client:
    register-with-eureka: false     #false表示不向註冊中心註冊自己。
    fetch-registry: false     #false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
    service-url:
      #集羣指向其它eureka
      defaultZone: http://localhost:7002/eureka/
      #單機就是7001自己
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

2. 服務提供方配置文件

server:
  port: 8001
spring:
  application:
    #在消費、提供方的應用中,該名稱爲Eureka中Application的值,若provider爲集羣,則name值應當一致,才能讓消費方通過一個name調用到多個提供方節點應用
    name: eureka-provider7002

eureka:
  client:
    #表示是否將自己註冊進EurekaServer默認爲true。
    register-with-eureka: true
    #是否從EurekaServer抓取已有的註冊信息,默認爲true。單節點無所謂,集羣必須設置爲true才能配合ribbon使用負載均衡
    fetchRegistry: true
    serviceUrl:
      #defaultZone: http://localhost:7001/eureka/
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
  instance:
    #在eurakeServer中採用IP形式的鏈接地址
    preferIpAddress: true
    #定義實例ID格式,即eureka中節點的顯示名稱
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

3. 服務消費方配置文件

server:
  port: 9001
spring:
  application:
    name: eureka-consumer7003

eureka:
  client:
    #表示是否將自己註冊進EurekaServer默認爲true。
    register-with-eureka: true
    #是否從EurekaServer抓取已有的註冊信息,默認爲true。單節點無所謂,集羣必須設置爲true才能配合ribbon使用負載均衡
    fetchRegistry: true
    serviceUrl:
      #defaultZone: http://localhost:7001/eureka/
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka/

Eureka 自我保護機制

在這裏插入圖片描述
什麼是自我保護機制?

  當 Eurekaserver 在一定時間內沒有收到實例的心跳,便會把該實例從註冊表中刪除(默認是90秒),但是,如果短時間內丟失大量的實例心跳,便會觸發 Eurekaserver 的自我保護機制,不再註銷任何服務實例。

爲什麼需要自我保護機制?

  爲防止 EurekaClient 可以正常運行,但短時間內與 EurekaServer 網絡不通的情況下,EurekaServer 將 EurekaClient 服務剔除的誤操作現象。所以,自我保護模式是一種應對網絡異常的安全保護措施。

關閉自我保護機制
  在實際開發中,我們會不斷的重啓服務,所以需要 Eurake 服務端及時的刪除失效的服務。在生產環境不推薦使用。

  1. 在服務註冊端:
eureka:
	server:
	  enable-self-preservation: false  # 關閉自我保護機制 保證不可用服務及時清除
	  eviction-interval-timer-in-ms: 3000  # 不可用服務驅逐時間,默認 60000 毫秒
  1. 在服務提供方:
eureka:
  server:
	lease-renewal-interval-in-seconds: 1 # eureka客戶端租賃續約間隔 單位秒 默認30
	lease-expiration-duration-in-seconds: 3 # eureka客戶端租賃期滿時間 默認90

Ribbon 負載均衡與服務調用

Ribbon 基礎概念

Ribbon 完成了那些功能?
   Spring Cloud Ribbon是一個基於HTTP和TCP的 客戶端負載均衡工具 ,主要提供客戶端需要的負載均衡算法和服務調用 。(目前 Ribbon 也已經進入維護階段)

Ribbon 的本地 LB(Load Balance)與 Nginx 服務端 LB 的區別是?
   Ribbon 是本地的 LB ,通過到註冊中心獲取服務列表緩存到本地,在調用接口時,選取對應服務器執行 RPC 遠程調用。
  Ngix 是服務端的 LB,客戶端請求到 Nginx 服務端,由服務端實現調用。

Ribbon 的常見相關類

RestTemplate 服務調用

官方文檔

IRule 接口實現的負載均衡方案

  • BestAviableRule:跳過熔斷的Server,在剩下的Server中選擇併發請求最低的Server

  • RoundRobinRule:輪詢。默認策略

  • RandomRule:隨機選擇

  • RetryRule:可重試的策略。可以對其他策略進行重試,默認重試輪詢策略

  • WeightedResponseTimeRule:根據響應時間加權,響應時間越短權重越大

  • AvailabilityFilteringRule:剔除因爲連續鏈接、讀失敗或鏈接超過最大限制導致熔斷的 Server,在剩下的 Server 中進行輪詢。

  • ZoneAvoidanceRule:?

替換負載策略

  負載規則替換,需注意,是否需要讓 @ComponentScan 掃描到(即與主啓動類在同一個包下);如果被掃描到,那麼該 LB 配置會被集羣中所有的 Ribbon 客戶端公用,如果不會被掃描到,那麼該配置只會適用到當前 Ribbon 客戶端。

(自定義lb類的使用,p40節跳過)

Ribbon 使用過程中的注意事項

  1. 服務的命名問題:
      Request URI does not contain a valid hostname,在給服務命名時,不能包含特殊字符( _ 、+ 、等等 ),但可以有中劃線 在這裏插入圖片描述
  2. 各個服務間傳輸的公共實體類,需要有空參構造器。

Hystrix 斷路器

Hystrix 基礎概念

官網鏈接
是什麼?
  Hystrix 是一個庫,通過隔離服務之間的訪問點、停止級聯失敗和提供回退選項等來提高微服務系統的高可用性。通俗的講,Hystrix 是用來解決相互依賴調用的服務之間,不會因某一環節出現問題,而浪費相關的資源,進而導致整個系統無法響應的問題。

可以做什麼?

  1. 提供快速失敗,快速恢復
  2. 回退,降級
  3. 近實時監控、警報和操作控制

服務降級一般放在消費方比較合理

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章