当前位置:网站首页>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
边栏推荐
- How does Xiaobai buy a suitable notebook
- Go h*ck yourself:online reconnaissance (online reconnaissance)
- DM8 command line installation and database creation
- What should I do if there is a problem with the graphics card screen on the computer
- DM8 tablespace backup and recovery
- C # implements a queue in which everything can be sorted
- How to use C language code to realize the addition and subtraction of complex numbers and output structure
- Do you know about autorl in intensive learning? A summary of articles written by more than ten scholars including Oxford University and Google
- DM8 uses different databases to archive and recover after multiple failures
- Email alarm configuration of ZABBIX monitoring system
猜你喜欢
Leetcode topic [array] -136- numbers that appear only once
Newh3c - network address translation (NAT)
[performance test] read JMeter
What sparks can applet container technology collide with IOT
[test de performance] lire jmeter
墨者学院-PHPMailer远程命令执行漏洞溯源
[CV] Wu Enda machine learning course notes | Chapter 9
广和通高性能4G/5G无线模组解决方案全面推动高效、低碳智能电网
SSRF vulnerability exploitation - attack redis
[attack and defense world | WP] cat
随机推荐
How to set multiple selecteditems on a list box- c#
Learn nuxt js
Use preg_ Match extracts the string into the array between: & | people PHP
C#实现一个万物皆可排序的队列
How to play dapr without kubernetes?
C, Numerical Recipes in C, solution of linear algebraic equations, Gauss Jordan elimination method, source code
std::is_ union,std::is_ class,std::integral_ constant
猜数字游戏
Redis sentinel mechanism
How does Xiaobai buy a suitable notebook
R language ggplot2 visualization: ggplot2 visualization grouping box diagram, place the legend and title of the visualization image on the top left of the image and align them to the left, in which th
Openfeign service interface call
C#,数值计算(Numerical Recipes in C#),线性代数方程的求解,Gauss-Jordan消去法,源代码
Unity write word
The upper layer route cannot Ping the lower layer route
DM8 database recovery based on point in time
如何通过antd的upload控件,将图片以文件流的形式发送给服务器
Leetcode 23. 合并K个升序链表
Internal learning
[Chongqing Guangdong education] National Open University spring 2019 455 logistics practice reference questions