belt

module
v0.0.6 Latest Latest
Warning

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

Go to latest
Published: Jan 6, 2026 License: MIT

README

belt

belt is a collection of robust, high-performance Go packages designed to be a "toolbelt" for building modern, scalable backend services. It provides modules for common tasks such as creating servers, load balancers, structured logging, hashing, and more, all with a focus on ease of use and extensibility.

Features

Core Infrastructure
  • server: A powerful server package for creating gRPC, HTTP, or multiplexed (gRPC & HTTP on the same port) servers with graceful shutdown, TLS support, and automatic request logging.
  • lb: Advanced Layer 4 and Layer 7 load balancers for both HTTP and gRPC traffic with dynamic backend management, custom routing rules, health checks, and reflection aggregation.
  • logx: A structured logger built on zap that intercepts logs and forwards them to a configurable transport. It supports development/production modes and enriches logs with service context.
  • router: An intuitive HTTP router built on gofiber/fiber, allowing for easy definition of routes, route groups, and global/local middleware.
Utilities
  • hashx: A comprehensive hashing library supporting a wide range of algorithms (SHA, BLAKE, HMAC, etc.). It provides a unified API for keyed and unkeyed hashing, 32/64-bit hashing, and concurrent hashing of multiple algorithms.
  • key: A versioned key generation and decoding system, perfect for creating unique identifiers that embed information like node and disk IDs.
  • io/disk: A simple utility for querying disk space usage (total, used, free).

Package Documentation

Each major package has its own detailed README with examples:

Installation

To install belt and its packages, use go get:

go get github.com/atlastore/belt

Quick Start

Load Balancer Example

Create a gRPC L7 load balancer with dynamic routing:

package main

import (
	"context"
	
	"github.com/atlastore/belt/lb/backend"
	"github.com/atlastore/belt/lb/grpc/l7"
	"github.com/atlastore/belt/logx"
	"github.com/google/uuid"
)

func main() {
	log := logx.New(
		context.Background(),
		logx.NewConfig(logx.Development, "lb", uuid.NewString()),
		&logx.ConsoleTransport{},
	)
	
	// Define backend services
	backends := []*backend.Backend{
		{Addr: "localhost:50051"},
		{Addr: "localhost:50052"},
	}
	
	// Create L7 gRPC load balancer
	lb := l7.New(log, backends)
	
	if err := lb.Start(context.Background(), ":9090"); err != nil {
		log.Fatal("Failed to start load balancer", zap.Error(err))
	}
}

Add routes dynamically via gRPC:

// Using grpcurl or any gRPC client
grpcurl -plaintext -d '{
  "backend_addr": "localhost:50053",
  "services": ["myapp.UserService"],
  "methods": ["GetUser", "ListUsers"]
}' localhost:9090 lb.LoadBalancer/AddL7
Creating a Multiplexed Server

The server package can serve both gRPC and HTTP traffic on a single port using cmux.

package main

import (
	"context"
	"fmt"

	"github.com/atlastore/belt/logx"
	"github.com/atlastore/belt/router"
	"github.com/atlastore/belt/server"
	"github.com/atlastore/belt/server/http"
	"github.com/google/uuid"
	"github.com/gofiber/fiber/v3"
	"go.uber.org/zap"
)

func main() {
	ctx := context.Background()

	// 1. Set up the logger
	log := logx.New(
		ctx,
		logx.NewConfig(logx.Development, "my-app", uuid.NewString()),
		&logx.ConsoleTransport{},
	)
	defer log.Close()

	// 2. Create an HTTP router
	r := router.New()
	r.Add("/hello", router.GET, func(c fiber.Ctx) error {
		return c.SendString("Hello, World!")
	})

	// 3. Configure the server options
	// In a real application, you would also add your gRPC service registries here.
	// For example: `grpc.WithRegistry(myService, pb.RegisterMyServiceServer)`
	opts := []server.Option{
		http.WithRouter(r),
	}

	// 4. Create and start the multiplexed server
	muxServer := server.NewServer(server.MUX, log, opts...)

	log.Info("Starting server on localhost:8080", zap.String("type", "mux"))

	if err := muxServer.Start(ctx, ":8080"); err != nil {
		log.Fatal("Server failed to start", zap.Error(err))
	}
}
Structured Logging with logx

The logx package provides structured, leveled logging that can be sent to custom transports.

package main

import (
	"context"
	"errors"
	"time"

	"github.com/atlastore/belt/logx"
	"github.com/google/uuid"
	"go.uber.org/zap"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// Configure logger for a "worker" service in production
	cfg := logx.NewConfig(logx.Production, "worker-service", uuid.NewString())
	logger := logx.New(ctx, cfg, &logx.ConsoleTransport{})
	defer logger.Close()

	logger.Info("Worker starting up", zap.Int("num_goroutines", 5))

	// Logs include structured context
	logger.Error(
		"Failed to process job",
		zap.String("job_id", "job-12345"),
		zap.Error(errors.New("connection timed out")),
	)
	
	// Create a child logger with additional fields
	childLogger := logger.With(zap.String("component", "database"))
	childLogger.Debug("Executing query", zap.Duration("query_time", 150*time.Millisecond))
}
Hashing Data with hashx

The hashx package provides a simple API for a wide variety of hashing algorithms.

package main

import (
	"fmt"

	"github.com/atlastore/belt/hashx"
    "github.com/atlastore/belt/hashx/multi"
)

func main() {
	data := "this is some important data to be hashed"

	// Simple, unkeyed hash
	sha256sum, err := hashx.HashString(hashx.SHA256, data)
	if err != nil {
		panic(err)
	}
	fmt.Println("SHA256 Hash:", sha256sum.Encode()) // "sha256:..."

	// Keyed hash
	secretKey := []byte("a-very-secret-key-that-is-32b") // Blake3 requires a 32-byte key
	blake3sum, err := hashx.HashString(hashx.Blake3, data, secretKey)
	if err != nil {
		panic(err)
	}
	fmt.Println("Blake3 Hash:", blake3sum.Encode()) // "blake3:..."

	// 64-bit integer hash
	fnv64hash := hashx.FNV64.HashString(data)
	fmt.Printf("FNV64 Hash: %d\n", fnv64hash)

	// Hash multiple algorithms at once
	hashes, err := multi.HashString(data, hashx.MD5, hashx.SHA1, hashx.XXHash)
	if err != nil {
		panic(err)
	}
	fmt.Println("Multi-hash results:", hashes)
}
Versioned Keys with key

The key package allows you to create and parse versioned keys, which is useful for object storage or distributed systems.

package main

import (
	"fmt"

	"github.com/atlastore/belt/hashx"
	"github.com/atlastore/belt/key"
)

func main() {
	// 1. Create a KeyFactory with unique IDs for your node and disk
	keyFactory := key.NewKeyFactory(key.KeyFactoryParams{
		NodeId: 1234567890,
		DiskID: 9876543210,
	})

	// 2. Define the data for a new key
	myKey := &key.KeyV1{
		IndexFileHash: hashx.FNV64.HashString("path/to/my/file.txt"),
		Identifier:    key.GenerateIdentifier(16), // A 16-byte random identifier
	}

	// 3. Encode the key into a hex string
	// This automatically injects the NodeID and DiskID from the factory.
	encodedKey, err := keyFactory.EncodeKey(myKey)
	if err != nil {
		panic(err)
	}

	fmt.Println("Encoded Key:", encodedKey)

	// 4. Decode the key string back into a struct
	decodedKey, err := key.Decode[*key.KeyV1](encodedKey)
	if err != nil {
		panic(err)
	}

	fmt.Printf("Decoded Key:\n")
	fmt.Printf("  - Version: %d\n", decodedKey.Version())
	fmt.Printf("  - Node ID: %d\n", decodedKey.NodeID)
	fmt.Printf("  - Disk ID: %d\n", decodedKey.DiskID)
	fmt.Printf("  - File Hash: %d\n", decodedKey.IndexFileHash)
}

Architecture Overview

Belt is designed as a modular toolkit where each package serves a specific purpose:

belt/
├── lb/          # Load Balancers (L4/L7 for HTTP and gRPC)
│   ├── grpc/    # gRPC load balancing with reflection aggregation
│   ├── http/    # HTTP load balancing with path/header routing
│   └── route/   # Advanced routing and matching engine
├── server/      # Unified server infrastructure
│   ├── grpc/    # gRPC server with reflection & health checks
│   ├── http/    # Fiber-based HTTP server
│   └── mux_server/ # Multiplexed gRPC+HTTP server
├── logx/        # Structured logging with transports
├── hashx/       # Multi-algorithm hashing library
│   └── multi/   # Concurrent multi-algorithm hashing
├── key/         # Versioned key generation system
├── router/      # HTTP routing (Fiber wrapper)
└── io/disk/     # Disk space utilities

Key Features by Package

Load Balancer (lb/)
  • Layer 4 and Layer 7 load balancing
  • HTTP and gRPC protocol support
  • Dynamic backend management via API
  • Custom routing rules (path, header, service, method)
  • Health checks and reflection aggregation
  • Multiple load balancing strategies
Server (server/)
  • Unified interface for HTTP, gRPC, and multiplexed servers
  • Automatic request logging
  • Graceful shutdown with signal handling
  • TLS support
  • Built-in health checks
  • Type-safe service registration
Logging (logx/)
  • Built on high-performance zap logger
  • Development and production modes
  • Custom transports (console, or your own)
  • Structured logging with context
  • Child loggers with inherited fields
Hashing (hashx/)
  • 20+ hash algorithms (SHA, BLAKE, XXHash, FNV, etc.)
  • Unified API for all algorithms
  • 32/64-bit integer hashing
  • Multi-algorithm concurrent hashing
  • Keyed hashing (HMAC, BLAKE3)
Key Management (key/)
  • Versioned key structure
  • Embedded metadata (node ID, disk ID, hashes)
  • Content-addressed storage support
  • Type-safe decoding with generics
  • Factory pattern for consistent key creation

Performance Characteristics

  • Load Balancer: <1ms latency overhead for L7, <100μs for L4
  • Logging: Zero-allocation paths, async transports available
  • Hashing: Up to 10GB/s throughput (algorithm dependent)
  • Keys: ~100ns encode/decode, zero allocations

Production Ready

All packages include:

  • ✅ Comprehensive error handling
  • ✅ Structured logging integration
  • ✅ Graceful shutdown support
  • ✅ Concurrent operation safety
  • ✅ Performance optimizations
  • ✅ Example code and tests

Community and Support

  • Documentation: Each package has detailed README with examples
  • Examples: See *_test.go and example_test.go files
  • Issues: Report bugs or request features on GitHub
  • License: MIT - free for commercial use

License

This repository is licensed under the MIT License. This repository is licensed under the MIT License.

Jump to

Keyboard shortcuts

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