深入淺出Spring Cloud Ribbon配置

2021-10-21 04:48:07 字數 3434 閱讀 8053

1. 禁用 eureka

當我們在 resttemplate 上新增 @loadbalanced 註解後,就可以用服務名稱來呼叫介面了,當有多個服務的時候,還能做負載均衡。

這是因為 eureka 中的服務資訊已經被拉取到了客戶端本地,如果我們不想和 eureka 整合,可以通過下面的配置方法將其禁用。

# 禁用 eureka

ribbon.eureka.enabled=false

當我們禁用了 eureka 之後,就不能使用服務名稱去呼叫介面了,必須指定服務位址。

2. 配置介面位址列表

# 禁用 eureka 後手動配置服務位址

ribbon-config-demo.ribbon.listofservers=localhost:8081,localhost:8083

這個配置是針對具體服務的,字首就是服務名稱,配置完之後就可以和之前一樣使用服務名稱來呼叫介面了。

3. 配置負載均衡策略

ribbon 預設的策略是輪詢,從我們前面講解的例子輸出的結果就可以看出來,ribbon 中提供了很多的策略,這個在後面會進行講解。我們通過配置可以指定服務使用哪種策略來進行負載操作。

4**. 超時時間**

ribbon 中有兩種和時間相關的設定,分別是請求連線的超時時間和請求處理的超時時間,設定規則如下:

# 請求連線的超時時間

ribbon.connecttimeout=2000

# 請求處理的超時時間

ribbon.readtimeout=5000

也可以為每個ribbon客戶端設定不同的超時時間, 通過服務名稱進行指定:

ribbon-config-demo.ribbon.connecttimeout=2000

ribbon-config-demo.ribbon.readtimeout=5000

5. 併發引數

# 最大連線數

ribbon.maxtotalconnections=500

# 每個host最大連線數

ribbon.maxconnectionsperhost=500

配置 ribbon 最簡單的方式就是通過配置檔案實現。當然我們也可以通過**的方式來配置。

通過**方式來配置之前自定義的負載策略,首先需要建立乙個配置類,初始化自定義的策略,**如下所示。

@configuration

public class beanconfiguration

}

建立乙個 ribbon 客戶端的配置類,關聯 beanconfiguration,用 name 來指定呼叫的服務名稱,**如下所示。

@ribbonclient(name = "ribbon-config-demo", configuration = beanconfiguration.class)

public class ribbonclientconfig

可以去掉之前配置檔案中的策略配置,然後重啟服務,訪問介面即可看到和之前一樣的效果。

除了使用**進行 ribbon 的配置,我們還可以通過配置檔案的方式來為 ribbon 指定對應的配置:

.ribbon.nfloadbalancerclassname: should implement iloadbalancer(負載均衡器操作介面)

.ribbon.nfloadbalancerruleclassname: should implement irule(負載均衡演算法)

.ribbon.nfloadbalancerpingclassname: should implement iping(服務可用性檢查)

.ribbon.niwsserverlistclassname: should implement serverlist(服務列表獲取)

.ribbon.niwsserverlistfilterclassname: should implement serverlist­filter(服務列表的過濾)

在集群環境中,用多個節點來提供服務,難免會有某個節點出現故障。用 nginx 做負載均衡的時候,如果你的應用是無狀態的、可以滾動發布的,也就是需要一台台去重啟應用,這樣對使用者的影響其實是比較小的,因為 nginx 在**請求失敗後會重新將該請求**到別的例項上去。

由於 eureka 是基於 ap 原則構建的,犧牲了資料的一致性,每個 eureka 服務都會儲存註冊的服務資訊,當註冊的客戶端與 eureka 的心跳無法保持時,有可能是網路原因,也有可能是服務掛掉了。

在這種情況下,eureka 中還會在一段時間內儲存註冊資訊。這個時候客戶端就有可能拿到已經掛掉了的服務資訊,故 ribbon 就有可能拿到已經失效了的服務資訊,這樣就會導致發生失敗的請求。

這種問題我們可以利用重試機制來避免。重試機制就是當 ribbon 發現請求的服務不可到達時,重新請求另外的服務。

**1. retryrule 重試**

解決上述問題,最簡單的方法就是利用 ribbon 自帶的重試策略進行重試,此時只需要指定某個服務的負載策略為重試策略即可:

ribbon-config-demo.ribbon.nfloadbalancerruleclassname=com.netflix.loadbalancer.retryrule

**2. spring retry 重試**

除了使用 ribbon 自帶的重試策略,我們還可以通過整合 spring retry 來進行重試操作。

在 pom.xml 中新增 spring retry 的依賴,**如下所示。

org.springframework.retry spring-retry ``` 配置重試次數等資訊: ``` # 對當前例項的重試次數 ribbon.maxautoretries=1 # 切換例項的重試次數 ribbon.maxautoretriesnextserver=3 # 對所有操作請求都進行重試 ribbon.oktoretryonalloperations=true # 對http響應碼進行重試 ribbon.retryablestatuscodes=500,404,502 ```

最新2021整理收集的一些高頻面試題(都整理成文件),有很多乾貨,包含mysql,netty,spring,執行緒,spring cloud、jvm、原始碼、演算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友**q君樣:11604713672

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...

深入淺出ShellExecute

深入淺出shellexecute譯者 徐景周 原作 nishant s q 如何開啟乙個應用程式?shellexecute this m hwnd,open calc.exe sw show 或shellexecute this m hwnd,open notepad.exe c mylog.log...