Dans l'article précédent, nous pouvons constater que lorsque nous appelons l'API d'autres services via RestTemplate, les paramètres requis doivent être épissés dans l'URL demandée. S'il y a moins de paramètres, nous pourrons peut-être le tolérer. Une fois qu'il y a plusieurs paramètres, l'épissage de la chaîne de demande sera inefficace et semblera stupide.
Alors, y a-t-il une meilleure solution? La réponse est certaine, et Netflix nous a fourni un cadre: feign.
Feign est un client de service Web déclaratif, et son objectif est de simplifier les appels de service Web. Feign fournit un modèle pour les demandes HTTP. En écrivant des interfaces simples et des annotations d'insertion, vous pouvez définir les paramètres, les formats, les adresses et autres informations des demandes HTTP.
Feign procurera complètement les demandes HTTP, et nous devons simplement l'appeler comme appeler une méthode pour compléter la demande de service et le traitement connexe. Feign intègre le ruban et l'hystrix (nous parlerons d'hystrix plus tard), nous ne pouvons donc plus utiliser ces deux composants explicitement.
En bref, Feign a les caractéristiques suivantes:
Cela ressemble un peu à la cartographie de la carte de demande de la couche de contrôleur de notre motif SpringMVC. Ce modèle est quelque chose que nous aimons vraiment. Feign utilise @FeignClient pour cartographier les services.
Tout d'abord, la première étape consiste à créer un nouveau module Feign sur la base d'origine, puis à introduire des dépendances connexes et des dépendances feintes, qui introduiront automatiquement les dépendances hystrix, comme suit:
<dependency> <proupId> org.springframework.cloud </proupId> <Artifactid> Spring-Cloud-starter-eureka </lefactive> <version> 1.3.5.Release </ Version> </Dependency> <Dedency> <ProupId> org.springframework </prounid> <ArtifActid> <version> 1.4.0.release </DERNIERS> </DENDENCENCE>
La configuration application.yml est la suivante:
Server: Port: 8083SPRING: Application: Nom: Feign-Consumereureka: Client: Service-Url: DefaultZone: http: // localhost: 8888 / eureka /, http: // localhost: 8889 / eureka /
Ensuite, dans l'article précédent, plusieurs nouvelles méthodes sont ajoutées au service des deux modules Provider1 et Provider2, comme indiqué dans le code suivant:
/ ** * Créé par Cong le 2018/5/8. * / @ RestControllerPublic classe HelloController {@RequestMapping ("/ Hello") String public hello () {System.out.println ("Access Comes 1 ..."); retourner "hello1"; } @RequestMapping ("/ hjcs") public list <string> laowangs (String ids) {list <string> list = new ArrayList <> (); list.add ("laowang1"); list.add ("laowang2"); list.add ("laowang3"); Liste de retour; } // Méthode ajoutée @RequestMapping (value = "/ hellol", méthode = requestMethod.get) public chaîne hello (@requestParam String name) {return "hello" + name; } @RequestMapping (value = "/ hello2", méthode = requestMethod.get) utilisateur public hello (@RequestHeader String Name, @RequestHeader Integer Age) {return nouvel utilisateur (nom, âge); } @RequestMapping (value = "/ hello3", méthode = requestMethod.post) public String Hello (@Requestbody User utilisateur) {return "hello" + utilisateur. getName () + "," + utilisateur. getage (); }}Ensuite, la classe utilisateur requise pour le code ci-dessus, le code est le suivant:
/ ** * Créé par Cong 2017/12/2. * / public class utilisateur {nom de chaîne privée; Âge entier privé; // Il doit y avoir un constructeur vide lors de la sérialisation de la transmission, sinon une erreur se produira. Utilisateur public () {} Utilisateur public (nom de chaîne, Âge entier) {this.name = name; this.age = âge; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public Integer Getage () {Return Age; } public void Setage (entier Âge) {this.age = age; }}Ensuite, utilisez @FeignClient de Feign ("Nom du service") pour cartographier l'appel de service. Le code est le suivant:
package hjc; import org.springframework.cloud.netflix.feign.feignClient; import org.springframework.web.bind.annotation. *; / ** * créé par Cong le 2018/5/17. * /// configuration = xxx.class Cette classe configure certaines propriétés précises de Hystrix // Value = "Le nom du service que vous avez utilisé" @FeignClient (value = "Hello-Service", Fallback = FeignFallback.class) Interface publique FeigNService {// Mapping Path of Method in the Service @requestMapping ("/ Hello") String Hello (); @RequestMapping (value = "/ hellol", méthode = requestMethod.get) chaîne hello (@RequestParam ("name") String name); @RequestMapping (value = "/ hello2", méthode = requestMethod.get) utilisateur bonjour (@RequestHeader ("name") Nom de la chaîne, @RequestHeader ("Age") entier Âge); @RequestMapping (value = "/ hello3", méthode = requestMethod.post) String Hello (@Requestbody User utilisateur);}Injectez ensuite l'interface feiservice dans la couche de contrôleur pour effectuer des appels de service distants. Le code est le suivant:
/ ** * Créé par Cong le 2018/5/17. * / @ RestControllerPublic Class ConsumerController {@autowired feignervice feignervice; @RequestMapping ("/ Consumer") public String HelloConSumer () {return feignService.hello (); } @RequestMapping ("/ Consumer2") Public String HelloConSumer2 () {String r1 = feignService.hello ("hjc"); String r2 = feignService.hello ("hjc", 23) .toString (); String r3 = feignerService.hello (nouvel utilisateur ("HJC", 23)); Retour R1 + "-----" + R2 + "----" + R3; }}Ensuite, où annoter le client Eureka dans la classe de démarrage du module Feign @enablediscoveryclient feign Client Annotation
@EnableFeignClients, le code est le suivant: @ SpringbootApplication @ ENablediscoveryClient @ activerfeignClientSspublic class feignApplication {public static void main (String [] args) {SpringApplication.Run (feignApplication.class, args); }}Ensuite, démarrez la classe de démarrage, entrez localhost: 8083 / consommateur dans le navigateur, et le résultat en cours d'exécution est le suivant:
Vous pouvez voir que le sondage d'équilibrage de charge apparaît Hello1 et Hello2.
Continuez ensuite à entrer LocalHost: 8083 / Consumer2 dans le navigateur, et le résultat en cours d'exécution est le suivant:
Ensuite, nous utilisons le dégradé du service dans le service de détente des appels déclaratifs. Ensuite, nous devons créer une nouvelle classe FeignFallback pour hériter de la feivice. Le code est le suivant:
package hjc; import org.springframework.sterreotype.component; / ** * créé par Cong le 2018/5/17. * / @ ComponentPublic classe FeignFallback implémente FeignService {// La méthode d'implémentation est une méthode de rétrogradation de service Call @Override public String hello () {return "error"; } @Override public String Hello (String Name) {return "error"; } @Override public utilisateur Hello (nom de chaîne, âge entier) {return nouvel utilisateur (); } @Override public String Hello (utilisateur utilisateur) {return "error"; }}Ensuite, nous arrêtons les deux modules de fournisseur de services Provider1 et Modules Provider2, et les résultats en cours d'exécution sont les suivants:
Vous pouvez voir que nos appels ont tous des services rétrogradés.
Ensuite, si nous souhaitons contrôler avec précision les paramètres de Hystrix, par exemple, les paramètres combinés avec Hystrix, vous pouvez configurer un attribut Class.class de Class.Class de configuration = xxx dans l'annotation FeignClient pour spécifier les propriétés avec précision dans quelle classe.
Ou configurez-le dans application.yml, comme suit:
Hystrix: Commande: Par défaut: Exécution: Isolement: Thread: TimeoutInMilliseconds: 5000Ribbon: ConnectTimeout: 500 #si vous souhaitez configurer un service séparé en détail, comme suit Hello-Service: Ribbon: ConnectTimeout: 500
Cela satisfait les appels de la plupart de nos scénarios, mais si vous écrivez de beaux scénarios, vous devez toujours utiliser Hystrix natif et suivre notre utilisation précédente d'hystrix. N'utilisez pas les appels clients Feign, comme suit:
/ ** * Créé par Cong le 2018/5/17. * / classe publique Hjccommand étend HystrixCommand {Protection HJCCommand (groupe HystrixCommandGroupkey) {Super (groupe); } @Override Protected Object Run () lève l'exception {return null; }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.