fundo de roteamento dinâmico
Se você usa Zuul ou Primavera Nuvem gateway quando as soluções oficiais oferta de documento são sempre baseadas no caminho da configuração do perfil
Por exemplo:
Configuração da forma # Zuul
rotas:
pig-auth:
caminho: / auth / **
serviceId: Porco-auth
stripPrefix: true
# Formulário de configuração de gateway
rotas:
- id: pigx-auth
uri: lb: // pigx-auth
predicados:
- Path = / auth / **
filtros:
- ValidateCodeGatewayFilter
As alterações de configuração precisa reiniciar o serviço, não pode atender o processo de produção real de atualização dinâmica, em tempo real evolução das necessidades de negócios.
Com base na análise acima porco versão Zuul tem sido dinâmica roteamento funcionalidade baseada fornecido anexado Git endereço de portal, a figura a seguir pode ser configurado para modificar a atualização em tempo real.
fonte carga da mola nuvem Gateway Routing
Primavera Nuvem gateway dinâmico padrão de roteamento para alcançar
GatewayControllerEndpoint baseada na implementação endpoint actuate padrão, o suporte dinâmico de nível JVM roteamento, o armazenamento não pode ser serializado
A informação de roteamento dinâmico padrão salvos na memória // Figura realização é alcançada com base classe pública implementos InMemoryRouteDefinitionRepository RouteDefinitionRepository { Mapa final privado < String, RouteDefinition > rotas = synchronizedMap (novo LinkedHashMap < String, RouteDefinition > ()); @Override pública Mono < vazio > save (Mono < RouteDefinition > route) {} @Override pública Mono < vazio > delete (Mono < corda > routeId) {} @Override pública Flux < RouteDefinition > getRouteDefinitions () {} }Expansão baseada MySQL + Redis componente de armazenamento dinâmico distribuído
Por que usar o MySQL ao mesmo tempo, mas também para usar Redis?
Expandir idéias
realização
/ **
* Lengleng @author
* @Date 2018 Nian 11 Yue 06 Ri 10:27:55
* < p >
* Com base processo de encaminhamento dinâmico
* /
@ Slf4j
@AllArgsConstructor
@Service ( "sysRouteConfService")
classe pública SysRouteConfServiceImpl estende ServiceImpl < SysRouteConfMapper, SysRouteConf > implementos SysRouteConfService {
private final RedisTemplate redisTemplate;
private final ApplicationEventPublisher applicationEventPublisher;
/ **
* Obter todas as rotas
* < p >
* RedisRouteDefinitionWriter.java
* PropertiesRouteDefinitionLocator.java
*
* @return
* /
@Override
Lista pública < SysRouteConf > rotas () {
condição SysRouteConf = novo SysRouteConf ();
condition.setDelFlag (CommonConstant.STATUS_NORMAL);
retorno baseMapper.selectList (novo EntityWrapper < > (Para a condição Condition));
}
/ **
* As informações de roteamento de atualização
*
* rotas @param informações de roteamento
* @return
* /
@Override
pública Mono < vazio > editRoutes (rotas JSONArray) {
// limpar o cache Redis
resultado booleano = redisTemplate.delete (CommonConstant.ROUTE_KEY);
log.info ( "routing vazio porta de entrada {}", resultado);
// Traverse modificado rotas, para salvar Redis
lista < RouteDefinitionVo > routeDefinitionVoList = new ArrayList < > ();
routes.forEach (valor - > {
log.info ( "update de roteamento - > {}", Value);
RouteDefinitionVo Vo = novo RouteDefinitionVo ();
mapa < String, Object > Roteiro valor = (Mapa);
Object ID = map.get ( "routeId");
if (ID! = null) {
vo.setId (String.valueOf (id));
}
predicados objeto = map.get ( "predicados");
if (predicados! = null) {
JSONArray predicatesArray = (JSONArray) predicados;
lista < PredicateDefinition > predicateDefinitionList =
predicatesArray.toList (PredicateDefinition.class);
vo.setPredicates (predicateDefinitionList);
}
filtros objeto = map.get ( "filtros");
if (filtros! = null) {
JSONArray filtersArray = (JSONArray) filtra;
lista < FilterDefinition > filterDefinitionList
= FiltersArray.toList (FilterDefinition.class);
vo.setFilters (filterDefinitionList);
}
Objecto uri = map.get ( "uri");
if (uri! = null) {
vo.setUri (URI.create (String.valueOf (uri)));
}
ordem objeto = map.get ( "fim");
if (ordem! = null) {
vo.setOrder (Integer.parseInt (String.valueOf (fim)));
}
redisTemplate.setHashValueSerializer (novo Jackson2JsonRedisSerializer < > (RouteDefinitionVo.class));
redisTemplate.opsForHash () colocado (CommonConstant.ROUTE_KEY, vo.getId (), vo) .;
routeDefinitionVoList.add (VO);
});
// exclui toda a lógica
condição SysRouteConf = novo SysRouteConf ();
condition.setDelFlag (CommonConstant.STATUS_NORMAL);
this.delete (novo EntityWrapper < > (Para a condição Condition));
// inserção para encaminhamento força
lista < SysRouteConf > routeConfList = routeDefinitionVoList.stream () mapa (vo. - > {
SysRouteConf routeConf = novo 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 () ().);
voltar routeConf;
.}) Collect (Collectors.toList ());
this.insertBatch (routeConfList);
log.debug ( "Update Gateway Routing End");
this.applicationEventPublisher.publishEvent (novo RefreshRoutesEvent (this));
regresso Mono.empty ();
}
}
3. Biblioteca Tabela de Definição
Autor do blog: gg frio
Uma coluna blog diário, os artigos técnicos diária recomendada de excelente qualidade blogueiros para você. Congratulando-se com a apresentação do usuário, uma vez que o artigo é incluído na conta oficial, que irá recomendar oh em casa e outros locais. China preocupada com o acesso diário fonte OSC aberta para empurrar qualidade, clique em " Saiba mais "Leia o artigo original.