Grâce au partage précédent, nous avons appris plusieurs installations de base de l'architecture microservice, à travers ces composants, nous pouvons construire un simple système d'architecture de microservice. Par exemple, construisez un centre d'enregistrement de services hautement disponible via Spring Cloud Eureka et réalisez l'enregistrement et la découverte des services;
Équilibrage de charge avec ruban de nuage de ressort ou feigner; Service Protection tolérante aux pannes avec Hystrix de Spring Cloud pour éviter de propager les défaillances. Une fois le microservice construit, nous fournirons certainement une interface de service API RESTful unifiée au système externe pour l'appel.
Mais lorsque le système externe appelle notre API RESTFul, comment déterminez-vous le service dont il a besoin pour fournir les fonctions spécifiques dont il a besoin? Cela implique la maintenance des règles de routage et des listes d'instance de service.
Cela présente notre protagoniste aujourd'hui - Spring Cloud Zuul, qui est un composant de passerelle API basé sur l'implémentation Netflix Zuul. Il peut résoudre deux problèmes majeurs:
Ok, jetons un coup d'œil à la mise en œuvre de ce service de passerelle.
1. Construisez une passerelle et configurez le routage
Ici, nous devons encore utiliser les services de service Hello-Service et Feign précédents. Nous considérions le consommateur de feign comme un consommateur de services, mais n'oubliez pas que dans le système Eureka, chaque service est à la fois un fournisseur de services et un consommateur de services, donc Feign-Consumer est également un fournisseur de services, et des interfaces telles que Http: // LocalHost: 9001 / Feign-Consumer sont les services.
Ensuite, nous construisons un service de passerelle avec la structure du code comme suit:
Étapes d'implémentation du code:
Créer un nouveau projet Maven Api-Gateway
Modifier le fichier POM
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <ModelVersion> 4.0.0 </ ModelVersion> <proupId> com.sam </prouverid> <ArtifActid> api-gateway </ artifactid> <version> 0.0.1-snapshot </DERNIFRIMINE> <parent> <GroupId> org.springframework.boot </proupId> <Artifactid> printemps-boot-starter-parent </refactive> <version> 1.5.1.release </-version> </parent> <preperties> <javavaversion> 1.8 </ javavaversion> </properties> <! - Utiliser la dépendance à la gestion de la version -> <dépendance> <poderties> <! <GroupId> org.springframework.cloud </prôdId> <Artifactid> Spring-Cloud-Dependces </retifactid> <DERVIÈRE> CAMDEN.SR6 </ Version> <Type> Pom </pype> <ccope> Importation </cope> </peedency> </Dependance> </Dedencymanagement> <Dependance> <! Spring-boot-starter-actuator / printemp-boot-starter-hystrix / printemp-boot-starter-ribbon -> <dedendency> <proupId> org.springframework.cloud </proupId> <pretifactid> printemps-cloud-starter-zuul </ artifactid> </dendency> </dpendance> </ project>
Créer une nouvelle classe de démarrage
/ ** * @enablezuulproxy Activer la fonction de service API Gateway de Zuul * * / @ enablezuulproxy @ springCloudApplicationPublic class GatewayApp {public static void main (String [] args) {springApplication.run (GatewayApp.class, args); }}Créer une nouvelle application.
server.port = 5555spring.application.name = api-gateway # ajouter à la configuration des règles de routage # configure via zuul.routes. <Route> .Path et zuul.routes. <Route> .url. <Route> est le nom de l'itinéraire et peut être spécifié arbitrairement, mais les noms d'itinéraire d'un ensemble de chemins et d'URL devraient être les mêmes # que dans l'exemple suivant: Tous satisfont / api-a / ** L'accès aux règles sera acheminé vers l'adresse de // localhost: 9001 #, c'est-à-dire lorsque nous accéderons à la passerelle: // localhost: 5555 / api-a / bonjour, Interface microservice fournie par http: // localhost: 9001 / Hello zuul.routes.api-a.path = / api-a / ** zuul.routes.api-a.url = http: // localhost: 9001zuul.routes.api-b.path = / api-b / ** zuul.routes.api-b.url = http: // localhost: 9090
Testez, démarrez Eureka, Hello-Service, Feign-Consumer et le service API-GATEWAY nouvellement ajouté, puis visitez http: // localhost: 5555 / api-a / feign-consummer
A accédé à l'interface de service de Feign-Consumer --Feign-Consonumer.
Les étapes ci-dessus implémentent la configuration du routage traditionnel. Cette configuration a un inconvénient majeur, à savoir qu'il nécessite une configuration manuelle des règles de routage dans le fichier application.properties. Lorsqu'il y a beaucoup de services, la charge de travail de maintenance sera très grande. Afin de réduire les coûts de maintenance, il y a un autre itinéraire orienté vers le service.
2. Routage axé sur le service
Spring Cloud Zuul et Eureka INTRESSIONS, nous pouvons faire en sorte que le chemin d'accès ne mappe pas les URL spécifiques, mais les services spécifiques, et les URL de service sont automatiquement maintenues par le mécanisme de découverte du service Eureka. Ce type d'itinéraire est un itinéraire axé sur le service. La configuration de code spécifique est la suivante:
Modifier les fichiers POM et introduire les dépendances Eureka
<! - Présentation des dépendances d'Eureka -> <dependency> <proupId> org.springframework.cloud </proupId> <ArtefactId> Spring-Cloud-Starter-eureka </ artifactid> </Dependance>
Modifier le fichier de configuration de l'application.properties
server.port = 5555spring.application.name = api-gatewayzuul.routes.api-a.path = / api-a / ** # Nous utilisons le serviceId au lieu de l'URL, et utilisons le nom du service au lieu du numéro de port IP + zuul.routes.api-a.serviceid = hello-serviceeureka.client.service-url.defaultzone = http: // localhost: 1111 / eureka
Remarque: zuul.routes.api-a.url = Hello-Service peut également implémenter des fonctions, mais il ne peut pas effectuer un équilibrage normal de charge et une protection tolérante aux pannes.
Testez, visitez http: // localhost: 5555 / api-a / bonjour
L'accès a réussi.
3. Règles par défaut pour le routage des services
Dans les itinéraires axés sur le service, car le nom <oute> est arbitrairement, est-ce possible:
zuul.routes.hello-service.path = / hello-service / ** zuul.routes.hello-service.serviceid = bonjour-service
<Route> Le nom est le nom du service. En fait, dans les applications réelles, nous l'appelons souvent de cette façon. S'il existe de telles règles, Zuul peut nous aider à implémenter de telles fonctions par défaut, en économisant davantage les problèmes de configuration.
Faisons une expérience et modifions le fichier de configuration en:
server.port = 5555spring.application.name = api-gatewayeureka.client.service-url.defaultzone = http: // localhost: 1111 / eureka
Puis vérification d'accès aux pages
L'accès a réussi.
Cependant, par défaut, les services sur Eureka seront acheminés par ZUUL créant des relations de mappage par défaut, de sorte que les services que nous ne voulons pas être ouverts au monde extérieur sont également accessibles à l'extérieur. À l'heure actuelle, nous pouvons configurer des règles qui ne nécessitent pas de création de routage automatique par Zuul.Intend-Services. Lorsque zuul.ignored-Services = *, tous les services ne créeront pas automatiquement des règles de routage. Pour le moment, la configuration de routage pertinente doit être effectuée via la configuration précédente.
=================== Magnifique ligne de division =====================.
Tant de choses ont été dites auparavant, tous tournent autour d'un problème: les règles de routage et les problèmes de maintenance des instances de service. Alors, comment résoudre le deuxième problème (vérifier le problème de redondance)?
4. Filtrage de demande
Afin de vérifier les demandes des clients dans la passerelle API, nous pouvons utiliser des filtres pour intercepter et filtrer les demandes. La méthode d'implémentation est relativement simple. Il vous suffit de hériter de la classe de résumé de Zuulfilter et de mettre en œuvre ses quatre méthodes.
Modifier Api-Gateway:
Classe de filtre ajoutée
/ ** * hériter de zuulfilter et implémenter ses 4 interfaces * * pour le filtrage de demande * * / classe publique AccessFilter étend ZuulFilter {logger logger = loggerfactory.getLogger (AccessFilter.class); / * * devait le filtre détermine si le filtre doit être exécuté * * Retour True ici, indiquant que le filtre prendra effet sur toutes les demandes. * En usage réel, nous pouvons utiliser cette fonction pour spécifier la plage effective du filtre * / @Override public boolean aitfilter () {return true; } / * * Logique spécifique du filtre * * Ici, nous demandons à Zuul de demander via CTX.SetSendzuulResponse (false) et ne le route pas * alors nous définissons le code d'erreur renvoyé via ctx.setResponSestAruscode (401) * * / @Override public Object Run () {requestContext Context = requestConted.getCurNContext (); HttpServLetRequest request = context.getRequest (); Objet AccessToken = request.getParameter ("AccessToken"); Logger.info ("Send {} demande à {}", request.getMethod (), request.getRequestUrl (). toString ()); if (AccessToken == null) {context.sesendzuulResponse (false); context.setResponSestAruscode (401); } return null; } / * filterType Renvoie le type de filtre * Il détermine dans quel cycle de vie dans lequel le filtre est exécuté. Ceci est défini comme pré, ce qui signifie que la demande sera exécutée avant d'être acheminée. * * PRE: Filtre avant l'exécution de la demande * Route: Traitez la demande et la route * POST: Filtre exécuté une fois le traitement de la demande terminé * Erreur: filtre exécuté lorsqu'une erreur se produit * / @Override public String FilterType () {return "pre"; } / * * FilterOrder renvoie l'ordre d'exécution du filtre * * Lorsque la demande a plusieurs filtres en une étape, il est nécessaire de l'exécuter une fois en fonction de la valeur de retour de la méthode * * / @Override public int filterOrder () {return 0; }}Modifier la classe de démarrage
/ ** * @enablezuulproxy Activer la fonction de service API Gateway de Zuul * * / @ enablezuulproxy @ springCloudApplicationPublic class GatewayApp {// Le bean est ajouté pour implémenter @bean public AccessFilter AccessFilter () {return new AccessFilter (); } public static void main (String [] args) {SpringApplication.run (GatewayApp.class, args); }}test
) Visitez http: // localhost: 5555 / bonjour-service / bonjour, l'accès a échoué
) Visitez http: // localhost: 5555 / bonjour-service / bonjour? AccessToken = Token, accès normalement
Structure de code modifiée:
5. Développer et étendre
En fait, lorsque la fonction de routage est réellement en cours, son mappage de routage et son transfert de demande sont tous effectués par plusieurs filtres différents.
Le mappage de routage est principalement terminé via des filtres pré-type, qui correspond au chemin de demande avec les règles de routage configurées et trouve l'adresse cible qui doit être transmise.
La pièce de transfert de demande est complétée par un filtre d'itinéraire, qui transmet l'adresse d'itinéraire obtenue par le filtre pré-type.
Par conséquent, les filtres peuvent être considérés comme le composant le plus principal de la fonction de passerelle API de Zuul. Chaque demande HTTP entrant Zuul sera répondu à une série de chaînes de traitement des filtres et retournées au client.
Résumer
Ce qui précède est le problème de l'utilisation de Zuul pour implémenter le service de passerelle API dans Spring Cloud. 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!