blog diário | Extensão programa Primavera Nuvem gateway armazenadas informações de roteamento

Clique no canto superior direito, o foco em manchetes OSC de código aberto sobre a China, obter as últimas informações técnicas

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

  • DispatcherHandler para assumir uma solicitação do usuário
  • RoutePredicateHandlerMapping partidas rota
  • De acordo RouteLocator get RouteDefinitionLocator
  • RouteDefinitionLocator.getRouteDefinitions pluralidade de volta () informações de encaminhamento definidos
  • FilteringWebHandler realizar o roteamento filtro definição finalmente encaminhado para serviços específicos de negócios
  • 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?

  • gateway de primavera nuvem pressão webflux volta com base não suporta banco de dados mysql
  • Redis-reactivos apoio contrapressão mola CloudGateway, mas também pode realizar distribuído, de alto desempenho
  • Expandir idéias

  • Adicionar um módulo de gestão de rotas, referência GatewayControllerEndpoint alcançar, perfis de carga no banco de dados Redis para começar
  • módulo de gateway RouteDefinitionRepository reescrever, getRouteDefinitions () pode ser realizado leitura tirada Redis
  • Json-visualizar front-end com um tampão semelhante modificar directamente a mostra.
  • realização

  • Route módulo de gestão de lógica de processamento central, vias de acesso e atualizações de rota
  • / **

     * 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 ();

    }

    }

  • Gateway personalizado RedisRouteDefinitionRepository
  • / ** * Lengleng @author * @Date 2018/10/31 * < p > * Redis guardar informações, uma prioridade maior do que o arquivo de configuração de roteamento * / @ Slf4j @Component @AllArgsConstructor classe pública implementos RedisRouteDefinitionWriter RouteDefinitionRepository { private final RedisTemplate redisTemplate; @Override pública Mono < vazio >  save (Mono < RouteDefinition >  route) { retorno route.flatMap (r - >  { RouteDefinitionVo Vo = novo RouteDefinitionVo (); BeanUtils.copyProperties (r, vo); log.info ( "Routing Information armazenados {}", vo); redisTemplate.opsForHash () colocado (CommonConstant.ROUTE_KEY, r.getId (), vo) .; regresso Mono.empty (); }); } @Override pública Mono < vazio >  delete (Mono < corda >  routeId) { routeId.subscribe (id - >  { log.info ( "Delete Routing Information {}", id); redisTemplate.opsForHash () delete (CommonConstant.ROUTE_KEY, id) .; }); regresso Mono.empty (); } / ** * entradas de roteamento dinâmico * * @return * / @Override pública Flux < RouteDefinition >  getRouteDefinitions () { redisTemplate.setHashValueSerializer (novo Jackson2JsonRedisSerializer < > (RouteDefinitionVo.class)); lista < RouteDefinitionVo >  Valores = redisTemplate.opsForHash () valores (CommonConstant.ROUTE_KEY) .; lista < RouteDefinition >  definitionList = new ArrayList < > (); values.forEach (vo - >  { RouteDefinition routeDefinition = novo RouteDefinition (); BeanUtils.copyProperties (VO, routeDefinition); definitionList.add (VO); }); log.debug ( "Redis número de encaminhamento é definida: {}, {}", definitionList.size (), definitionList); retorno Flux.fromIterable (definitionList); } }

    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.

    24 ganhou 5,07 milhões de ações no mercado desde o final de dez milhões de retorno sobre o valor contábil do investimento território Yao Ming
    Anterior
    Google lançou web.dev:Let's construir o futuro da web
    Próximo