Pourquoi avez-vous besoin d'une passerelle?
Nous savons que nous voulons entrer un service lui-même, et il est évident que nous n'avons pas de méthode particulièrement bonne. Nous entrons directement l'adresse IP + numéro de port. Nous savons que cette approche est très mauvaise. Il y a un gros problème avec cette approche. Tout d'abord, il expose l'adresse IP de notre machine physique. Lorsque d'autres regardent votre adresse IP, ils savent où le service est déployé, permettant aux autres de mener des opérations d'attaque très facilement.
Deuxièmement, nous avons tellement de services, devons-nous les appeler un par un? Supposons que nous avons fait l'authentification de l'autorisation, et chacun de nos clients accède aux programmes de service sur différents JVM fonctionnant sur différentes machines. Chacun de nos services a besoin d'une authentification de service. Est-ce ennuyeux? C'est évidemment très ennuyeux.
Ensuite, nous sommes confrontés à ces deux et à leurs problèmes généraux en ce moment, et nous avons besoin d'un moyen de les résoudre. Tout d'abord, examinons l'exposition de l'adresse IP et le problème à point unique causée par la rédaction de l'adresse IP après le décès. Dois-je également maintenir dynamiquement la liste des services pour un tel service lui-même? J'ai besoin d'appeler ce service lui-même, ai-je également besoin d'un équilibrage de charge?
Il y a aussi des choses sur l'exposition à l'adresse IP. Dois-je être un proxy, comme le proxy inversé de Nginx, et il y a aussi des choses qui déploient des modules publics sur cette chose, comme la vérification de l'autorisation pour tous les portails. Nous avons donc maintenant besoin de la passerelle API Zuul. Il résout le problème ci-dessus. Si vous souhaitez appeler un certain service, il vous mappera et mappera l'adresse IP de votre service dans
Si vous entrez le chemin, il le correspond et il accédera au service pour vous. Il aura un processus de transfert de demande. Comme Nginx, la force spécifique de l'instance de la machine de service, il n'accédera pas directement à l'IP, il ira au centre d'enregistrement Eureka pour obtenir l'ID d'instance de service, c'est-à-dire le nom du service. J'ai utilisé le ruban d'équilibrage de charge du client pour accéder à l'une des instances de service.
La passerelle API est principalement utilisée pour résoudre le problème des appels externes par le service lui-même et pour résoudre le problème de la vérification de l'autorisation. Vous pouvez intégrer et appeler une série de filtres ici, comme l'intégration de Shiro, de Springsecurity et d'autres choses.
Zuul peut charger un mécanisme de filtrage dynamique pour atteindre les fonctions suivantes:
1. Vérification et sécurité: identifier les exigences de vérification pour diverses ressources et rejeter les demandes qui ne correspondent pas aux exigences.
2. Revue et surveillance: suivre les données significatives et les résultats statistiques aux emplacements Edge, nous apportant ainsi des conclusions précises sur l'état de la production.
3. Route dynamique: les demandes d'itinéraire vers différentes clusters backend dynamiquement selon les besoins.
4. Test de contrainte: augmentez progressivement le débit de charge vers le cluster pour calculer le niveau de performance.
5. Attribution de charge: Attribuez la capacité correspondante à chaque type de charge et déprécisez les demandes qui dépassent la valeur limite.
6. Traitement de réponse statique: Créez des réponses partielles directement aux emplacements des bords pour les empêcher de couler dans le cluster interne.
7. Élasticité multi-région: le routage de demande de demande entre les régions AWS est conçu pour atteindre une utilisation diversifiée des ELB et s'assurer que les emplacements de bord sont aussi proches que possible avec les utilisateurs.
Ensuite, allez à une petite démo
La première étape consiste à construire un nouveau module Zuul dans le projet d'origine et à introduire des dépendances. Le code est le suivant:
<dependency> <proupId> org.springframework.cloud </proupId> <ArtifactId> Spring-Cloud-starter-eureka </retifactid> <version> 1.3.5.Release </ Version> </Dependency> <Dedency> <ProupId> org.springframework.cloud </prounid> <Artifactid> <version> 1.3.5
Tapez ensuite l'annotation @enablezuulproxy sur la classe de démarrage, et le code est le suivant:
Serveur: Port: 5000Spring: Application: Nom: API-GETETEWAYZUUL: Routes: #Identifier le nom de votre service, qui peut être défini par vous-même ici. D'une manière générale, la commodité et les spécifications sont les mêmes que le nom de votre service Hello-Service: #Le chemin de cartographie de service, via ce chemin, vous pouvez accéder à votre service depuis l'extérieur. Le but est d'éviter d'exposer l'IP de votre machine et de l'itinéraire axé sur le service et de choisir un disponible pour vous. #Here, Zuul dépend automatiquement de Hystrix et du ruban, pas pour le chemin autonome: / Hello-Service / ** # Ce doit être le nom du service dans votre centre d'enregistrement Eureka. Par conséquent, le ServiceId est configuré ici car il est combiné avec Eureka. Si vous utilisez Zuul seul, vous devez écrire l'IP de votre propre machine. #Such comme URL: http: // localhost: 8080 / Ce n'est pas assez bon pour écrire l'IP mort. Si cette adresse IP échoue et que c'est une haute disponibilité, l'ensemble d'enregistrement de service ne sera pas utilisé. ServiceId: Hello-ServiceEureka: #Client: #Registration Center Adresse Service-URL: DefaultZone: http: // localhost: 8888 / eureka /, http: // localhost: 8889 / eureka /
Démarrez ensuite le centre de registre et deux fournisseurs de services de service Hello-Service dans l'article précédent. Ensuite, nous l'exécutons et jetons un coup d'œil à sa fonction de transfert de demande pour voir si elle interroge dans les deux services.
Entrez LocalHost: 5000 / Hello-Service / Hello, comme suit:
Puis actualiser à nouveau:
Vous pouvez voir que Zuul a fait une demande pour le distribuer. Il est cartographié sur une machine spécifique en fonction de votre nom de service Hello-Servie. N'est-ce pas la fonction d'un proxy inversé?
Zuul peut également effectuer le filtrage des demandes, alors effectuons une vérification des jetons pour démontrer. Tout d'abord, nous devons créer une nouvelle classe de tokenfilter pour hériter de la classe Zuulfilter et implémenter ses quatre interfaces. Le code est le suivant:
package hjc.zuul; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; import javax.servlet.http.httpservletRequest; / ** * créé par Cong le 2018/5/18. * / classe publique TokenFilter étend Zuulfilter {// quatre types: pré, routage, erreur, post // pré: il est principalement utilisé dans l'étape de mappage de routage pour trouver le tableau de mappage de routage // routage: le filtre de transfert de routage spécifique est sur le routeur de routage. Lors du transfert de la demande spécifique, il sera appelé // Erreur: une fois l'erreur de filtre précédente, le filtre d'erreur sera appelé. // POST: Ce filtre ne sera pas appelé une fois le routage et l'erreur terminés. C'est @Override public String filterType () {return "pre"; } // Personnalisez l'ordre d'exécution des filtres. Plus la valeur est grande, plus l'exécution. Plus la valeur est petite, plus elle est exécutée, plus elle est exécutée en premier. @Override public int filterOrder () {return 0; } // Contrôlez le filtre pour prendre effet ou non. Vous pouvez écrire une chaîne de logique pour contrôler @Override public booléen aitfilter () {return true; } // Exécuter Filter Logic @Override Public Object Run () {requestContext context = requestContext.getCurrentContext (); HttpServLetRequest request = context.getRequest (); String token = request.getParameter ("token"); if (token == null) {context.sesendzuUlResponse (false); context.setResponSestAruscode (401); context.setResponseBody ("non autorisé"); retourner null; } return null; }}FilterType: renvoie une chaîne représentant le type de filtre. Quatre types de filtres avec différents cycles de vie sont définis à Zuul, comme suit:
1. pre : il peut être appelé avant la mise en déroute de la demande. Il est utilisé pour trouver la table de mappage de routage pendant l'étape de mappage de routage.
2.route : est appelé pendant la demande de routage. Le filtre de transfert de routage spécifique sera appelé lors du routage du transfert de demande spécifique du routeur.
3. error : appelée lorsqu'une erreur se produit lors du traitement de la demande
4. post : Le filtre ne sera pas appelé une fois le routage et l'erreur terminés, ce qui est dans la dernière étape.
Ici, nous déclarons l'exception qui se produit lorsque le filtre Zuul exécute une demande de réseau. L'exception prise par Try-Catch ne peut pas être directement jetée sur la page dans le filtre. L'exception lancée par l'application peut être renvoyée à la page en utilisant la méthode context.set () dans la capture. comme suit:
try {Business Logic ...} catch (exception e) {requestContext context = requestContext.getCurrentContext (); context.set ("error.status_code", 401); context.set ("error.exception", e); context.set ("error.sessage", "sfdfsdf");}Ensuite, vous devez ajouter ce filtre au printemps et laisser le printemps le gérer. Le code est le suivant:
package hjc; import hjc.zuul.tokenfilter; import org.springframework.boot.springApplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.clou org.springframework.context.annotation.bean; @ SpringbootApplication @ activingzuulproxypublic class ZuulApplication {public static void main (String [] args) {SpringApplication.Run (zuulApplication.class, args); } // Laissez le filtre à Spring Management @bean public tokenFilter tokenFilter () {return new tokenFilter (); }}Ensuite, commençons la classe de démarrage et le premier accès sans jetons, comme suit:
Vous pouvez voir qu'un message sans autorisation est retourné. Ici, je veux dire que les jetons sont généralement placés dans l'en-tête de demande. Ici, nous ne faisons pas cela à des fins de démonstration.
Ensuite, prenez le jeton et visitez-le, comme suit:
Vous pouvez voir que notre demande a été envoyée.
Ici, je vais parler de la route par défaut et supprimer la configuration de Zuul, comme suit:
Server: Port: 5000Spring: Application: Nom: API-GETETEWAYEUREKA: #Client Client: #Register Center Address Service-URL: DefaultZone: http: // localhost: 8888 / eureka /, http: // localhost: 8889 / eureka /
Ensuite, redémarrez et continuez à accéder, comme suit:
,
Vous pouvez voir que nous pouvons continuer à accéder. Nous n'avons rien à faire, mais nous pouvons toujours y accéder. En effet, par défaut, vous êtes automatiquement déclaré avec le nom de votre service Hello-Service.
Donc, si je ne veux pas qu'il le déclare automatiquement pour moi et que je veux le définir moi-même, je peux utiliser des services Zuu.Intend dans le fichier de configuration YML pour le filtrer comme le filtrage, comme suit: "
Zuul: #if Ignored-Services: * signifie que tous les routes par défaut ont expiré. Vous devez les faire correspondre un par un. Personne ne sera aussi baisé, à moins que vous ne rencontriez des affaires étranges, les services d'ignore:
Parlons des règles de cartographie, par exemple
Zuul: Routes: #Identifier le nom de votre service, vous pouvez le définir vous-même ici. De manière générale, la commodité et les spécifications sont les mêmes que le nom de votre service Hello-Service: #Service Mapted Chemin, à travers ce chemin, vous pouvez accéder à votre service depuis l'extérieur. Le but est d'éviter d'exposer l'IP de votre machine, et l'itinéraire axé sur le service est pour vous. #Here Zuul dépend automatiquement de Hystrix et du ruban, pas pour le chemin autonome: / Hello-Service / ** # Ce doit être le nom de votre service de centre d'enregistrement Eureka, donc le serviceId est configuré ici car il est combiné avec Eureka. Si vous utilisez Zuul seul, vous devez écrire IP de votre machine, #Such comme URL: http: // localhost: 8080 / c'est mauvais, cela signifie écrire l'IP mort. Si cette adresse IP échoue et haute disponibilité, l'ensemble d'enregistrement de service ne sera pas utilisé ServiceId: Hello-ServiceZuul: Routes: Hello-Service: Path: / Hello-Service / ext / ** ServiceId: Hello-Service
Les deux chemins de mappage de configuration Zuul ici ont / Hello-Service /. Vous pouvez voir que / Hello-Service / ** inclut / Hello-Service / ext / **. Y a-t-il des conflits lorsqu'ils correspondent à ces deux chemins? Comment y faire face? Qui va correspondre en premier?
Voici l'ordre défini dans YML pour correspondre. S'il s'agit d'un fichier de configuration au format application.properties, cette commande ne peut pas être garantie. Les fichiers de configuration au format YML sont en séquence, qui peuvent être garantis. Veuillez noter ceci ici.
Et si nous voulons définir une règle de correspondance? Ensuite, nous devons définir un haricot dans la classe de démarrage, qui détermine votre itinéraire, comme suit:
Je ne le démontrerai pas ici. Lorsque vous en avez besoin, allez chercher des informations lentement.
Il y a aussi des points d'ignorance: comme suit:
Zuul: Routes: #Identifier le nom de votre service, vous pouvez le définir vous-même ici. De manière générale, la commodité et les spécifications sont les mêmes que le nom de votre service Hello-Service: #Service Mapted Chemin, à travers ce chemin, vous pouvez accéder à votre service depuis l'extérieur. Le but est d'éviter d'exposer l'IP de votre machine, et l'itinéraire axé sur le service est pour vous. #Here Zuul dépend automatiquement de Hystrix et du ruban, pas pour le chemin autonome: / Hello-Service / ** # Ce doit être le nom de votre service de centre d'enregistrement Eureka, donc le serviceId est configuré ici car il est combiné avec Eureka. Si vous utilisez Zuul seul, vous devez écrire IP de votre machine, #Such comme URL: http: // localhost: 8080 / c'est mauvais, cela signifie écrire une IP morte. Si cette IP échoue et haute disponibilité, l'ensemble d'enregistrement de service ne sera pas utilisé ServiceId: Hello-Service Ignored-Patterns: / Hello / **
Ignore-Patterns: indique que le chemin de / bonjour / ** est bloqué. Même si vous / Hello-Service / Hello / ** n'est pas possible, vous le bloquez toujours. Nous pouvons affiner davantage cette configuration. Par exemple, si je ne veux pas acheminer l'interface / bonjour, alors nous pouvons le configurer comme ci-dessus
Et si nous voulons également configurer le préfixe d'un service? Le code est le suivant:
Zuul: Routes: #Identifier le nom de votre service, vous pouvez le définir vous-même ici. De manière générale, la commodité et les spécifications sont les mêmes que le nom de votre service Hello-Service: #Service Mapted Chemin, à travers ce chemin, vous pouvez accéder à votre service depuis l'extérieur. Le but est d'éviter d'exposer l'IP de votre machine, et l'itinéraire axé sur le service est pour vous. #Here Zuul dépend automatiquement de Hystrix et du ruban, pas pour le chemin autonome: / Hello-Service / ** # Ce doit être le nom de votre service de centre d'enregistrement Eureka, donc le serviceId est configuré ici car il est combiné avec Eureka. Si vous utilisez Zuul seul, vous devez écrire IP de votre machine, #Such comme URL: http: // localhost: 8080 / Ce n'est pas assez bon pour écrire une IP morte. Si cette IP échoue, elle est fortement disponible et l'ensemble d'enregistrement de service ne sera pas utilisé ServiceId: Hello-Service Prefix: / API / **
Vous pouvez voir que les services que vous visitez doivent être préfixés avec / API /, tels que / API / Hello-Service / **
Que devons-nous faire si nous voulons sauter dans ma région si nous voulons faire un accès de chemin?
J'espère que l'utilisateur pourra automatiquement passer à cette méthode lors de l'accès / local. Ainsi, pour le moment, nous devons utiliser le saut local de Zuul, et la méthode de configuration est la suivante:
Zuul: Prefix: / API Ignored-Patterns: / ** / Hello / ** Routes: Local: Path: / Hello-Service / ** URL: Forward: / local
Certains des couramment utilisés, se connectant à Springsecurity ou à certains composants tiers, obtiendront certaines de vos informations de cookie. Ainsi, Zuul Gateway a tué toutes vos informations sur les cookies pour des raisons de sécurité, et il n'y a aucun moyen de faire des cookies. Il est tué par défaut.
Ici, Zuul fournit Zuul. Sensitive-Headers pour faire ces cookies et en-têtes pour vous, et ne filtrez pas ces informations. Contrôlez vos informations sensibles.
Par défaut, les informations d'en-tête sensibles ne peuvent pas être transmises par la passerelle API. Nous pouvons le rendre passable via la configuration suivante:
Zuul: Routes: Hello-Service: Path: / Hello-Service / ** ServiceId: Hello-Service-Headers Sensived-Headers: Cookie, En-tête et autres choses
Il peut également être utilisé avec certaines configurations détaillées de Hystrix, comme mentionné précédemment. Je n'en parlerai pas ici
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.