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
Eigentlich gibt es hier zwei Lösungen:
- Da die Bearbeitungszeit des Angerufenen relativ lang ist, kann der Anrufer die Wartezeit verlängern .
- Ändern Sie die Verarbeitungslogik des Aufgerufenen und optimieren Sie das Design.
- 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. Feign
Die 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/create
Schnittstelle /payment/create
und den Timeout von feign auf 1,5 s gesetzt. TimeOut wird jedoch aufgrund einer Zeitüberschreitung während des /payment/create
Anrufs .
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
复制代码
PaymentFeign
Setzen 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