Geben Sie hier den Titel des Verzeichnisses ein
Verwenden Sie RestTemplate, um Aufrufe zwischen Microservices durchzuführen
1. Fügen Sie in der Startklasse des Dienstes, der andere Mikrodienste aufrufen muss, hinzu
//只要引入boot就可以使用
@Bean
@LoadBalanced//表示用负载均衡调用服务
public RestTemplate restTemplate(){
return new RestTemplate();
}
2. Im Geschäftslogikcode
Verwenden Sie OpenFeign anstelle von RestTemplate
1), Abhängigkeiten einführen
Wir führen die Feign-Abhängigkeit in der POM-Datei des Order-Service-Dienstes (Dienst, der andere Dienste aufruft) ein:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2), Anmerkungen hinzufügen
Fügen Sie der Startklasse von order-service Anmerkungen hinzu, um die Funktion von Feign zu aktivieren
3), schreiben Sie den Feign-Client
Erstellen Sie im Bestellservice eine neue Schnittstelle mit folgendem Inhalt:
@FeignClient(value = "user-server")//user-server为想要调用的微服务名称
public interface UserServiceClient {
@GetMapping("/user/{id}")//完整的路径
User findById(@PathVariable("id") Long id);
}
Auf diese Weise kann Feign uns dabei helfen, HTTP-Anfragen zu senden, ohne RestTemplate zum Senden selbst zu verwenden.
4), testen
Ändern Sie die Methode queryOrderById in der Klasse OrderService in order-service und verwenden Sie den Feign-Client anstelle von RestTemplate:
benutzerdefinierte Konfiguration
Typ | Wirkung | veranschaulichen |
---|---|---|
vortäuschen.Logger.Level | Protokollebene ändern | Enthält vier verschiedene Ebenen: NONE (Standard), BASIC, HEADERS, FULL NONE , keine Protokollierung. Standardoption BASIC , nur Anforderungsmethode und URL zusammen mit Antwortstatuscode und Ausführungszeit protokollieren. HEADERS , Protokollierung grundlegender Informationen sowie Anforderungs- und Antwortheader. FULL , Protokollierung der Header, des Textkörpers und der Metadaten von Anfragen und Antworten. |
feign.codec.Decoder | Parser für das Antwortergebnis | Analysieren der Ergebnisse von HTTP-Remote-Aufrufen, z. B. Parsen von JSON-Strings in Java-Objekte |
feign.codec.Encoder | Kodierung der Anforderungsparameter | Kodieren Sie die Anforderungsparameter, um das Senden von HTTP-Anfragen wie POST-Anfragen zu erleichtern, und kodieren Sie die Anforderungsparameter im Anforderungstext |
vortäuschen.Vertrag | Unterstützte Anmerkungsformate | Der Standardwert ist die Annotation von SpringMVC |
vortäuschen.Wiederversucher | Fehlerwiederholungsmechanismus | Der Wiederholungsmechanismus für Anforderungsfehler ist standardmäßig „Nein“, aber die Wiederholung des Menübands wird verwendet. Wenn beispielsweise auf einen Dienst nicht zugegriffen werden kann, wird versucht, auf den B-Dienst im Cluster zuzugreifen |
Unter normalen Umständen reicht uns der Standardwert aus. Wenn Sie ihn anpassen möchten, müssen Sie nur ein benutzerdefiniertes @Bean erstellen, um das Standard-Bean zu überschreiben.
Im Folgenden werden Protokolle als Beispiel verwendet, um zu demonstrieren, wie die Konfiguration angepasst wird.
- Es gibt zwei Möglichkeiten, Feign-Protokolle zu ändern: die Konfigurationsdateimethode und die Java-Codemethode
Konfigurationsdateimethode
Das Ändern der Protokollebene von Feign basierend auf der Konfigurationsdatei kann auf einen einzelnen Dienst abzielen:
feign:
client:
config:
user-service: # 针对某个微服务的配置
loggerLevel: FULL # 日志级别
Es ist auch möglich, alle Dienste gezielt anzusprechen:
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
Die Protokollebene ist in vier Typen unterteilt:
- NONE: Es werden keine Protokollinformationen aufgezeichnet. Dies ist der Standardwert.
- BASIC: Protokollieren Sie nur die Anforderungsmethode, die URL, den Antwortstatuscode und die Ausführungszeit
- HEADERS: Auf Basis von BASIC werden zusätzlich die Header-Informationen der Anfrage und Antwort erfasst
- VOLLSTÄNDIG: Zeichnen Sie Details aller Anfragen und Antworten auf, einschließlich Header-Informationen, Anfragetext und Metadaten.
Java-Code-Methode
Sie können die Protokollebene auch basierend auf Java-Code ändern, indem Sie zuerst eine Klasse und dann ein Logger.Level-Objekt deklarieren:
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志级别为BASIC
}
}
Wenn Sie global wirksam werden möchten , fügen Sie es in die Annotation @EnableFeignClients der Startup-Klasse ein:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
Wenn es lokal wirksam ist , fügen Sie es in die entsprechende @FeignClient-Annotation ein:
@FeignClient(value = "user-service", configuration = DefaultFeignConfiguration .class)
Vorgetäuschte Nutzungsoptimierung
Die unterste Ebene von Feign initiiert HTTP-Anfragen und verlässt sich auf andere Frameworks. Die zugrunde liegende Client-Implementierung umfasst:
- URLConnection:
默认实现
,不支持连接池
, jede Anfrage ist eine neue Verbindung
Feign unterstützt die Verwendung eines Frameworks mit einer Verbindungspoolfunktion:
- Apache HttpClient: Unterstützt Verbindungspool
- OKHttp: Verbindungspool unterstützen
Daher besteht das wichtigste Mittel zur Verbesserung der Leistung von Feign darin , den Verbindungspool anstelle der Standard-URLConnection zu verwenden .
Hier verwenden wir zur Demonstration den HttpClient von Apache.
1), Abhängigkeiten einführen
Führen Sie die HttpClient-Abhängigkeit von Apache in die POM-Datei von order-service ein:
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2), Verbindungspool konfigurieren (optional)
Konfiguration in application.yml von order-service hinzufügen:
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持,默认开启
max-connections: 200 # 最大的连接数,默认200
3) Überprüfung: Weglassen
Empfohlene Vorgehensweise
Einzelne Module extrahieren
Extrahieren Sie den Client von Feign als unabhängiges Modul, fügen Sie das POJO für die Schnittstelle und die Standardkonfiguration von Feign in dieses Modul ein und stellen Sie es allen Verbrauchern zur Verfügung.
Beispielsweise werden die Standardkonfigurationen von UserClient, User und Feign alle in ein feign-api-Paket extrahiert, und alle Microservices können direkt verwendet werden, indem auf dieses Abhängigkeitspaket verwiesen wird.
1. Erstellen Sie zunächst ein Modul mit dem Namen feign-api und führen Sie dann Abhängigkeiten in feign-api ein
<!--openfeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--httpclient基于连接池的调用-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2. Kopieren Sie dann UserClient, User und DefaultFeignConfiguration, die in order-service geschrieben wurden, in das feign-api-Projekt.
3. Löschen Sie Klassen oder Schnittstellen wie UserClient, User und DefaultFeignConfiguration in order-service.
4. Führen Sie die Abhängigkeit von feign-api in die POM-Datei von order-service ein
Die Abhängigkeiten von openfeign und httpclient im order-service können auskommentiert werden
Ändern Sie alle Paketimportteile, die sich auf die oben genannten drei Komponenten im Bestellservice beziehen, und ändern Sie sie in Importpakete in feign -
api 6. Lösungsmethode 1:
Geben Sie die Pakete an, die Feign scannen soll:
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
Methode 2:
Geben Sie die Client-Schnittstelle an, die geladen werden muss (nicht empfohlen)
@EnableFeignClients(clients = {
UserClient.class})