blog quotidien | Programme Elargi Spring Nuage Passerelle d'information de routage stockées

Cliquez en haut à droite, se concentrer sur les titres de la CVMO open source sur la Chine, obtenir les dernières informations techniques

arrière-plan de routage dynamique

Que vous utilisiez ou Zuul Spring Nuage passerelle lorsque les solutions de document d'offre officielles sont toujours basées sur la façon dont la configuration de profil

Par exemple:

 Configuration du formulaire # Zuul

 Voies:

 porc-auth:

 Chemin: / auth / **

 serviceId: porc-auth

 stripPrefix: true

 # Formulaire de configuration de passerelle

 Voies:

 - id: pigx-auth

 uri: lb: // pigx-auth

 prédicats:

 - Path = / auth / **

 filtres:

 - ValidateCodeGatewayFilter

Les modifications de configuration doivent redémarrer le service, ne peut pas répondre au processus de production réelle de rafraîchissement dynamique, en temps réel l'évolution des besoins d'affaires.

Sur la base de l'analyse ci-dessus porc la version Zuul a été fourni des fonctionnalités de routage dynamique basée adresse portail Git ci-joint, la figure suivante peut être configuré pour modifier le rafraîchissement en temps réel.

source de charge de routage passerelle nuage Spring

  • DispatcherHandler de prendre en charge une demande de l'utilisateur
  • RoutePredicateHandlerMapping matchs de route
  • Selon RouteLocator get RouteDefinitionLocator
  • RouteDefinitionLocator.getRouteDefinitions Retour pluralité () des informations de routage définies
  • FilteringWebHandler effectuer le routage filtre de définition finalement acheminé vers des services d'affaires spécifiques
  • dynamique par défaut Nuage Spring passerelle de routage pour atteindre

    GatewayControllerEndpoint basé sur la mise en uvre du point de terminaison actionnent par défaut, prise en charge dynamique de niveau JVM de routage, le stockage ne peut pas être sérialisé

    Les informations de routage dynamique par défaut enregistré sur la mémoire // Figure réalisation est réalisée basée public class {InMemoryRouteDefinitionRepository outils RouteDefinitionRepository Carte finale privée < String, RouteDefinition >  routes = synchronizedMap (nouveau LinkedHashMap < String, RouteDefinition > ()); @Override Mono publique < vide >  save (Mono < RouteDefinition >  itinéraire) {} @Override Mono publique < vide >  supprimer (Mono < chaîne >  routeId) {} @Override Flux du public < RouteDefinition >  getRouteDefinitions () {} }

    Extension sur la base Mysql + Redis distribué composant de stockage de dynamique

    Pourquoi Majeures en même temps, mais aussi d'utiliser Redis?

  • passerelle nuage de printemps à base de pression arrière webflux ne prend pas en charge la base de données MySQL
  • support Redis-réactifs contre-pression CloudGateway ressort, mais peut également réaliser distribué, à haute performance
  • développer des idées

  • Ajouter un module de gestion d'itinéraire, référence GatewayControllerEndpoint réaliser, profils de charge dans la base de données Redis pour commencer
  • Module de passerelle RouteDefinitionRepository réécriture, getRouteDefinitions () peut être réalisée lecture pris Redis
  • Json-view-extrémité avant avec une prise similaire modifier directement le spectacle.
  • réalisation

  • Route module de gestion logique de traitement de base, les voies d'accès et les mises à jour de route
  • / **

     * @Author lengleng

     * @Date 2018 Nian 11 Yue 06 Ri 10:27:55

     * < p >

     * Processus de routage dynamique basé

     * /

    @ SLF4J

    @AllArgsConstructor

    @Service ( "sysRouteConfService")

    public class SysRouteConfServiceImpl étend ServiceImpl < SysRouteConfMapper, SysRouteConf >  met en uvre SysRouteConfService {

    finale privée RedisTemplate redisTemplate;

    finale privée ApplicationEventPublisher applicationEventPublisher;

    / **

     * Obtenez tous les itinéraires

     * < p >

     * RedisRouteDefinitionWriter.java

     * PropertiesRouteDefinitionLocator.java

     *

     * @Return

     * /

    @Override

    Liste publique < SysRouteConf >  routes () {

    SysRouteConf condition = nouveau SysRouteConf ();

    condition.setDelFlag (CommonConstant.STATUS_NORMAL);

    retour baseMapper.selectList (nouveau EntityWrapper < > (Pour connaître l'état Condition));

    }

    / **

     * Informations de routage de mise à jour

     *

     * Itinéraires @param Routing Information

     * @Return

     * /

    @Override

    Mono publique < vide >  editRoutes (des itinéraires JSONArray) {

    // efface le cache Redis

    résultat booléen = redisTemplate.delete (CommonConstant.ROUTE_KEY);

    log.info ( "Vider le routage de passerelle {}", résultat);

    // Traverse modifié les routes, pour sauver Redis

    liste < RouteDefinitionVo >  routeDefinitionVoList = new ArrayList < > ();

    routes.forEach (valeur - >  {

    log.info ( « mise à jour de routage - > {} », Valeur);

    RouteDefinitionVo vo = nouveau RouteDefinitionVo ();

    carte < String, Object >  map = (Map) valeur;

    id Object = map.get ( "routeId");

    if (id! = null) {

    vo.setId (String.valueOf (id));

    }

    prédicats Object = map.get ( "prédicats");

    si (prédicats! = null) {

    JSONArray predicatesArray = (JSONArray) prédicats;

    liste < PredicateDefinition >  predicateDefinitionList =

    predicatesArray.toList (PredicateDefinition.class);

    vo.setPredicates (predicateDefinitionList);

    }

    filtres Object = map.get ( "filtres");

    si (filtres! = null) {

    Filtres JSONArray filtersArray = (JSONArray);

    liste < FilterDefinition >  filterDefinitionList

    = FiltersArray.toList (FilterDefinition.class);

    vo.setFilters (filterDefinitionList);

    }

    Objet uri = map.get ( "uri");

    si (uri! = null) {

    vo.setUri (URI.create (String.valueOf (uri)));

    }

    ordre Object = map.get ( "ordre");

    si (commande! = null) {

    vo.setOrder (Integer.parseInt (String.valueOf (ordre)));

    }

    redisTemplate.setHashValueSerializer (nouveau Jackson2JsonRedisSerializer < > (RouteDefinitionVo.class));

    redisTemplate.opsForHash () mis (CommonConstant.ROUTE_KEY, vo.getId (), voix off) .;

    routeDefinitionVoList.add (vo);

    });

    // supprimer toute logique

    SysRouteConf condition = nouveau SysRouteConf ();

    condition.setDelFlag (CommonConstant.STATUS_NORMAL);

    this.delete (nouveau EntityWrapper < > (Pour connaître l'état Condition));

    // insérer dans le routage de la force

    liste < SysRouteConf >  routeConfList = carte routeDefinitionVoList.stream () (voix off. - >  {

    SysRouteConf routeConf = new SysRouteConf ();

    routeConf.setRouteId (vo.getId ());

    routeConf.setFilters (JSONUtil.toJsonStr (vo.getFilters ()));

    routeConf.setPredicates (JSONUtil.toJsonStr (vo.getPredicates ()));

    routeConf.setOrder (vo.getOrder ());

    routeConf.setUri (vo.getUri () toString ().);

    retourner routeConf;

    .}) Collect (Collectors.toList ());

    this.insertBatch (routeConfList);

    log.debug ( "Mise à jour passerelle de routage End");

    this.applicationEventPublisher.publishEvent (nouveau RefreshRoutesEvent (this));

    retourner Mono.empty ();

    }

    }

  • Passerelle sur mesure RedisRouteDefinitionRepository
  • / ** * @Author lengleng * @Date 31/10/2018 * < p > * Redis sauvegarder des informations de routage, une priorité plus élevée que le fichier de configuration * / @ SLF4J @component @AllArgsConstructor public class {RedisRouteDefinitionWriter outils RouteDefinitionRepository finale privée RedisTemplate redisTemplate; @Override Mono publique < vide >  save (Mono < RouteDefinition >  itinéraire) { retour route.flatMap (r - >  { RouteDefinitionVo vo = nouveau RouteDefinitionVo (); BeanUtils.copyProperties (r, vo); log.info ( "informations de routage stocké {}", voix off); redisTemplate.opsForHash () mis (CommonConstant.ROUTE_KEY, r.getId (), voix off) .; retourner Mono.empty (); }); } @Override Mono publique < vide >  supprimer (Mono < chaîne >  routeId) { routeId.subscribe (id - >  { log.info ( "Supprimer informations de routage {}", id); redisTemplate.opsForHash () supprimer (CommonConstant.ROUTE_KEY, id) .; }); retourner Mono.empty (); } / ** * entrées de routage dynamique * * @Return * / @Override Flux du public < RouteDefinition >  getRouteDefinitions () { redisTemplate.setHashValueSerializer (nouveau Jackson2JsonRedisSerializer < > (RouteDefinitionVo.class)); liste < RouteDefinitionVo >  Valeurs = valeurs redisTemplate.opsForHash () (CommonConstant.ROUTE_KEY) .; liste < RouteDefinition >  definitionList = new ArrayList < > (); values.forEach (voix off - >  { RouteDefinition routeDefinition = new RouteDefinition (); BeanUtils.copyProperties (vo, routeDefinition); definitionList.add (vo); }); log.debug ( "REDIS nombre de routage est défini: {} {}", definitionList.size (), definitionList); retour Flux.fromIterable (definitionList); } }

    3. Bibliothèque Définition de la table

     Auteur du blog froid gg

     Une colonne de blog quotidien, les articles techniques de qualité avec d'excellents blogueurs quotidien recommandé pour vous. Tout en se félicitant de la présentation de l'utilisateur, une fois que l'article est inclus dans le compte officiel, nous recommanderons oh à la maison et d'autres endroits. La Chine préoccupée par l'accès quotidien OSC open source pour pousser la qualité, cliquez sur " En savoir plus « Lire l'article original.

    24 a gagné 5,07 millions d'actions sur le marché depuis la fin de dix millions de retour sur la valeur comptable du territoire d'investissement Yao Ming
    Précédent
    Google a publié web.dev:Let's construire l'avenir du web
    Prochain
    MT700 clavier mécanique évaluation de l'expérience Pennefather: tri-mode mécanique +, il est la nouvelle coqueluche du bureau!
    Mise à jour logicielle Shu VS code 1.29 libération, de nombreuses nouvelles fonctionnalités ne sont pas ce que vous voulez?
    Quitter le Japon pour donner le « frais de rupture », 3 ans doivent payer! Les touristes cur fatigué: je ne pouvais pas parler « au revoir »
    2018 Reconnaissance des visages de développement technologique situation et les tendances 2019 montant de brevet de développement visant à améliorer de façon continue la Chine le premier algorithme d
    rasoir électrique Direction volant FS363 Expérience: Trois têtes ne sont pas étanches + 60 minutes + vie
    statistiques d'utilisation: Chine marché M & A au troisième trimestre 2017 rapport de données
    Fou fabricants mars sont finalement partis main dans une sorte de réponses
    nuages matin voiture | marque Geely nouvelle énergie ou l'indépendance, le président chinois Nissan Jose ou rouler en cas Ghosn
    Chi Chuan GM6 cher? | Cartes oncle voiture
    visage fille américaine abandonnent leurs parents chinois: Je vous remercie, cela est une bonne chose
    58 résultats ville que prévu le jeudi avant que le disque a augmenté de plus de 3 pour cent au troisième trimestre
    +2411 prix automobiles fournisseurs: CES 2019 technologie automobile complètement spoilers