当前位置:网站首页>Démarrage des microservices: passerelle
Démarrage des microservices: passerelle
2022-07-04 08:37:00 【Mm écrire des bogues tous les jours】
Catalogue des articles
Introduction aux microservices:GatewayPasserelle
Un.、Pourquoi une passerelle est nécessaire
GatewayL'équivalent d'un gardien de but dans un micro - service,Ça peut nous aider à finir:
- Authentification et vérification des droits
- Acheminement des services et équilibrage des charges
- Demande de limitation de courant
InSpringCloudIl y a deux façons d'implémenter la passerelle moyenne:
- gateway
- zuul
Utilisation principalegateway,Parce queZuulEst basé surServletRéalisé,Appartient à la programmation de blocage.
EtSpringCloudGatewayEst basé surSpring5Disponible enWebFlux,Une mise en œuvre qui fait partie de la programmation réactive,Meilleure performance
2.、Mise en place d'un service de passerelle
Mise en place d'un service de passerelle,D'abord, nous devons créer unMavenModule, Il est recommandé de sélectionner un module vide ,Ne l'utilisez pas.SpringBootCréation de modèles, Sinon, une erreur inconnue se produira ( Parce que la première fois que j'ai utilisé SpringBootCréé par le modèle, Puis il y a eu des dépendances qui ne pouvaient pas être importées Bug)
Après avoir créé un vide MavenAprès le projet,Inpom.xmlImporter les dépendances suivantes
<!--nacosService Discovery Dependence-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--Introductiongateway Passerelle-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Après l'importation des dépendances,Ajouter manuellementGatewayApplicationEtymlDocumentation
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
Et aprèsyml Configurer la passerelle et le routage
La configuration du routage comprend::
1.Routageid:Identification unique de l'itinéraire
2.Cible de routage(uri):Adresse de destination du routage,httpAdresse fixe représentative,lbReprésente l'équilibrage de la charge par nom de service
3.Assertion de routage(predicates):Règles de routage,
4.Filtre de routage(filters):Traitement des demandes ou des réponses
server:
port: 10010
spring:
application:
name: gateway #Nom du service
cloud:
nacos:
server-addr: localhost:8848 #nacosAdresse
gateway:
routes:
- id: user-service # Routageid,Personnalisation,Seulement si c'est unique.
uri: lb://userservice # Adresse de destination du routage lbC'est l'équilibrage de la charge.,Suivi du nom du Service
predicates: # Assertion de routage,C'est - à - dire déterminer si la demande satisfait aux conditions des règles de routage
- Path=/user/** # Ceci correspond au chemin,Il suffit de prendre/user/Ça commence comme ça.
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
Si nous ajoutons plus d'un service à , Alors écrivez plus idC'est tout.
Ceci complète la construction de la passerelle
La passerelle construite jouera le rôle de gardien de but ,Quand nous demandons/user/**C'esturlQuand, Le Service sera jugé selon les règles de justification , Ensuite, équilibrez la charge et envoyez la demande .
Comme notre passerelle d'accès http://localhost:10010/user/1, Et ça correspond. /user/**Les règles,Demande transmise àuri:http://userservice/user/1,J'ai les résultats.:
Trois、Routage assertion Factory
Au - dessus deymlEn configuration,Vous pouvez voir qu'il y a unpredicates
C'estpredicates C'est l'assertion de routage ,Déterminer si la demande est conforme aux règles, Envoyer à la destination de routage si les règles sont respectées
Les règles d'assertion écrites dans le fichier de configuration ne sont que des chaînes,Ces chaînes serontPredicate FactoryLire et traiter,Conditions de passage au jugement de routage
Par exemple:Path=/user/**Correspond au chemin,Cette règle est appliquée parorg.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactoryLa classe gère
Des affirmations comme celle - ci affirment que l'usineSpringCloudGatewayUne douzaine d'autres.
Nom | Description | Exemple |
---|---|---|
After | Est une demande après un certain point dans le temps | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | Est une demande antérieure à un certain point dans le temps | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | Est une demande antérieure à deux points dans le temps | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | La demande doit contenir certainscookie | - Cookie=chocolate, ch.p |
Header | La demande doit contenir certainsheader | - Header=X-Request-Id, \d+ |
Host | La demande doit être l'accès à unhost(Nom de domaine) | - Host=.somehost.org,.anotherhost.org |
Method | Le mode de demande doit être spécifié | - Method=GET,POST |
Path | Le chemin de demande doit être conforme aux règles spécifiées | - Path=/red/{segment},/blue/** |
Query | Le paramètre de demande doit contenir le paramètre spécifié | - Query=name, JackOu- Query=name |
RemoteAddr | Du demandeuripDoit être une plage spécifiée | - RemoteAddr=192.168.1.1/24 |
Weight | Traitement du poids |
Quatre、Filtre de routage
GatewayFilterEst un filtre fourni dans la passerelle, Les demandes d'accès à la passerelle et les réponses retournées par le micro - service peuvent être traitées
SpringOffre31 Différentes usines de filtrage de routage , Plusieurs présentations sont disponibles ici
Nom | Description |
---|---|
AddRequestHeader | Ajouter un en - tête de requête à la requête courante |
RemoveRequestHeader | Supprimer un en - tête de requête dans la requête |
AddResponseHeader | Ajouter un en - tête de réponse aux résultats de la réponse |
RemoveResponseHeader | Supprimer du résultat de la réponse a un en - tête de réponse |
RequestRateLimiter | Limiter le trafic demandé |
4.1 Ajouter un filtreGatewayFilter
InGatewayDu moduleymlAjouter un filtre
L'exemple suivant est d'ajouter un en - tête de requête
server:
port: 10010
spring:
application:
name: gateway #Nom du service
cloud:
nacos:
server-addr: localhost:8848 #nacosAdresse
gateway:
routes:
- id: user-service # Routageid,Personnalisation,Seulement si c'est unique.
uri: lb://userservice # Adresse de destination du routage lbC'est l'équilibrage de la charge.,Suivi du nom du Service
predicates: # Assertion de routage,C'est - à - dire déterminer si la demande satisfait aux conditions des règles de routage
- Path=/user/** # Ceci correspond au chemin,Il suffit de prendre/user/Ça commence comme ça.
filters: #Filtre
- AddRequestHeader=Truth,Itcast is freaking aowsome!
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters: # Filtre par défaut, Sera valable pour toutes les demandes de routage
- AddRequestHeader=Truth,Itcast is freaking aowsome!
filters C'est un filtre local ,Comme indiqué dans le code ci - dessus,C'est seulementuser-serviceÇa marche.
Etdefault-filtersEst le filtre par défaut, Tous les services de routage fonctionnent
4.2 Filtres globauxGlobalFilter
Le rôle du filtre global est également de traiter toutes les demandes d'accès à la passerelle et les réponses des microservices,AvecGatewayFilterC'est la même chose que.
La différence est queGatewayFilterDéfinition par configuration,La logique de traitement est fixe.EtGlobalFilterLa logique doit être implémentée en écrivant votre propre code.
Défini comme une mise en œuvreGlobalFilterInterface.
D'abord, nous sommesGateway Module ajouter un JavaCatégorie
// @Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.Obtenir les paramètres de la requête
ServerHttpRequest request = exchange.getRequest();
//2.Obtenir tous les paramètres
MultiValueMap<String, String> queryParams = request.getQueryParams();
//3.AccèsAuthorizationParamètres
String first = queryParams.getFirst("Authorization");
//4.Déterminer si le paramètre estadmin
if ("admin".equals(first)){
//5.Oui, laissez passer.
return chain.filter(exchange);
}
//6.Définir le Code d'état
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//7.Interception des demandes
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1;
}
}
Le rôle principal de cette classe est d'implémenter GlobalFilter, Juger les demandes envoyées AuthorizationLe paramètre estadmin, Dans l'affirmative, laissez passer , Non, le Code d'état est 401Puis interceptez la demande
Notez que, Cet intercepteur doit être utilisé @ComponentNote àSpringHébergement
Et nous pouvons définir la priorité de l'intercepteur (Plus le nombre est petit,Plus la priorité est élevée)
Par exemple, en [email protected](-1)Définir les priorités
Vous pouvez également choisir d'implémenter OrderedInterfacegetOrderMéthodes,Renvoie un nombre, Ce numéro détermine la priorité de l'intercepteur
4.3 Séquence d'exécution du filtre
La demande d'accès à la passerelle rencontre trois types de filtres:Filtre pour la route actuelle、DefaultFilter、GlobalFilter
Après la demande de routage,Les filtres de routage actuels etDefaultFilter、GlobalFilter,Fusionner dans une chaîne de filtres(Ensemble)Moyenne,Exécuter chaque filtre après tri
- Chaque filtre doit avoir unintTypeorderValeur,orderPlus la valeur est faible,Plus la priorité est élevée,Plus la séquence d'exécution est avancée.
- GlobalFilterPar la réalisationOrderedInterface,Ou [email protected] pour spécifierorderValeur,Désigné par nous - mêmes
- Filtres de routage etdefaultFilterDeorderParSpringDésignation,La valeur par défaut est de1Incrémental.
- Lorsque le filtreorderQuand la valeur est la même,Il va suivre defaultFilter > Filtre de routage > GlobalFilterExécution séquentielle.
Cinq、Résolution de problèmes transrégionaux
Qu'est - ce qu'un problème inter - domaines?
Développé avant SpringBoot+vueAu moment du projet, S'il n'y a pas de résolution de problèmes inter - domaines ,Je l'utilise.axios Envoyer une demande à l'arrière - plan signale une erreur
C'est parce que les numéros de port de l'avant et de l'arrière sont différents ,Le navigateur empêche l'initiateur de la demande de traverser le domaine avec le serveurajaxDemande
Donc le problème transversal est Le navigateur empêche l'initiateur de la demande de traverser le domaine avec le serveurajaxDemande,Problèmes avec les demandes interceptées par le Navigateur
Sauf que les différents ports peuvent causer des problèmes inter - domaines , Si le nom de domaine est différent , Cela peut également causer des problèmes transfrontaliers
Solutions:CORS
server:
port: 10010
spring:
application:
name: gateway #Nom du service
cloud:
nacos:
server-addr: localhost:8848 #nacosAdresse
gateway:
globalcors: # Global Cross - Domain Processing
add-to-simple-url-handler-mapping: true # RésolutionoptionsProblème d'interception de la demande
corsConfigurations:
'[/**]':
allowedOrigins: # Quelles demandes inter - domaines sont autorisées pour les sites Web
- "http://127.0.0.1:5500"
- "http://www.leyou.com"
allowedMethods: # Domaines croisés autorisésajaxMode de demande
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # Informations d'en - tête autorisées dans la demande
allowCredentials: true # Est - il permis de transportercookie
maxAge: 360000 # Durée de validité de cette détection inter - domaines
Ingateway Configuration ci - dessus configurée dans le module passerelle , Résoudre les problèmes transfrontaliers
边栏推荐
- Email alarm configuration of ZABBIX monitoring system
- Learn nuxt js
- go-zero微服务实战系列(九、极致优化秒杀性能)
- What sparks can applet container technology collide with IOT
- Technology sharing | MySQL parallel DDL
- PHP converts seconds to timestamps - PHP
- Newh3c - routing protocol (RIP, OSPF)
- MySQL relearn 1-centos install mysql5.7
- 猜数字游戏
- Leetcode topic [array] -136- numbers that appear only once
猜你喜欢
Moher college phpMyAdmin background file contains analysis traceability
[test de performance] lire jmeter
1. Getting started with QT
manjaro安装微信
NewH3C——ACL
ES6 summary
[go basics] 2 - go basic sentences
墨者学院-PHPMailer远程命令执行漏洞溯源
Question 49: how to quickly determine the impact of IO latency on MySQL performance
Azure ad domain service (II) configure azure file share disk sharing for machines in the domain service
随机推荐
C#实现一个万物皆可排序的队列
DM8 tablespace backup and recovery
What sparks can applet container technology collide with IOT
std::is_ union,std::is_ class,std::integral_ constant
2022 electrician (intermediate) examination question bank and electrician (intermediate) examination questions and analysis
Openfeign service interface call
Snipaste convenient screenshot software, which can be copied on the screen
Laravel page load problem connection reset - PHP
FRP intranet penetration, reverse proxy
[untitled] 2022 polymerization process analysis and polymerization process simulation examination
How to send pictures to the server in the form of file stream through the upload control of antd
ctfshow web255 web 256 web257
Mouse over to change the transparency of web page image
Technology sharing | MySQL parallel DDL
[CV] Wu Enda machine learning course notes | Chapter 9
[gurobi] establishment of simple model
How college students choose suitable computers
Scanf read in data type symbol table
manjaro安装微信
一文了解数据异常值检测方法