fast_service_toolkit

package module
v1.0.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 10, 2026 License: MPL-2.0 Imports: 0 Imported by: 0

README

fast-service-toolkit

O fast-service-toolkit é uma engine em Go para construção de Nanoserviços REST e GraphQL Mesh de alta performance via configuração low-code (YAML).

O framework elimina a necessidade de escrever boilerplate para infraestrutura, concorrência e integrações, permitindo foco total na regra de negócio via expressões CEL (Common Expression Language).


Os dois pilares do toolkit

O toolkit opera em dois modos distintos, que podem coexistir no mesmo serviço:

1. Nanoserviços REST & API Gateway

Pipeline linear de processamento:

  1. Input: Recebe JSON.
  2. Enrichment: Busca dados em paralelo (Redis, Dynamo, HTTP, etc.).
  3. Processing: Aplica regras de negócio e transformações.
  4. Output: Retorna JSON formatado.
2. GraphQL mesh & federation

Motor de resolução de grafos:

  1. Schema Definition: Define Tipos e Campos no YAML.
  2. Resolvers Declarativos: Cada campo pode ter uma fonte de dados (source) diferente.
  3. Execution: O engine resolve os dados de forma assíncrona e hierárquica.

Guia de configuração universal (data sources)

O coração do toolkit é o pacote enrichment. As fontes de dados abaixo podem ser utilizadas tanto na seção middlewares (REST) quanto na propriedade source de um campo GraphQL.

1. AWS Systems Manager (parameter store)

Busca configurações ou segredos na AWS.

  • Uso: Configurações dinâmicas, feature flags, chaves de API.
type: "aws_parameter_store"
params:
  region: "us-east-1"
  path: "/prod/service/payment/gateway_key"
  with_decryption: true # Se for SecureString

2. AWS Secrets Manager

Recupera segredos encriptados. Se o segredo for um JSON, o toolkit faz o parse automático.

  • Uso: Credenciais de banco de dados, chaves privadas.
type: "aws_secrets_manager"
params:
  region: "us-east-1"
  secret_id: "prod/db/postgresql_creds"

3. AWS DynamoDB

Realiza um GetItem otimizado.

  • Uso: Busca de perfil de usuário, catálogo de produtos, sessão.
type: "aws_dynamodb"
params:
  region: "us-east-1"
  table: "UsersTable"
  # Mapeamento da Chave Primária (PK)
  key:
    # No GraphQL use 'args.id' ou 'source.id'
    # No REST use 'input.user_id'
    UserId: "args.id" 

4. AWS S3 (arquivos)

Baixa e faz parse de arquivos. Suporta cache em memória (dependendo da implementação do loader).

  • Formatos: json, yaml, csv, text.
type: "aws_s3"
params:
  region: "us-east-1"
  bucket: "my-config-bucket"
  key: "business_rules/pricing_table.json"
  format: "json" # Realiza o Unmarshal automático para objeto

5. Redis (elasticache)

Busca dados em cache de baixa latência.

  • Uso: Rate limiting, sessão, cache de API.
type: "aws_redis"
params:
  host: "my-redis.cluster.us-east-1.rds.amazonaws.com:6379"
  command: "GET" # ou HGETALL
  key: "'session:' + string(input.session_id)"

6. REST (HTTP Client)

Realiza chamadas HTTP para outros serviços. Suporta injeção de Headers e Body.

type: "rest"
params:
  method: "POST"
  url: "[https://api.parceiro.com/v1/analise](https://api.parceiro.com/v1/analise)"
  timeout: "2s" # Opcional
  body:
    documento: "input.cpf"
    valor: "input.amount"
headers:
  Content-Type: "application/json"
  Authorization: "'Bearer ' + env.API_TOKEN"

7. GraphQL client

Atua como um client consumindo outra API GraphQL externa.

  • Uso: Federation, agregar dados de outros subgrafos.
type: "graphql"
params:
  endpoint: "[https://api.github.com/graphql](https://api.github.com/graphql)"
  # A Query pode ser parametrizada
  query: |
    query($login: String!) {
      user(login: $login) {
        name
        repositories { totalCount }
      }
    }
  variables:
    login: "input.username"
headers:
  Authorization: "'Bearer ' + env.GITHUB_TOKEN"

8. Fixed (estático)

Retorna dados fixos definidos no próprio YAML.

  • Uso: Mocks, tabelas de-para simples, valores padrão.
type: "fixed"
params:
  tax_rate: 0.15
  category: "standard"
  features: ["read", "write"]


Configuração do serviço (service API)

Esta seção define como expor endpoints REST e processar regras.

Estrutura do YAML (service)
service:
  name: "credit-service"
  runtime: "local" # ou lambda, ecs
  port: 8080
  route: "/analyze"
  timeout: "500ms"
  on_timeout: { code: 504, msg: "Timeout processing credit" }
  logging: { enabled: true, level: "debug" }

Pipeline de execução
  1. Middlewares (Enrichment): Executa fontes de dados em paralelo.
  2. Input (Validation): Valida o payload de entrada.
  3. Processing (Transformation): Executa lógica condicional.
  4. Output: Monta a resposta.
Exemplo de pipeline completo
middlewares:
  - id: "fetch_data"
    type: "enrichment"
    config:
      strategy: "parallel"
      sources:
        - name: "serasa"
          type: "rest"
          params: { method: "GET", url: "..." }
        - name: "db_interno"
          type: "aws_dynamodb"
          params: { table: "CreditHistory", ... }

steps:
  input:
    validations:
      - id: "check_amount"
        expr: "input.amount > 0"
        on_fail: { code: 400, msg: "Valor inválido" }

  processing:
    transformations:
      - name: "calc_score"
        condition: "detection.serasa.score > 700"
        value: "0.05" # Taxa de Juros Baixa
        else_value: "0.15" # Taxa de Juros Alta
        target: "vars.interest_rate"

  output:
    status_code: 200
    body:
      approved: "true"
      rate: "vars.interest_rate"


Configuração GraphQL mesh

Esta seção define como criar um servidor GraphQL que agrega as fontes de dados acima.

Definição de tipos e resolvers

O conceito chave é: **Cada campo tem um source**. Se o source não for definido, o engine assume que o campo já existe no objeto pai.

Exemplo: Tipo complexo com múltiplas fontes
graphql:
  enabled: true
  route: "/graphql"

  types:
    UserProfile:
      fields:
        # Campo vindo do DynamoDB (Principal)
        id: { type: "ID" }
        name: { type: "String" }
        
        # Campo calculado (Fixed)
        account_type:
          type: "String"
          source:
            type: "fixed"
            params: { value: "premium" }

        # Campo aninhado vindo de API REST (Child Resolver)
        # Usa 'source.id' (ID do UserProfile carregado acima) para buscar pedidos
        recent_orders:
          type: "[Order]"
          source:
            type: "rest"
            params:
              method: "GET"
              url: "'[https://api.store.com/orders?userId=](https://api.store.com/orders?userId=)' + string(source.id)"

    Order:
      fields:
        order_id: { type: "ID" }
        total: { type: "Float" }

  query:
    getUser:
      type: "UserProfile"
      args:
        id: "ID"
      source:
        type: "aws_dynamodb"
        params:
          table: "Users"
          key: { pk: "args.id" }


Contexto CEL (variáveis)

Onde você pode usar as variáveis nas expressões CEL (expr, url, condition):

Contexto REST (Service) GraphQL (Mesh) Descrição
input JSON Body da requisição HTTP.
args Argumentos da Query GraphQL (ex: id).
source Objeto pai (usado em field resolvers aninhados).
detection Dados carregados pelos middlewares.
vars Variáveis calculadas no step processing.
env Variáveis de ambiente.
auth Tokens do Auth Provider.

Autenticação (auth provider)

Para serviços que precisam consumir APIs seguras (OAuth2), o toolkit gerencia o ciclo de vida do token.

middlewares:
  - id: "auth_service_x"
    type: "auth_provider"
    config:
      provider: "oauth2"
      token_url: "[https://auth.provider.com/token](https://auth.provider.com/token)"
      client_id: "..."
      client_secret: "..."
      output_var: "token_x" # Disponível como 'auth.token_x'


Estrutura do projeto

[github.com/raywall/fast-service-toolkit](https://github.com/raywall/fast-service-toolkit)
├── cmd/server          # Entrypoint da aplicação
├── examples/           # Exemplos completos (01 a 06)
├── pkg/
│   ├── config          # Contrato das Structs YAML
│   ├── engine          # Service Engine & GraphQL Engine
│   ├── enrichment      # Implementação dos Data Sources (S3, Dynamo, REST...)
│   ├── rules           # Motor CEL (Lógica)
│   └── transport       # Servidor HTTP
└── README.md
remover
middlewares:
  - id: "auth_servico_interno"
    type: "auth_provider"
    config:
      provider: "oauth2"
      token_url: "https://seu-sts.com/oauth/token" # Endpoint que aceita o POST
      client_id: "meu-app-id"
      client_secret: "meu-segredo-super-secreto"  # Pode usar injeção aqui via envloader!
      scope: "read write"
      output_var: "token_sts" # Ficará disponível como auth.token_sts

Documentation

Overview

Copyright 2025 Raywall Malheiros de Souza Licensed under the Mozilla Public License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

https://www.mozilla.org/en-US/MPL/2.0/

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Package fast_service_lab (Fast Service Toolkit) é um framework High-Code/Low-Code declarativo para construção rápida, segura e padronizada de serviços Backend (REST e GraphQL) e BFFs (Backends for Frontends).

Visão Geral: O Toolkit inverte o paradigma tradicional de desenvolvimento: em vez de escrever código imperativo (handlers, services, repositories) para cada endpoint, o desenvolvedor define o *comportamento* do serviço via configuração (YAML/JSON). O framework se encarrega da orquestração, validação, conectividade e observabilidade.

O núcleo do framework baseia-se em uma arquitetura de Pipeline de Execução alimentada por um motor de regras CEL (Common Expression Language), permitindo lógica de negócio complexa, transformações de dados e validações sem recompilação.

Modos de Operação:

  1. REST Service Mode: Focado em endpoints HTTP tradicionais. Define um pipeline linear de execução: Input -> Validation -> Enrichment (Data Fetching) -> Processing (Business Logic) -> Output. Ideal para APIs de agregação, transformadores de dados e proxies inteligentes.

  2. GraphQL Mesh Mode: Atua como um Gateway de federação ou orquestração. Permite definir schemas GraphQL onde os resolvers de cada campo são mapeados declarativamente para fontes de dados externas (REST, DynamoDB, Fixed), resolvendo automaticamente o grafo de dependências e concorrência.

  3. Interceptor Mode (Smart Proxy): Atua como um Middleware Arquitetural (Ambassador Pattern) em frente a outros microsserviços. Ele recebe a requisição, enriquece o payload com dados de múltiplas fontes, aplica validações de negócio e encaminha a requisição "turbinada" para o serviço de destino, desacoplando a lógica de carga de dados.

Componentes Principais (pkg):

  • pkg/engine: O cérebro do framework. Gerencia o ciclo de vida da requisição, carrega configurações e coordena os middlewares e steps.

  • pkg/rules: Wrapper sobre o Google CEL. Oferece um ambiente seguro para execução de expressões lógicas (`input.age > 18`) e transformações (`vars.total * 0.1`) dentro da configuração YAML.

  • pkg/enrichment: Camada de acesso a dados (Data Sources). Fornece conectores otimizados e instrumentados para REST, GraphQL, AWS DynamoDB, S3, Secrets Manager e Parameter Store.

  • pkg/auth: Gerenciamento de autenticação OAuth2 (Client Credentials) transparente. Gerencia automaticamente a obtenção, cache e renovação de tokens para chamadas externas.

  • pkg/transport: Abstração de entrada (Entrypoints). Permite que o mesmo "Engine" rode transparentemente em servidores HTTP locais (Gin/NetHttp), AWS Lambda (API Gateway/SQS) ou Containers ECS/EKS.

Exemplo de Definição Declarativa (Interceptor):

service:
  name: "loan-enricher"
  runtime: "lambda"

middlewares:
  - type: "enrichment"
    config:
      sources:
        - name: "redis_data"
          type: "aws_redis"
          params: { key: "'USER:' + input.cpf" }

steps:
  output:
    body:
      original_req: "input"
      enrichment: "detection.redis_data"
    target:
      url: "'http://pricing-service.internal/calc'"
      method: "POST"

Filosofia: "Configuration as Code, Logic as Expression". O Toolkit visa eliminar o código repetitivo de infraestrutura, permitindo que times foquem puramente na regra de negócio e na integração de sistemas.

Directories

Path Synopsis
cmd
emulator command
server command
toolkit command
pkg
tools
api
easyrepo
Package easyrepo fornece uma abstração genérica para o padrão Service-Repository utilizando Amazon DynamoDB.
Package easyrepo fornece uma abstração genérica para o padrão Service-Repository utilizando Amazon DynamoDB.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL