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
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?
développer des idées
réalisation
/ **
* @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 ();
}
}
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.