Dans la pile Spring Cloud Netflix, chaque microservice expose ses propres services sous la forme d'une interface HTTP, de sorte qu'un client HTTP doit être utilisé lors de l'appel d'un service distant. Nous pouvons utiliser l'URLConnection native JDK, le client HTTP d'Apache, le client HTTP asynchrone de Netty et le repos de Spring. Cependant, la chose la plus pratique et la plus élégante à utiliser est la fierté.
Introduction à Feign
Feign est un client HTTP déclaratif et modèle. En utilisant Feign in Spring Cloud, nous pouvons obtenir la même expérience d'encodage que d'appeler des méthodes locales lors de la demande de services distants à l'aide de HTTP. Le développeur ne peut pas se rendre compte qu'il s'agit d'une méthode distante, et on ne peut pas voir qu'il s'agit d'une demande HTTP. Par exemple:
@AutowiredPrivate AdverGropriroService Service; // Service à distance publique publi publique FOO (Integer GroupID) {return Service.FindByGroupId (GroupId); // appelle le service à distance via http} Les développeurs peuvent terminer le processus d'envoi de demandes HTTP, de décodage des rendements HTTP et de les encapsulant dans des objets via service.findByGroupId() .
Définition de la fierté
Pour que Feign sache à quelle adresse envoyer une demande lors de l'appel d'une méthode et des paramètres à prendre pour la demande, nous devons définir une interface:
@FeignClient (name = "ea") // [A] Interface publique AdvergRoupReMoService {@RequestMapping (value = "/ group / {GroupID}", méthode = requestMethod.get) // [b] publicital findByGroupId (@PathVariable ("GroupId") Integer Adgroud) // [C] @requestMapping (Value = Value = Value = "/ group / {groupeid}", méthode = requestMethod.put) void Update (@PathVariable ("GroupID") entier GroupID, @RequestParam ("GroupName") String GroupName)R: @FeignClient est utilisé pour informer les composants Feign pour proxyer l'interface (pas besoin d'écrire une implémentation d'interface), et l'utilisateur peut l'injecter directement via @Autowired.
B: @RequestMapping signifie que lorsque vous appelez cette méthode, vous devez envoyer une demande GET à /group/{groupId} .
C: @Pathvariable a la même signification que l'annotation correspondante dans SpringMVC.
Lorsque l'application Spring Cloud est démarrée, Feign analysera l'interface marquée avec l'annotation @FeignClient, générera un proxy et l'enregistrera dans le conteneur à ressort. Lors de la génération d'un proxy, Feign créera un objet requettemplate pour chaque méthode d'interface. Cet objet résume toutes les informations requises pour les demandes HTTP. Le nom du paramètre de demande, la méthode de demande et d'autres informations sont déterminés dans ce processus. La matrice de feign est reflétée ici.
Dans cet exemple, nous utilisons Feign en combinaison avec Eureka et Ribbon ,@FeignClient(name = "ea") signifie informer Feign to interroger eureka pour un service nommé EA lors de l'appel de cette méthode d'interface, afin d'obtenir l'URL de service.
Encodeur, décodeur et errorDorder de Feign
Le processus de Feign de sérialisation de l'objet de paramètre de méthode dans la signature de la méthode dans les paramètres de demande et de le mettre dans une demande HTTP est rempli par l'encodeur (Encodeur). De même, la désérialisation des données de réponse HTTP dans les objets Java est effectuée par un décodeur (décodeur).
Par défaut, Feign convertira les paramètres marqués avec l'annotation @RequestParam en chaînes et les ajoutera à l'URL, et convertissent les paramètres sans annotations en JSON via Jackson pour les mettre dans le corps de la demande. Notez que si la méthode dans @requetmapping spécifie la méthode de demande comme post, alors tous les paramètres inchangés seront ignorés, par exemple:
@RequestMapping (value = "/ group / {GroupID}", méthode = requestMethod.get) void Update (@PathVariable ("GroupID") Integer GroupID, @RequestParam ("GroupName") String GroupName, DataObject Obj);À l'heure actuelle, car la demande GET n'a pas de corps de demande, le paramètre OBJ sera ignoré.
Dans Spring Cloud Environment, l'encodeur de Feign * ne sera utilisé que pour coder des paramètres qui n'ont pas été ajoutés à l'annotation. Si vous personnalisez l'encodeur, votre encodeur ne sera appelé que lors de la codage du paramètre OBJ. Pour le décodeur, les délégués par défaut à la classe MAPPingJackson2HttpMessageConverter dans SpringMVC pour le décodage. ErrorDecoder ne sera appelé que lorsque le code d'état ne se situe pas entre 200 et 300. La fonction d'errorDecoder est de renvoyer une exception basée sur les informations de réponse HTTP, qui peuvent être capturées lorsque l'interface feign est appelée. Nous utilisons actuellement ErrorDecoder pour faire en sorte que l'interface FEIG lance une exception commerciale au traitement de l'appelant.
Client HTTP de Feign
Par défaut, Feign utilise URLConnection native JDK pour envoyer des demandes HTTP. Il n'y a pas de pool de connexion, mais une longue connexion sera maintenue pour chaque adresse, c'est-à-dire que la connexion de persistance de HTTP est utilisée. Nous pouvons remplacer le client HTTP d'origine de Feign par le client HTTP d'Apache, obtenant ainsi les capacités de contrôle étroitement liées aux performances telles que les pools de connexion, les délais d'attente, etc. Spring Cloud prend en charge ce remplacement depuis la version Brixtion.SR5, déclare d'abord le client HTTP Apache et feign-httpclient les dépendances dans le projet:
<! - Remplacez le httpclient natif de feign par Apache httpclient -> <dependency> <proupId> org.apache.httpcomponents </prouprid> <petifactid> httpclient </ artifactid> </sendency> <pedigency> <proupId> com.netflix.feign </prounid> <ArtifActid> feign-httpclient </prounid> <Artifactid> feign-httpcliphie </prounid> <ArtifActid> Feign-HTTPCLILIE </prounid> <Artifactid> <version> $ {feign-httpclient} </ version> </ dépendance>Puis ajoutez l'application.properties:
feign.httpclient.enabled = true
Résumer
Grâce à Feign, nous pouvons rendre les appels distants HTTP complètement transparents aux développeurs et obtenir une expérience de codage cohérente avec l'appel des méthodes locales. Ceci est similaire à la façon dont les services à distance sont exposés à Alibaba Dubbo. La différence est que Dubbo est basé sur un protocole binaire privé, tandis que Feign est essentiellement un client HTTP. Si vous utilisez Spring Cloud Netflix pour créer des microservices, alors Feign est sans aucun doute le meilleur choix.
Ce qui précède est la méthode (recommandée) pour utiliser Spring Cloud Feign en tant que client HTTP pour appeler les services HTTP distants (recommandés). J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!