feign

parkdifferent發表於2024-10-18

假如有spirngboot工程a, b。a透過feign介面呼叫b。那麼feign的客戶端配置,對a, b生效?還是隻對a ?

在這種情況下,Feign 的客戶端配置主要是對工程 A(呼叫方)生效的,而不是對工程 B(被呼叫方)生效。讓我解釋一下原因和具體影響:

```tsx
import React from 'react';
import { ArrowRight } from 'lucide-react';

const FeignConfigVisualization = () => (
<div className="flex flex-col items-center p-4 bg-gray-100 rounded-lg">
<h2 className="text-lg font-bold mb-4">Feign Client Configuration Effect</h2>
<div className="flex items-center justify-center space-x-4">
<div className="bg-blue-200 p-4 rounded">
<p className="font-semibold">Service A</p>
<p>(Feign Client)</p>
</div>
<ArrowRight className="text-gray-600" />
<div className="bg-green-200 p-4 rounded">
<p className="font-semibold">Service B</p>
<p>(Provider)</p>
</div>
</div>
<p className="mt-4 text-center">Feign configuration in Service A affects how it calls Service B, but does not affect Service B's internal operations.</p>
</div>
);

export default FeignConfigVisualization;

```

現在,讓我詳細解釋 Feign 客戶端配置的影響:

1. 對工程 A(呼叫方)的影響:
- 連線池設定:如 `max-connections`、`max-connections-per-route` 等,這些設定決定了 A 如何管理與 B 的連線。
- 超時設定:`connectTimeout`、`readTimeout` 等,這些決定了 A 在等待 B 響應時的耐心程度。
- 重試策略:如 Ribbon 的重試配置,決定了 A 在呼叫 B 失敗時是否以及如何重試。
- 日誌級別:決定了 A 中 Feign 客戶端的日誌詳細程度。
- 壓縮設定:決定了 A 傳送請求和接收響應時是否使用壓縮。

2. 對工程 B(被呼叫方)的影響:
- 基本上沒有直接影響。B 不會感知到 A 的 Feign 配置。
- B 只會接收到來自 A 的 HTTP 請求,不關心這些請求是如何配置或管理的。

3. 間接影響:
- 雖然 B 不直接受 A 的 Feign 配置影響,但這些配置可能間接影響 B 的負載。
- 例如,如果 A 配置了激進的重試策略,可能會導致 B 接收到更多的重複請求。

4. 重要注意事項:
- 工程 B 應該有自己的服務端配置(如 Tomcat 或 Netty 的執行緒池配置),這些配置與 A 的 Feign 配置是獨立的。
- A 的 Feign 配置應該與 B 的服務能力相匹配。例如,A 的超時設定不應短於 B 處理請求的典型時間。

5. 最佳實踐:
- A 和 B 應該協調它們的配置。例如,A 的超時設定應該考慮到 B 的處理時間。
- 監控both sides:雖然 Feign 配置主要影響 A,但監控 both sides 的效能是很重要的,以確保配置的合理性。
- 考慮使用服務網格(如 Istio)來統一管理服務間通訊的策略,這可以簡化 Feign 客戶端的配置。

總結:Feign 的客戶端配置主要影響發起呼叫的服務(工程 A),而不直接影響被呼叫的服務(工程 B)。但是,這些配置會影響 A 和 B 之間的互動方式,因此在配置時需要考慮整個系統的架構和效能需求。

springboot工程,feign預設連線池配置,最佳實踐配置?配置以properties形式

當然,我可以為您提供 Spring Boot 工程中 Feign 預設連線池的最佳實踐配置,以 properties 形式呈現。這些配置與之前的 YAML 版本在功能上是等價的,只是格式不同。

```properties
# Feign HttpClient 配置
feign.httpclient.enabled=true
feign.httpclient.max-connections=200
feign.httpclient.max-connections-per-route=50
feign.httpclient.connection-timeout=2000
feign.httpclient.connection-timer-repeat=3000

# Feign 客戶端預設配置
feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000
feign.client.config.default.loggerLevel=basic

# Feign 壓縮配置
feign.compression.request.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
feign.compression.response.enabled=true

# Ribbon 配置
ribbon.eager-load.enabled=true
ribbon.ConnectTimeout=3000
ribbon.ReadTimeout=60000
ribbon.MaxAutoRetries=1
ribbon.MaxAutoRetriesNextServer=1
ribbon.OkToRetryOnAllOperations=true

# Hystrix 配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000

```

這些配置的解釋和最佳實踐建議與之前的 YAML 版本相同。以下是一些關鍵點的回顧:

1. HttpClient 配置:
- 最大連線數(200)和每路由最大連線數(50)需要根據系統規模調整。
- 連線超時設定為 2 秒,可根據網路情況調整。

2. Feign 客戶端配置:
- 連線和讀取超時都設定為 5 秒,可根據業務需求調整。
- 日誌級別設定為 basic,便於除錯,生產環境可考慮設定為 NONE。

3. 壓縮配置:
啟用了請求和響應的壓縮,可以減少網路傳輸量,但會增加 CPU 開銷。

4. Ribbon 配置:
- 啟用了飢餓載入模式,可減少首次請求的延遲。
- 設定了重試策略,需要注意對非冪等操作的影響。

5. Hystrix 配置:
預設超時時間設定為 10 秒,需要確保大於 Ribbon 的超時時間。

最佳實踐建議:

1. 效能監控:使用 Spring Boot Actuator 監控這些引數的實際表現。

2. 動態配置:考慮使用配置中心(如 Spring Cloud Config)來動態調整這些引數。

3. 環境特定配置:對開發、測試、生產環境使用不同的配置檔案。

4. 定期審查:隨著系統規模和需求的變化,定期審查和調整這些配置。

5. 連線池大小:`max-connections` 和 `max-connections-per-route` 需要根據系統的併發需求來調整。

6. 超時設定:確保 Feign、Ribbon 和 Hystrix 的超時設定是協調的。

7. 重試策略:謹慎使用 `OkToRetryOnAllOperations=true`,特別是對於非冪等操作。

8. 壓縮:在啟用壓縮時,要權衡網路傳輸量減少和 CPU 開銷增加。

記住,這些配置提供了一個良好的起點,但最佳配置總是需要根據特定的應用場景和負載特徵來調整。建議在不同的環境中進行測試和微調,以找到最適合您系統的配置。

如果您有任何特定的效能問題或需求,我們可以進一步討論和最佳化這些配置。

springboot工程應用,服務啟動後。我的對外提供的feign介面,外部應用發起的第一個請求往往會失敗。執行到了FallbackFactory邏輯。這問題原因是什麼,如何解決?

這個問題通常與 Feign 客戶端的初始化和 Hystrix 的配置有關。第一個請求失敗並執行到 FallbackFactory 邏輯的原因可能有以下幾點:

1. Ribbon 負載均衡器初始化延遲:
Ribbon 需要時間來初始化和獲取服務列表。在此之前,可能會導致請求失敗。

2. Hystrix 熔斷器冷啟動:
Hystrix 在第一次呼叫時可能還沒有完全準備好,導致觸發熔斷。

3. 連線池預熱:
如果使用連線池,第一次請求可能因為建立連線的開銷而超時。

4. JVM 預熱:
JVM 可能需要一些時間來進行即時編譯(JIT)和最佳化。

要解決這個問題,可以考慮以下幾種方法:

1. 增加 Hystrix 超時時間:

```yaml
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 60000

```

2. 禁用 Hystrix:
如果不需要熔斷功能,可以考慮禁用 Hystrix。

```yaml
feign:
hystrix:
enabled: false

```

3. 配置 Ribbon 的懶載入:

```yaml
ribbon:
eager-load:
enabled: true
clients: service-name-1, service-name-2

```

4. 實現一個啟動時的預熱方法:
在應用啟動完成後,主動呼叫一次 Feign 客戶端來預熱。

```java
@Component
public class FeignClientWarmup implements ApplicationListener<ApplicationReadyEvent> {

@Autowired
private List<Object> feignClients; // 注入所有的 Feign 客戶端

@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
feignClients.forEach(client -> {
try {
// 對每個 Feign 客戶端執行一次預熱呼叫
Method method = client.getClass().getMethods()[0]; // 獲取第一個方法
method.invoke(client);
} catch (Exception e) {
// 預熱呼叫可能會失敗,這裡可以忽略異常
log.warn("Feign client warmup failed", e);
}
});
}
}

```

5. 使用重試機制:
配置 Ribbon 的重試策略,在第一次失敗後自動重試。

```yaml
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 1
OkToRetryOnAllOperations: true

```

6. 調整連線池配置:
如果使用連線池,可以考慮預熱連線池或增加連線超時時間。

```yaml
feign:
httpclient:
enabled: true
max-connections: 200
max-connections-per-route: 50
connection-timeout: 2000

```

建議先嚐試增加超時時間和實現預熱方法。如果問題仍然存在,可以逐步嘗試其他解決方案。同時,確保你的服務發現(如 Eureka)配置正確,服務能夠正常註冊和發現。

如果你需要更具體的幫助或有其他問題,請提供更多關於你的專案配置和具體錯誤資訊,我會為你提供更精確的解決方案。

相關文章