Pular para conteúdo

Arquitetura de referência cloud

Origem: diagrama 11-10-arquitetura_v2.jpg, fornecido pelo arquiteto. Tipo: referência arquitetural.

Abrir imagem original preservada

Diagrama fornecido pelo arquiteto

Ambiente: referência cloud sem associação comprovada a DEV, STAGING ou PROD. Não reconstrói a infraestrutura do TOTVS Apps. A comparação abaixo contrapõe código e ambiente local à referência; diferenças não indicam falhas do corporativo.

Entrada / APIDomínio / processamentoSegurançaDados / cacheEventos / jobsSistema externo

Retângulos representam serviços ou grupos nomeados; cilindros, armazenamento; caixas com bordas duplas, mensageria; formas arredondadas, sistemas externos. As setas indicam chamadas ou transporte de dados, conforme o rótulo.

Síntese versionável da referência

Quais relações a referência propõe para entrada, dados e conectividade? As setas tracejadas pertencem à referência arquitetural.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    dns(["DNS externo"]):::external
    subgraph gcp["Referência GCP · GKE"]
      cp["Control Plane<br/><small>BFF e administração</small>"]:::entry
      dp["Data Plane<br/><small>Execução e suporte</small>"]:::domain
    end
    atlas[("MongoDB Atlas")]:::store
    mq[["CloudAMQP"]]:::async
    onprem(["Serviços on-premises"]):::external
    dns -.->|Entrada proposta| cp
    dns -.->|Entrada proposta| dp
    cp -.->|Peering| atlas
    cp -.->|Eventos| mq
    dp -.->|Túnel proposto| onprem
    classDef entry stroke-width:1.5px;
    classDef domain stroke-width:1.5px;
    classDef store stroke-width:1.5px;
    classDef async stroke-width:1.5px;
    classDef external stroke-width:1.5px;

Recursos complementares da referência

Localização indicada Recurso / responsabilidade
Projeto GCP gateway-project, região southamerica-east1
GKE Namespaces control-plane, data-plane, keycloak e telemetry
Namespace keycloak Imagem customizada e bootstrap; conexão com PostgreSQL
Namespace telemetry OTel Collector
GCP Services PostgreSQL e Redis
Projeto GCP Elasticsearch e Gateway Storage
Fora do projeto MongoDB Atlas e CloudAMQP

A tabela mantém os recursos da imagem original sem acrescentar relações de consumo ausentes.

Todas as setas deste desenho pertencem à referência arquitetural. Redis, Elasticsearch e Storage aparecem sem associação completa de consumidores na imagem; o resumo não inventa essas conexões. Os containers lógicos e contratos reais estão nas páginas Lógica e Dependências.

Correspondências com código e diferenças do ambiente local

Elemento da referência Evidência de código ou declaração local Classificação
BFF, Core, políticas, Templates, Registry, Broker, Builder, Router, Discovery e Checker Contratos implementados Correspondência funcional
Outbox Dispatcher no Core Sidecar no Deployment do Core Correspondência declarativa local
Cache Monitor separado CronJob; fonte no repo Invalidator Mesmo componente, unidade Git diferente
Web Pages Java/Quarkus; GCS para HTML e OpenAPI Doc para JSON Implementado; fora do agregador local
tunnel-server no dataplane Serviço Tunnel administra Cloudflare e pacotes de cliente Papel divergente; servidor próprio não confirmado
Namespaces control/data plane Default local usa totvs-gateway Diferença entre referência e ambiente local
Atlas, CloudAMQP, VPC/peering, GKE regional Helmfiles locais usam Kind e serviços no cluster Implementação cloud não comprovada neste workspace
/oauth2/token externo BFF declara /auth/token Contrato externo a reconciliar
Grupo Persistence Services JSON Handler, Monitoring e Auth Provider têm funções distintas de persistência Agrupamento não deve definir ownership de dados
Scheduler em Runtime Services Agenda quotas e chamadas HTTP, inclusive limpeza de instâncias Não integra toda chamada de API
Accounts/Authenticator e Cloudflare Clients explícitos nos serviços backend Dependências que precisam complementar o contexto

Fontes: agregador, Core Deployment, namespace default, Web Pages, TunnelService, OAuth público, Scheduler.

Evidência corporativa necessária para confirmar deployment

Manifestos e valores do ambiente cloud, contexto/namespace, imagem e digest por workload, configuração de ingress, identidade de serviços, rede/peering e inventário de dependências gerenciadas. Segredos não devem ser copiados para a documentação. Até obter essas evidências, HA, mTLS, backups, SLO, RPO/RTO e isolamento cloud permanecem não confirmados.