FeignClient-Timeout-Einstellung in der OpenFegin-Praxis

Angebot kommt, grab Freunde zum abholen! Ich nehme an der Rekrutierungs-Check-in-Veranstaltung im Frühjahr 2022 teil. Klicken Sie hier, um die Veranstaltungsdetails anzuzeigen .

1. Problembeschreibung:

Wenn wir einige synchrone Anforderungsschnittstellen auf der Leitung haben, wie zum Beispiel:

1. Massen-E-Mail

2. Führen Sie Zehntausende von Datenverarbeitungen gleichzeitig aus

3. Rufen Sie synchron die Zahlungsschnittstelle auf

Wenn wir die obige Operation haben, kann die folgende Ausnahme auftreten

image-20220326125823278.png

Eigentlich gibt es hier zwei Lösungen:

  1. Da die Bearbeitungszeit des Angerufenen relativ lang ist, kann der Anrufer die Wartezeit verlängern .
  2. Ändern Sie die Verarbeitungslogik des Aufgerufenen und optimieren Sie das Design.
  3. Modifizieren Sie die Verarbeitungslogik des Aufrufs, modifizieren Sie den direkten Aufruf in einen impliziten Aufruf.

Das Problem ist nicht abweichend, ich möchte nur einen gesalzenen Fisch machen, damit der Service keine Fehler meldet, können wir direkt die Wartezeit vortäuschen

Zweitens die Lösung:

Im Lösungsteil veröffentlichen wir immer noch einen Teil des vorhandenen Codes und der Logik, um auf die aktuelle Szene zu reagieren.

Teil des Codes

1. FeignDie Schnittstelle ist wie folgt definiert:

@FeignClient(name = "payment-service", path = "/payment")
public interface PaymentFeign {
​
    @PostMapping("/create")
    PaymentVo create(@RequestBody @Validated PaymentDto paymentDto);
}
复制代码

2. Der Anrufcode lautet wie folgt:

    @Autowired
    private PaymentFeign paymentFeign;
​
    @GetMapping("/create")
    public OrderVo create(@Validated OrderDto orderDto) {
        log.info("uri:/order/create lang:{}", LocaleContextHolder.getLocale().getLanguage());
        // 忽略逻辑代码 N 行
        paymentFeign.create(paymentDto);
        log.info("uri:/order/create paymentFegin.create cost: {} ms", System.currentTimeMillis() - start);
        return orderVo;
    }
复制代码

3. Timeout-Konfiguration vortäuschen

feign:
  client:
    config:
      default:
        # 日志级别
        loggerLevel: full
        # 超时设置 1.5 秒超时
        connectTimeout: 1500
        readTimeout: 1500
  # 断路器
  circuitbreaker:
    enabled: true
复制代码

Fassen Sie den obigen Code in einem Satz zusammen: Ich habe ihn in der xxx/createSchnittstelle /payment/createund den Timeout von feign auf 1,5 s gesetzt. TimeOut wird jedoch aufgrund einer Zeitüberschreitung während des /payment/createAnrufs .

Lösung

Option eins:

Erhöhen Sie das Standard-Timeout von Feign auf 5 Sekunden

feign:
  client:
    config:
      default:
        # 日志级别
        loggerLevel: full
        # 超时设置 5 秒超时
        connectTimeout: 5000
        readTimeout: 5000
  # 断路器
  circuitbreaker:
    enabled: true
复制代码

Variante II:

Geben Sie die contextId der Feign-Schnittstelle an, um das aktuelle Feign-Timeout auf 5 Sekunden festzulegen.

feign:
  client:
    config:
      default:
        # 日志级别
        loggerLevel: full
        # 超时设置
        connectTimeout: 1500
        readTimeout: 1500
      payment-core:
        connectTimeout: 5000
        readTimeout: 5000
  # 断路器
  circuitbreaker:
    enabled: true
复制代码

PaymentFeignSetzen Sie die Eigenschaft contextId auf on für

@FeignClient(name = "payment-service", contextId = "payment-core",  path = "/payment")
public interface PaymentFeign {
​
    @PostMapping("/create")
    PaymentVo create(@RequestBody @Validated PaymentDto paymentDto);
}
复制代码

Auf diese Weise können wir die Auswirkungen reduzieren und die Auswirkungen nachgelagert reduzieren.

3. Zusammenfassung:

Informationen zur Referenzadresse: spring-cloud-openfeign

Ich denke du magst

Origin juejin.im/post/7079274348334776327
Empfohlen
Rangfolge