Feign in Aktion – Springboot integriert OpenFeign Demo und detaillierte Erklärung der Parameter

Kürzlich habe ich die Artikel zu Microservices sortiert. Lassen Sie mich mit OpenFeign beginnen, das ich mein ganzes Leben lang verwendet habe.

Überlegung: So implementieren Sie Remote-Aufrufe zwischen Microservices bequem und elegant

1. Lassen Sie uns darüber sprechen, was openFeign ist.

Apropos, wir müssen zuerst über RPC sprechen.

1.Was ist RPC?

Der vollständige Name von RPC lautet Remote Procedure Call, was unserem lokalen Aufruf entspricht. Der Zweck von RPC besteht darin, es uns zu ermöglichen, Remote-Methoden genauso aufzurufen wie lokale Methoden .

//本地调用
R result = orderService.findOrderByUserId(id);
//RPC远程调用  orderService为代理对象
R result = orderService.findOrderByUserId(id);

 

RPC-Framework-Designarchitektur

2. Was ist Feign?

Feign ist ein von Netflix entwickelter deklarativer und vorlagenbasierter HTTP-Client . Feign kann uns dabei helfen, die HTTP-API bequemer und eleganter aufzurufen.

Feign kann die gleiche Erfahrung erzielen wie der Aufruf einer lokalen Methode, wenn HTTP zum Anfordern eines Remote-Dienstes verwendet wird . Entwickler wissen überhaupt nicht, dass es sich um eine Remote-Methode handelt, geschweige denn um eine HTTP-Anfrage. Wie bei Dubbo ruft der Verbraucher direkt die Schnittstellenmethode auf, um den Anbieter aufzurufen, ohne dass die Anforderung über den regulären HTTP-Client erstellt und anschließend die Rückgabedaten analysiert werden müssen. Es ermöglicht Entwicklern, Remote-Schnittstellen genauso aufzurufen wie lokale Methoden. Sie müssen nicht auf die Details der Interaktion mit der Remote-Schnittstelle achten, geschweige denn auf die Entwicklung verteilter Umgebungen.

Spring Cloud openfeign erweitert Feign um die Unterstützung von Spring MVC-Annotationen und integriert außerdem Ribbon und Eureka, wodurch Feign benutzerfreundlicher wird.

2.1 Der Unterschied zwischen OpenFeign und Feign

Vortäuschen

Feign ist ein leichter RESTful-HTTP-Dienstclient in der Spring Cloud-Komponente. Feign verfügt über ein integriertes Menüband, das für den Client-Lastausgleich und das Aufrufen von Diensten im Dienstregistrierungscenter verwendet wird. Die Verwendung von Feign besteht darin, die Anmerkungen von Feign zum Definieren einer Schnittstelle zu verwenden. Durch Aufrufen dieser Schnittstelle können Sie den Dienst des Dienstregistrierungszentrums aufrufen.

OpenFeign

OpenFeign ist SpringClouds Unterstützung für SpringMVC-Annotationen wie @RequestMapping usw. basierend auf Feign. @FeignClient von OpenFeign kann die Schnittstelle unter der @RequestMapping-Annotation von SpringMVC analysieren, Implementierungsklassen über einen dynamischen Proxy generieren, einen Lastausgleich durchführen und andere Dienste in den Implementierungsklassen aufrufen.

 

2.2 Ribbon&Feign-Vergleich

Ribbon+RestTemplate führt Microservice-Aufrufe aus

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

//调用方式
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);

Feign führt Microservice-Aufrufe durch

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {
    @RequestMapping("/findOrderByUserId/{userId}")
    public R findOrderByUserId(@PathVariable("userId") Integer userId);
}

//调用
@Autowired
OrderFeignService orderFeignService;
//feign调用
R result = orderFeignService.findOrderByUserId(id);

2.3 Feigns Designarchitektur 

2. Spring Cloud Alibaba integriert Feign schnell

Im Folgenden finden Sie die in Springboot integrierte OpenFeign-Demo, die problemlos vollständig verfolgt werden kann.

Ich werde nicht über den Dienstanbieter schreiben. Dies ist ein normaler Controller, hauptsächlich der Anrufer. Das werde ich als nächstes schreiben.

1. Fügen Sie der Datei pom.xml die folgenden Abhängigkeiten hinzu

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. Fügen Sie die Startanmerkung @EnableFeignClients auf der aufrufenden Seite hinzu

@EnableAsync
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class })
@EnableDiscoveryClient
@EnableFeignClients  //扫描和注册feign客户端的beanDefinition
@MapperScan("com.**.**.**.**.mapper")
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

3. Schreiben Sie die aufrufende Schnittstelle + @FeignClient-Annotation

Erstellen Sie eine FeignClient-Schnittstelle, um die Methoden des aufzurufenden Remote-Dienstes zu definieren:

@FeignClient(value = "base-application", path = "/base")
@RequestMapping("/api/testDemo")
public interface OpenFeignBaseDemo {

    @PostMapping("/queryList")
    String queryList(@RequestBody JSONObject jsonObject);
}

Im obigen Code verwenden wir die Annotation @FeignClient, um den Namen des aufzurufenden Remote-Dienstes anzugeben. Anschließend haben wir eine Methode namens „queryList“ definiert und die Annotation „@PostMapping“ verwendet, um den API-Pfad des aufzurufenden Remote-Dienstes anzugeben.

4. Starten Sie einen Anruf und rufen Sie den Remote-Dienst wie bei einem lokalen Anruf an

Verwenden Sie OpenFeignBaseDemo in anderen Klassen, um Remotedienstmethoden aufzurufen

@RestController
@RequestMapping("/openFeignDemo")
public class OpenFeignControllerDemo {

    @Autowired
    private OpenFeignBaseDemo openFeignBase;

    @PostMapping(value = "/test", produces = { "application/json;charset=utf-8" })
    public ResponseEntity test(@RequestBody JSONObject jsonObject) {
        //feign调用
        String res = openFeignBase.queryList(jsonObject);
        return new ResponseEntity(res, HttpStatus.OK);
    }

}

5. Ergebnisvorschau

Starten Sie zwei Projekte und postmain ruft die Anforderungs-URL auf: localhost:8088/server/openFeignDemo/test.

6. Hier muss ich die Bedeutung der Parametereinstellung in Schritt 3 hervorheben.

public @interface FeignClient {
    @AliasFor("name")
    String value() default "";

    String contextId() default "";

    @AliasFor("value")
    String name() default "";

    String qualifier() default "";

    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?> fallback() default void.class;

    Class<?> fallbackFactory() default void.class;

    String path() default "";

    boolean primary() default true;
}

Im Folgenden finden Sie eine Analyse jedes Attributs.

Wert, Name,
Wert und Name haben die gleiche Funktion. Wenn keine URL konfiguriert ist, wird der konfigurierte Wert als Dienstname für die Diensterkennung verwendet. Ansonsten ist es nur ein Name.

contextId
Wir möchten nicht alle aufrufenden Schnittstellen in einer Klasse definieren. Eine Lösung besteht darin, für jeden Client manuell eine andere contextId anzugeben, damit es nicht zu Konflikten kommt.

Die URL
wird zum Konfigurieren der Adresse des angegebenen Dienstes verwendet. Dies entspricht der direkten Anforderung dieses Dienstes, ohne die Dienstauswahl von Ribbon durchlaufen zu müssen. Es kann in Szenarien wie dem Debuggen verwendet werden.

decode404
Wenn in der aufrufenden Anforderung ein 404-Fehler auftritt und der Wert von decode404 wahr ist, wird die Decoder-Dekodierung durchgeführt, andernfalls wird eine Ausnahme ausgelöst.

Bei der Konfigurationskonfiguration
wird die Feign-Konfigurationsklasse konfiguriert. In der Konfigurationsklasse können Sie Feigns Encoder, Decoder, LogLevel, Vertrag usw. anpassen.

Fallback
definiert eine fehlertolerante Verarbeitungsklasse, also eine Fallback-Logik. Die Fallback-Klasse muss die Feign-Client-Schnittstelle implementieren und darf die Ausnahmeinformationen des Leistungsschalters nicht kennen.

fallbackFactory
ist außerdem fehlertolerant und kann die abnormalen Informationen des Leistungsschalters kennen.

path
definiert das einheitliche Präfix, wenn der aktuelle FeignClient auf die Schnittstelle zugreift. Beispielsweise lautet die Schnittstellenadresse /user/get. Wenn Sie das Präfix als user definieren, muss der Pfad für die spezifische Methode nur /get geschrieben werden.

primär
entspricht der Annotation @Primary, die standardmäßig auf true gesetzt ist. Es gibt einen Grund für die offizielle Einstellung. Wenn unser Feign einen Fallback implementiert, bedeutet dies, dass der Feign-Client mehrere identische Beans im Spring-Container hat. Wenn wir @Autowired zum Injizieren verwenden, wissen wir nicht, welches wir injizieren sollen, daher müssen wir eins mit hoher Priorität festlegen. Ja, die @Primary-Annotation erledigt dies.

qualifier
qualifier entspricht der @Qualifier-Annotation. Das Verwendungsszenario hat wenig mit dem oben genannten Primären zu tun. In allgemeinen Szenarien kann @Autowired direkt injiziert werden.

7. Fehlerberichterstattung und -behebung

Wenn dieser Fehler auftritt: feign.RetryableException: Lesezeitüberschreitung beim Ausführen von POST 

Sie können die folgende Verarbeitung durchführen: Yaml-Konfiguration

feign:
  client:
    config:
      default:
        connectTimeout: 1000
        readTimeout: 6000

Oder Eigenschaftenkonfiguration

feign.client.config.default.connect-timeout=20000
feign.client.config.default.read-timeout=20000  

https://cloud.spring.io/spring-cloud-openfeign/reference/html/

おすすめ

転載: blog.csdn.net/Alex_81D/article/details/133090893