Pular para conteúdo

Dependências e integrações

Esta página responde quem consome quem, para quê e por qual mecanismo. O inventário cobre os 23 microserviços backend do workspace: chamadas HTTP, callbacks, hooks delegados e circuitos assíncronos implementados. Cada linha representa um par origem/destino e agrupa as operações com a mesma finalidade; não é um catálogo de todos os endpoints.

As tabelas separam relações entre serviços Gateway de integrações externas e de transporte assíncrono. A coluna Código aponta ao cliente, chamador ou consumidor no commit analisado. O detalhamento de endpoints do BFF permanece no Control Plane; bancos, chaves Redis e compartilhamento de dados ficam na modelagem de dados.

Chamadas síncronas

Entrada administrativa — BFF

São os 14 destinos HTTP internos do BFF. Accounts, Authenticator e os dois destinos iPaaS estão na tabela de integrações externas. SSE é um stream HTTP iniciado pelo BFF, não uma assinatura RabbitMQ.

Origem Destino Finalidade Mecanismo Código
BFF Core Administrar gateways, rotas, revisões, categorias, wizard e favoritos HTTP/JSON código · código
BFF Template Service Autoria, publicação, instanciação, upgrade e acompanhamento de operações HTTP/JSON e SSE código · código
BFF Global Registry Consultar catálogo, resolver modelo/owner/versão e administrar aliases HTTP/JSON código · código
BFF Importer Iniciar/reprocessar importação e acompanhar resultados HTTP/JSON e SSE código · código
BFF Security Administrar autorizações e regenerar segredos HTTP/JSON código
BFF IP Policy Administrar políticas de IP HTTP/JSON código
BFF Rate Limit Administrar quotas HTTP/JSON código
BFF Tunnel Administrar túneis, token e instruções de instalação HTTP/JSON e conteúdo textual código
BFF JSON Handler Gerar variáveis/schemas e transformar formulários HTTP/JSON código · código
BFF Monitoring Consultar logs e métricas HTTP/JSON código
BFF Auth Provider Testar OAuth/OIDC e expor emissão/JWKS públicos HTTP/JSON código
BFF Object Storage Enviar, ler e excluir arquivos; servir leitura pública HTTP multipart/binário/JSON código
BFF OpenAPI Doc Obter documentação do template no contexto do owner HTTP/JSON código
BFF Web Pages Obter apresentação documental do catálogo HTTP/HTML código

Configuração, modelos e políticas

Origem Destino Finalidade Mecanismo Código
Core Security Consultar/validar autorizações referenciadas HTTP/JSON código
Core IP Policy Consultar/validar políticas de IP referenciadas HTTP/JSON código
Core Rate Limit Consultar/validar quotas referenciadas HTTP/JSON código
Core JSON Handler Validar JSON Schema na configuração HTTP/JSON código
Template Service Core Criar instâncias/rotas/categorias; preparar/aplicar upgrade e wizard; remover instância em compensação HTTP/JSON código
Template Service Global Registry Publicar modelos, alterar visibilidade e consultar revisões publicadas HTTP/JSON código
Template Service Rate Limit Consultar e criar quotas de instâncias, com chave idempotente no upgrade HTTP/JSON código
Template Service Object Storage Vincular e publicar arquivo do modelo HTTP/JSON código
Template Service Scheduler Agendar exclusão da instância temporária de teste HTTP/JSON código · código
Importer Core Criar gateway/categorias/rotas, atualizar e marcar revisões publicáveis; excluir gateway na compensação HTTP/JSON código
Importer JSON Handler Transformar configuração iPaaS com schema para autoria HTTP/JSON código
Security Core Consultar uso de autorização antes de excluir HTTP/JSON código
IP Policy Core Contar vínculos de políticas nas rotas HTTP/JSON código
Rate Limit Core Contar vínculos de quotas nas rotas HTTP/JSON código
Rate Limit Scheduler Criar, alterar e excluir atividade de reposição de quota HTTP/JSON código

Execução e identidade

Origem Destino Finalidade Mecanismo Código
Security Checker Discovery Resolver rota, autenticação e políticas pelo tenant/método/path HTTP/JSON código
Security Checker Security Carregar autorização no tenant proprietário em miss de cache HTTP/JSON código
Security Checker IP Policy Carregar regras de IP no tenant proprietário em miss de cache HTTP/JSON código
Security Checker Auth Provider Validar token OAuth externo/provido HTTP/JSON código
Discovery Core Carregar configurações de rotas para resolução e cache HTTP/JSON código
Broker Builder Preparar request e, quando aplicável, transformar resposta HTTP/JSON código
Broker Router Executar requisição preparada e receber envelope da resposta HTTP/JSON código
Broker Web Pages Obter apresentação documental no caminho de documentação HTTP/HTML código
Builder Core Consultar revisão ativa da rota em miss de cache HTTP/JSON código
Builder Auth Provider Emitir token interno para chamada ERP HTTP/JSON código · código
Auth Provider Security Obter certificados do realm para JWKS HTTP/JSON código

Documentação, agendamento e recuperação

Origem Destino Finalidade Mecanismo Código
OpenAPI Doc Core Buscar modelo documental do gateway HTTP/JSON código
OpenAPI Doc Template Service Buscar modelo documental do template HTTP/JSON código
OpenAPI Doc Discovery Resolver gateway a partir do caminho de origem da documentação HTTP/JSON código
Web Pages OpenAPI Doc Obter JSON OpenAPI com x-origin-url HTTP/JSON código
Scheduler Core (callback configurado) Excluir gateway temporário em DELETE …/gateways/{id}/force; URL definida pelo Template Service HTTP agendado código · código
Cache Monitor (repo Invalidator) Discovery Limpar cache no procedimento de recuperação HTTP DELETE /cache código
Cache Monitor (repo Invalidator) Cache Invalidator Verificar saúde antes de decidir recuperação HTTP GET /cacheinvalidator/q/health código

O Scheduler executa a URL persistida na atividade. A relação com Core acima é comprovada pelo callback criado pelo Template Service. Cache Monitor é um script no repositório Cache Invalidator; suas chamadas são de recuperação operacional.

Invalidação delegada à biblioteca

Os serviços abaixo declaram hooks e a configuração do cliente de invalidação. O endpoint receptor implementa HTTP POST /cacheinvalidator/invalidate; o transporte/interceptor da biblioteca corporativa não tem fonte neste workspace. Essas relações permanecem identificadas como delegadas, sem atribuir à aplicação uma chamada HTTP própria inexistente.

Origem Destino Finalidade Mecanismo Código
Core Cache Invalidator Notificar mudança de gateway/rota Hook ObjectEventListener; cliente configurado pela biblioteca código · código · código
Security Cache Invalidator Notificar mudança/exclusão de autorização Hook ObjectEventListener; cliente configurado pela biblioteca código · código
IP Policy Cache Invalidator Notificar atualização de regra de IP Hook ObjectEventListener; cliente configurado pela biblioteca código · código

Serviços sem chamada HTTP direta a outro serviço Gateway

Global Registry, JSON Handler, Monitoring, Object Storage, Tunnel e Outbox Dispatcher não possuem cliente HTTP de outro microserviço Gateway no código analisado. Global Registry usa Mongo/Redis; JSON Handler processa os dados recebidos; Monitoring, Object Storage e Tunnel usam provedores externos; Dispatcher usa Mongo/RabbitMQ. Cache Invalidator usa Redis/RabbitMQ, e suas chamadas HTTP de recuperação pertencem ao script Cache Monitor listado acima.

Router executa a URL recebida em cada requisição, sem destino Gateway fixo; aparece na tabela de destinos dinâmicos.

Esse fechamento, junto às origens das tabelas, cobre os 23 serviços do inventário backend. Frameworks, health checks automáticos, exportação de telemetria e ferramentas de build não são tratados como integrações funcionais entre microserviços.

Integrações externas e destinos dinâmicos

Estas dependências são consumidas pelo backend, mas não são microserviços Gateway do workspace. HTTP indica o contrato; TLS e os endereços dependem da configuração. SDKs/bibliotecas são identificados quando encapsulam o transporte.

Origem Destino Finalidade Mecanismo Código
BFF iPaaS — Connector Service Core Consultar aplicações, recursos, ambientes, contas e diagramas HTTP/JSON código
BFF iPaaS — Connector Auth Resolver nome do tenant por código HTTP/JSON código
BFF Accounts Obter token técnico e chaves JWT HTTP via AccountsAdapter / JWKS código · código
BFF Authenticator Consultar permissões quando o mecanismo é acionado HTTP/JSON código
Core iPaaS Validar recursos de conta/ambiente e dependências de diagramas HTTP/JSON código
Core Accounts Obter token técnico para iPaaS AccountsAdapter / HTTP código
Builder iPaaS Resolver recurso, ambiente, conta e diagrama da execução HTTP/JSON código
Builder Accounts Obter token técnico para iPaaS AccountsAdapter / HTTP código
Importer iPaaS Ler recursos e configurações da importação HTTP/JSON código
Importer Accounts Obter token técnico para iPaaS AccountsAdapter / HTTP código
Security Keycloak Administrar clients/credenciais e obter certificados Admin SDK REST / HTTP código · código
Security Provedor OIDC Validar URL de discovery e metadados de autorização externa HTTP/JSON código
Auth Provider Keycloak Emitir tokens HTTP OAuth2 código
Auth Provider Provedor OIDC/JWKS Descobrir metadados e obter chaves de validação HTTP/JSON código
Security Checker Keycloak Obter token para autenticação interna HTTP OAuth2 código
Broker Keycloak Obter JWKS para validar identidade interna HTTP/JSON código
Router URL de destino preparada Executar método, headers e corpo recebidos do Broker HTTP(S) dinâmico código
Scheduler URL da atividade Executar chamadas agendadas; Core é um destino configurado, não fixo no executor HTTP(S) dinâmico código
Object Storage MinIO / GCS Gravar, ler e excluir blobs conforme provider SDK S3 / Google Cloud Storage código
Web Pages GCS Ler artefato HTML da documentação Google Cloud Storage SDK código
Monitoring Elasticsearch Consultar logs/métricas por tenant HTTP _search código
Tunnel Cloudflare Administrar túnel, DNS, configuração e token HTTP/JSON código
Cache Monitor (repo Invalidator) RabbitMQ Management Verificar estado dos shovels HTTP/JSON código
Cache Monitor (repo Invalidator) Google Chat Enviar notificações de recuperação HTTP webhook/JSON código
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.

Comunicação assíncrona e efeitos auxiliares

Publicação a partir de outbox

Como um evento persistido chega aos consumidores? O Dispatcher transporta os registros da outbox para RabbitMQ.

%%{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
    producers["Core / Template Service"]:::domain
    outbox[("MongoDB · outbox")]:::store
    dispatcher["Outbox Dispatcher"]:::async
    rabbit[["RabbitMQ<br/><small>gateway-events</small>"]]:::async
    docs["OpenAPI Doc"]:::domain
    templates["Template Service<br/><small>Setups</small>"]:::domain
    producers -->|Persiste evento| outbox
    outbox -->|Claim / lease| dispatcher
    dispatcher -->|AMQP| rabbit
    rabbit -->|Documentação| docs
    rabbit -->|Setup resolvido| templates
    classDef domain stroke-width:1.5px;
    classDef store stroke-width:1.5px;
    classDef async stroke-width:1.5px;

Invalidação de caches

Como uma alteração invalida Redis e o cache do Discovery? Este circuito usa eventos de invalidação, separados dos de publicação.

%%{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
    ipaas(["Eventos iPaaS"]):::external
    invalidator["Cache Invalidator"]:::async
    redis[("Redis / Valkey")]:::store
    rabbit[["RabbitMQ<br/><small>Invalidação por entidade</small>"]]:::async
    discovery["Discovery<br/><small>Cache em memória</small>"]:::domain
    ipaas -->|ipaas-events| invalidator
    invalidator -->|Exclui chaves| redis
    invalidator -->|AMQP| rabbit
    rabbit -->|Invalida| discovery
    classDef domain stroke-width:1.5px;
    classDef store stroke-width:1.5px;
    classDef async stroke-width:1.5px;
    classDef external stroke-width:1.5px;

Itens de importação

Como o Importer distribui o trabalho? Produtor e consumidor são papéis do mesmo serviço.

%%{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 LR
    producer["Importer<br/><small>Produtor</small>"]:::domain
    queue[["RabbitMQ<br/><small>Itens de importação</small>"]]:::async
    worker["Importer<br/><small>Consumidor</small>"]:::domain
    producer -->|Publica| queue
    queue -->|Entrega| worker
    classDef domain stroke-width:1.5px;
    classDef async stroke-width:1.5px;

Produtores, transporte e consumidores

As origens indicam quem produz o efeito; a coluna de mecanismo explicita o transporte indireto. Os diagramas acima são recortes por circuito; a tabela também inclui kicks do Dispatcher e eventos externos de invalidação.

Origem Destino Finalidade Mecanismo Código
Core Outbox Dispatcher Disponibilizar publicação/exclusão de gateway e resolução de setups MongoDB outbox_events, polling/claim código · código
Template Service Outbox Dispatcher Disponibilizar publicação/exclusão de template MongoDB outbox_events, polling/claim código · código
Outbox Dispatcher (eventos Core/Templates) OpenAPI Doc Gerar/remover documentação: gateway.published/deleted, template.published/deleted AMQP / RabbitMQ código · código
Outbox Dispatcher (evento Core) Template Service Retomar operação após gateway.setups_solved AMQP / RabbitMQ código · código
Cache Invalidator Discovery Invalidar cache: gateway, route, authorization, ip_policy AMQP / RabbitMQ código · código
Cache Invalidator Outbox Dispatcher Antecipar dreno por kick gateway/route AMQP / RabbitMQ código · código
Importer (produtor) Importer (worker) Distribuir application.import.item para application-import.worker.q AMQP / RabbitMQ código · código
iPaaS (externo) Cache Invalidator Receber alteração para invalidar dados iPaaS AMQP; exchange ipaas-events, routing key gateway-cache código · código

Eventos de invalidação (gateway, route, authorization, ip_policy) e eventos de publicação têm consumidores e finalidades distintos. O Dispatcher transporta a outbox; Importer publica seus itens diretamente. Outbox e Inbox detalha leases, retry e limites de entrega; Redis descreve invalidação e estado compartilhado.

Contratos transversais

Contrato Uso e limite
x-tenant-id Contexto interno em chamadas; não constitui sozinho autorização
X-Gateway-Discovery Contexto de rota entre entrada, Broker e Builder
X-Auth-Token Identidade interna transportada pelo Ingress ao Broker
x-origin-url Resolução documental em contratos específicos
x-tenant-template-owner-id / catalog-id Obtenção de template pelo BFF, derivados da resposta do Registry
Last-Event-ID Encaminhado pelo BFF no SSE; não prova replay garantido pelo produtor
traceparent / baggage Propagação OTel no cliente HTTP do BFF; instrumentação depende de configuração

Referências com targetTenantId em Authentication/IP Policy resolvem ownership de lookup; não demonstram autorização cross-tenant. Fonte: projeção Core, referências Checker, cliente BFF, catálogo BFF.

Fronteira de entrada e ambiente

O cliente administrativo externo consome o BFF. APIs publicadas entram pela fronteira própria de execução. No ambiente local NGINX, Ingress faz subrequest ao Security Checker e encaminha a requisição ao Broker. Essa configuração de borda é documentada como infraestrutura local; o inventário acima descreve contratos de aplicação. O deployment corporativo pertence à visão de ambientes corporativos.