Visão geral
Ecossistema B2B dividido em dois serviços que falam linguagens diferentes de propósito: um gateway em C# / .NET 8 cuidando de entrada, segurança e orquestração, e um motor de cálculo em Java 17 cuidando de matemática financeira.
A divisão não é enfeite de arquitetura. Cada lado faz o que faz melhor, e a comunicação por HTTP/JSON entre eles significa que trocar um dos dois não obriga a reescrever o outro.
Os dois núcleos
Core-Gateway-CS (C# / .NET 8) — porta de entrada. Autenticação JWT com permissão por plano, health checks e orquestração das chamadas.
Financial-Engine-JV (Java 17) — o cálculo. Precisão com BigDecimal do início ao fim, porque
double em dinheiro acumula erro de arredondamento que aparece no extrato do cliente.
Strategy Pattern para as regras de plano
A regra de taxa de cada plano é uma função guardada num mapa, não um if/else encadeado:
private static final Map<String, Function<BigDecimal, BigDecimal>> REGRAS = Map.of(
"VIP", valor -> valor.multiply(new BigDecimal("0.98")),
"STARTER", valor -> valor.multiply(new BigDecimal("0.90")),
"PRO", valor -> valor.multiply(new BigDecimal("0.95"))
);
Plano novo é uma linha nova. E getOrDefault com Function.identity() garante que um plano
desconhecido devolva o valor intacto em vez de estourar exceção no meio de um orçamento.
O resto da arquitetura
- Processamento em lote com Streams API no Java e LINQ no C#, para massas de dados.
- Assincronismo com
async/awaiteCompletableFuture, evitando gargalo de I/O. - Repository Pattern isolando o banco da regra de negócio, o que permite migrar entre PostgreSQL, SQL Server e NoSQL sem tocar no núcleo.
- Baixo acoplamento de verdade: se o motor Java cair, o gateway C# detecta pelo health check e entra em contingência em vez de derrubar a requisição inteira.
- Logs estruturados e health checks para observabilidade.