Published: 2026-06-01 • Updated: 2026-06-20

Understanding Vector Databases and Embeddings in Java

A Deep-Dive Architectural Guide into High-Dimensional Mathematics, Tokenization Pipelines, and Production Vector Stores using Spring AI, LangChain4j, and pgvector.


1. The Semantic Shift: From Keyword Matching to High-Dimensional Vector Spaces

In traditional enterprise Java applications, finding information relies heavily on structured matching rules. Relational queries utilize exact string values, wildcard operations via SQL clauses like LIKE '%automobile%', or inverted indexes provided by tools such as Elasticsearch. While these patterns are effective for structured lookups, they fail to capture conceptual nuance. For instance, a search string matching "automobile" will completely miss database rows containing "car", "truck", or "electric vehicle" unless engineers maintain and update complex synonym dictionaries or custom mapping tables manually.

Artificial Intelligence bridges this structural gap using semantic search, an architecture powered entirely by mathematical embeddings and vector databases. Instead of evaluating strings character-by-character, semantic engines convert human language into distinct coordinates within a high-dimensional space. This mathematical transformation allows developers to determine how close two terms or documents are conceptually by calculating the geometric distance between their corresponding coordinates.

For engineering teams designing high-scale AI systems, understanding how to construct, manipulate, index, and query these mathematical coordinates within the Java Virtual Machine (JVM) is critically important. To understand how this fits into your development environment, see our setup guide: Setting Up Your Java Development Environment for AI. For a broader exploration of these concepts across the enterprise, refer to our foundational module: Introduction to AI Engineering for Java Developers.


2. Mathematical Foundations of Embeddings

An embedding is a dense, numerical vector representation of unstructured data—such as text blocks, image pixels, or audio frequencies—mapped into a high-dimensional continuous vector space. Instead of representing a word as a static token or an isolated entry in a sparse matrix, an embedding model passes raw data through an optimized deep neural network to yield a fixed-length array of floating-point numbers (typically standard 32-bit floating-point primitives in Java).

The length of this array represents the dimensionality of the vector space. Commercial models like OpenAI's text-embedding-3-small or open-source models like all-MiniLM-L6-v2 generate vectors spanning anywhere from 384 to over 3072 distinct dimensions. Each individual dimension represents an abstract semantic characteristic or latent feature extracted by the underlying neural network during training.

To visualize how these multi-dimensional spaces align real-world relationships, imagine we project thousands of concepts down into a simplified, human-readable three-dimensional coordinate system ($X, Y, Z$):

  • The vector representing "Java" and the vector representing "Kotlin" will point in highly similar directions, because both share strong semantic ties to concepts like "JVM", "programming language", and "object-oriented compilation".
  • Conversely, the vector for "Java" and the vector for "Banana" will point in vastly different directions, because their underlying features match completely unrelated domains (software engineering versus tropical agriculture).

By treating language as geometric coordinates, systems can use vector math to calculate semantic similarity directly, bypassing the need for exact keyword matches. This structural shift forms the base of modern enterprise search engines, automated categorization pipelines, and content filtering tools.

The Deep Data Pipeline From Raw Strings to Vector Storage

Converting raw, unformatted text into a clean vector index requires a series of distinct data processing steps. The lifecycle diagram below traces how a text snippet travels through extraction, tokenization, model execution, and finally into a production vector store:

+-----------------------------------------------------------------------------------------------------------------------+
|                                              INGESTION & DATA SPLITTING STAGE                                         |
|                                                                                                                       |
|   +--------------------------+               Regex/Markdown Boundaries               +----------------------------+   |
|   |    Raw Corporate Document | --------------------------------------------------->  |  Granular Document Chunks  |   |
|   |   (PDFs, Markdown, Wikis) |                                                       | (Normalized Sub-sections)  |   |
|   +--------------------------+                                                       +----------------------------+   |
+-----------------------------------------------------------------------------------------------------------------------+
                                                                                                      |
                                                                                                      v
+-----------------------------------------------------------------------------------------------------------------------+
|                                           MODEL CONVERSATION & ENCODING STAGE                                         |
|                                                                                                                       |
|   +---------------------------------------------------------------------------------------------------------------+   |
|   |                                         Upstream Embedding Model Client                                       |   |
|   |   - Receives raw string blocks securely via Java service layers                                               |   |
|   |   - Applies Tokenizer formatting maps (e.g., Tiktoken/Byte-Pair Encoding rules)                               |   |
|   +---------------------------------------------------------------------------------------------------------------+   |
|                                                          |                                                            |
|                                                          v                                                            |
|   +---------------------------------------------------------------------------------------------------------------+   |
|   |                                          Neural Network Inference Engine                                      |   |
|   |   - Computes weighted activations across deep transformer matrix layers                                       |   |
|   |   - Outputs a standard fixed-length array of floating-point numbers                                           |   |
|   +---------------------------------------------------------------------------------------------------------------+   |
+-----------------------------------------------------------------------------------------------------------------------+
                                                                                                      |
                                                                                                      v
+-----------------------------------------------------------------------------------------------------------------------+
|                                               STORAGE & RESOLUTION ENGINE                                             |
|                                                                                                                       |
|   +---------------------------------------------------------------------------------------------------------------+   |
|   |                                           Enterprise Vector Database                                          |   |
|   |   - Stores the generated float array alongside original source text and structured metadata maps              |   |
|   |   - Updates index tracking graphs (e.g., HNSW or IVF) to maintain fast sub-millisecond retrieval speeds      |   |
|   +---------------------------------------------------------------------------------------------------------------+   |
+-----------------------------------------------------------------------------------------------------------------------+

In this workflow, the document is first split into smaller, contextual chunks using specialized splitting strategies. These text fragments are passed to an embedding engine client, which converts the strings into tokens using precise encoding rules. The tokens are then processed by a neural network to generate a dense floating-point array, which is saved alongside your original source metadata inside a high-performance vector store.


3. Inside the Vector Database: Mechanics and Coordinate Search

Traditional relational database engines like PostgreSQL or MySQL are optimized for indexing highly structured data using standard, tree-based indexing models (like B-Trees). B-Trees work by splitting fields into ordered, linear pathways, which makes them highly efficient for exact matches, clear value ranges, and standard joins. However, they are fundamentally unsuited for multi-dimensional vector operations. Calculating the relative proximity between millions of multi-dimensional float arrays requires an entirely different approach to database indexing and query execution.

A true **Vector Database** is an engine built from the ground up to store, index, and query high-dimensional vector embeddings efficiently. Instead of relying on exact values, vector databases use specialized mathematical algorithms to perform **Nearest Neighbor Searches**, identifying vectors whose spatial paths align closest with a given query vector.

Core Geometric Distance Metrics Explained

Vector databases rely on specific geometric distance metrics to measure proximity in multi-dimensional space. The three primary calculation models include:

Metric Model Mathematical Definition Formula Primary Use Cases and Behavioral Nuances
Cosine Similarity $$\text{Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}$$ Measures the cosine of the angle between two vectors, completely ignoring their raw lengths. This makes it ideal for text search and natural language processing, as it focuses on conceptual alignment regardless of document word count.
Euclidean Distance (L2) $$\text{Distance} = \sqrt{\sum_{i=1}^{n} (A_i - B_i)^2}$$ Calculates the straight-line distance between two coordinates in space. This metric is highly effective for image processing or physical sensor data streams where changes in absolute value magnitude are critical to tracking accuracy.
Dot Product $$\text{Product} = \mathbf{A} \cdot \mathbf{B} = \sum_{i=1}^{n} A_i B_i$$ Calculates the sum of the products of corresponding vector components. This provides a very fast similarity metric for high-scale enterprise systems, provided all vectors are unit-normalized beforehand.

Choosing the correct distance metric is vital. Your vector database index must be configured to use the same metric your embedding model was trained on, otherwise similarity searches will return random and inaccurate results.


4. Generating Embeddings in Java Using Spring AI

Spring AI provides a clean, unified abstraction layer for managing text embeddings through its core EmbeddingModel interface. This standardizes how applications connect to different AI infrastructure backends, hiding the complexities of manual HTTP client creation, API authorization headers, and JSON serialization behind a clean, type-safe Java API.

To see how this abstraction layer maps to broader application frameworks, review our architectural guide: Introduction to the Spring AI Framework. If your team uses alternative integration frameworks, you can also explore our parallel guide: Getting Started with LangChain4j in Java.

Adding Maven Dependencies

To use Spring AI along with the OpenAI embedding starter module, add the following dependency configuration to your project's active pom.xml file:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

Implementation: Embedding Generation and Cosine Similarity

The service implementation below demonstrates how to inject the standard EmbeddingModel interface, convert raw text snippets into floating-point vectors, and calculate similarity metrics programmatically on the JVM without external dependencies.

Save this file inside your local codebase directory path at src/main/java/com/dhanishempower/ai/vector/service/EmbeddingGeneratorService.java:

package com.dhanishempower.ai.vector.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.openai.OpenAiEmbeddingOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * Service orchestrating raw text string translation into multi-dimensional vectors using Spring AI abstractions.
 */
@Service
public class EmbeddingGeneratorService {

    private static final Logger log = LoggerFactory.getLogger(EmbeddingGeneratorService.class);
    private final EmbeddingModel embeddingModel;

    /**
     * Dependency injection constructor maps the active auto-configured framework client.
     */
    @Autowired
    public EmbeddingGeneratorService(final EmbeddingModel embeddingModel) {
        this.embeddingModel = Objects.requireNonNull(embeddingModel, "The auto-configured EmbeddingModel instance cannot be null.");
    }

    /**
     * Converts raw text strings into high-dimensional vector representations.
     *
     * @param plainText Raw string content to convert.
     * @return List of primitive Double objects representing coordinates in high-dimensional space.
     */
    public List<Double> generateVectorSpaceCoordinates(final String plainText) {
        if (plainText == null || plainText.strip().isEmpty()) {
            throw new IllegalArgumentException("The target text payload must not be blank or null.");
        }

        log.debug("Dispatching embedding tokenization request for raw text content length: {} chars", plainText.length());
        
        try {
            List<Double> singleVectorResult = this.embeddingModel.embed(plainText);
            log.info("Successfully received generated vector space coordinates. Total dimensions: {}", singleVectorResult.size());
            return singleVectorResult;
        } catch (Exception apiException) {
            log.error("Failed to generate vector coordinates due to an upstream model error: ", apiException);
            throw new RuntimeException("Embedding execution failure: " + apiException.getMessage(), apiException);
        }
    }

    /**
     * Calculates the geometric cosine similarity between two high-dimensional vectors on the JVM.
     *
     * @param coordinateSetA First high-dimensional float array coordinates.
     * @param coordinateSetB Second high-dimensional float array coordinates.
     * @return Scalar double precision value spanning from -1.0 to 1.0 tracking relative spatial alignment.
     */
    public double calculateCosineSimilarity(final List<Double> coordinateSetA, final List<Double> coordinateSetB) {
        Objects.requireNonNull(coordinateSetA, "Vector coordinate set A must not be null.");
        Objects.requireNonNull(coordinateSetB, "Vector coordinate set B must not be null.");

        if (coordinateSetA.size() != coordinateSetB.size()) {
            throw new IllegalArgumentException(String.format(
                    "Dimension mismatch fault. Vector A specifies length %d while Vector B specifies length %d.",
                    coordinateSetA.size(), coordinateSetB.size()));
        }

        double dotProductAccumulator = 0.0;
        double magnitudeSquaredA = 0.0;
        double magnitudeSquaredB = 0.0;

        // Perform standard dot product and norm derivations over matching array bounds
        for (int index = 0; index < coordinateSetA.size(); index++) {
            double valueA = coordinateSetA.get(index);
            double valueB = coordinateSetB.get(index);

            dotProductAccumulator += valueA * valueB;
            magnitudeSquaredA += Math.pow(valueA, 2);
            magnitudeSquaredB += Math.pow(valueB, 2);
        }

        if (magnitudeSquaredA == 0.0 || magnitudeSquaredB == 0.0) {
            log.warn("One or both evaluated coordinate tracks evaluated to an absolute zero vector position.");
            return 0.0;
        }

        return dotProductAccumulator / (Math.sqrt(magnitudeSquaredA) * Math.sqrt(magnitudeSquaredB));
    }
}

5. Storing and Querying Vectors in Enterprise Databases

Generating embeddings is only the first step; large-scale systems need an efficient way to save and query these vectors alongside existing relational business records. Spring AI provides a unified VectorStore interface that supports popular production-grade storage backends like pgvector (PostgreSQL), Milvus, Pinecone, Redis, and Qdrant.

Using pgvector with Spring AI

For relational ecosystems, the pgvector extension allows PostgreSQL to manage vector similarity operations natively within your existing database schemas. To add the pgvector store integration to your build file, insert this block into your dependencies array:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
</dependency>

Next, configure your database connection parameters inside your central properties repository at src/main/resources/application.yml:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/ai_enterprise_db
    username: enterprise_operator
    password: vault_secured_password
    driver-class-name: org.postgresql.Driver
  ai:
    vectorstore:
      pgvector:
        dimension: 1536 # Must match the exact dimensions generated by your embedding model
        distance-type: cosine # Select cosine similarity, euclidean, or dot-product
        initialize-schema: true # Automatically provisions required database tables if missing

Writing a Semantic Search Service Layer

The service implementation below demonstrates how to save text documents to your vector database and run targeted similarity searches using specific distance thresholds.

Save this component at src/main/java/com/dhanishempower/ai/vector/service/SemanticSearchService.java:

package com.dhanishempower.ai.vector.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Enterprise search engine component wrapping database storage and automated vector retrieval pipelines.
 */
@Service
public class SemanticSearchService {

    private static final Logger log = LoggerFactory.getLogger(SemanticSearchService.class);
    private final VectorStore vectorStore;

    @Autowired
    public SemanticSearchService(final VectorStore vectorStore) {
        this.vectorStore = Objects.requireNonNull(vectorStore, "The auto-configured VectorStore database component must not be null.");
    }

    /**
     * Persists structured text documentation down into the vector store layer.
     *
     * @param documentId Unique identifier for document tracking.
     * @param documentBody Raw text payload to process and index.
     * @param corporateMetadata System indexing flags, tenant identifiers, and routing attributes.
     */
    public void indexEnterpriseDocument(final String documentId, final String documentBody, final Map<String, Object> corporateMetadata) {
        log.info("Indexing incoming document segment. ID: '{}', Metadata Attribute Count: {}", documentId, corporateMetadata.size());
        
        // Wrap text and metadata into a standardized Spring AI Document structure
        Document unifiedDocument = new Document(documentId, documentBody, corporateMetadata);
        
        try {
            // The VectorStore automatically converts the text to a vector using your configured embedding model and persists it to the database
            this.vectorStore.add(List.of(unifiedDocument));
            log.debug("Successfully saved document vector space records for identifier: '{}'", documentId);
        } catch (Exception storeException) {
            log.error("Fatal exception during database save pipeline operation: ", storeException);
            throw new RuntimeException("Database write failure occurred: " + storeException.getMessage(), storeException);
        }
    }

    /**
     * Queries your database using semantic similarity logic to find matches closest to a user query.
     *
     * @param userQuery Clean text phrase representing the query target.
     * @param maximumLimit Ceiling count limiting total return documents returned.
     * @return List of matching Spring AI Document instances.
     */
    public List<Document> executeSemanticLookup(final String userQuery, final int maximumLimit) {
        log.info("Executing semantic lookup for query string: '{}' | Request limit capped at: {}", userQuery, maximumLimit);

        // Build a SearchRequest specifying similarity thresholds and response size limits
        SearchRequest queryParameters = SearchRequest.query(userQuery)
                .withTopK(maximumLimit)
                .withSimilarityThreshold(0.78); // Filters out matches with a low confidence score

        try {
            List<Document> proximityMatches = this.vectorStore.similaritySearch(queryParameters);
            log.info("Semantic match evaluation completed successfully. Found {} records matching criteria.", proximityMatches.size());
            return proximityMatches;
        } catch (Exception queryException) {
            log.error("Failed to execute nearest neighbor search over targeted table indices: ", queryException);
            throw new RuntimeException("Semantic search execution failed: " + queryException.getMessage(), queryException);
        }
    }
}

6. Enterprise Architectural Design Patterns

Vector architectures are critical components across several modern enterprise software patterns. Let us explore three high-throughput architectural design workflows:

1. Retrieval-Augmented Generation (RAG)

Large Language Models are bound to their static training cutoffs and cannot natively access real-time corporate data or internal private documentation. Retrieval-Augmented Generation (RAG) addresses this limitation by using vector stores as an external memory tier for your application's AI. When a client submits a query, your Java microservice queries your vector database to extract relevant text fragments, passing those fragments along to the LLM to ground its response in factual business data. To see a complete production implementation of this pattern, see our step-by-step masterclass: Implementing Retrieval-Augmented Generation (RAG) with Spring AI.

2. E-Commerce Semantic Recommendation Topologies

Traditional recommendation engines rely heavily on hardcoded category filters or complex relational lookups. Vector-driven architectures simplify this process by converting user purchase patterns, view histories, and catalog descriptions into identical vector coordinates. When a user browses a particular item, your application requests similar items directly from your vector store using cosine similarity queries, returning highly accurate product recommendations in milliseconds.

3. Near-Duplicate Fraud Detection and Auditing

Fraud detection pipelines often struggle to flag suspicious transactions or duplicate support submissions if bad actors make minor changes to phrasing or word ordering. By routing data through an embedding pipeline and comparing the spatial similarity scores of incoming text, security applications can quickly identify duplicate content, cluster similar issues, and detect coordinated fraud attempts automatically.


7. Production Pitfalls and Mitigations

When transitioning vector operations from local testing environments to production scale, engineering teams often face unexpected performance and data consistency issues. Review these three common architectural challenges and their corresponding solutions:

1. Managing Dimension Mismatches Across Environments

Every embedding model maps text to a fixed vector length that cannot be modified after training. For instance, OpenAI's legacy text-embedding-ada-002 model generates exactly 1536 dimensions, whereas newer models allow developers to select custom dimensional lengths. If your production database index is configured for a specific dimension size and your application attempts to store a vector of a different length, your database writes will fail with severe mathematical alignment errors.

Mitigation Strategy: Enforce strict dimension tracking through code-level validation checks. Use environment properties files to ensure your vector indices always match the dimensional footprints generated by your active embedding models.

2. The Dangers of Model Mixing within a Vector Space

Vector spaces are completely unique to the specific neural networks that created them. You cannot mix or compare vectors across different embedding engines. If you index your internal documentation using an open-source model like HuggingFace and then attempt to query that index using OpenAI embeddings, your searches will return random and inaccurate results, even if the query text matches your source documents exactly.

Mitigation Strategy: Isolate different models into distinct database tables or isolated schemas. If you migrate your system to a new embedding model, you must rebuild and re-index your entire document database from scratch using the new engine.

3. Preventing Performance Degradation via Approximate Nearest Neighbor (ANN) Indexing

When starting out with small datasets, executing exact nearest neighbor searches (a flat index search) works fine because the system can quickly calculate distances across all records. However, as your database grows to hundreds of thousands of rows, exact sequential lookups degrade rapidly, transforming into slow, resource-heavy operations that impact API response times.

Mitigation Strategy: For high-scale production systems, you should configure Approximate Nearest Neighbor (ANN) indexing models like **HNSW (Hierarchical Navigable Small World)** or **IVF (Inverted File Index)**. These indexing models organize data into searchable graphs and clustering trees, allowing your application to maintain fast, sub-millisecond query responses by trading off a fractional percentage of absolute mathematical precision.

System Integration Architecture for High-Scale Applications

The code blueprint below demonstrates how to connect these different service layers together inside an enterprise gateway application. It exposes a type-safe REST endpoint that validates incoming search payloads and returns matching document components cleanly.

Save this controller class at src/main/java/com/dhanishempower/ai/vector/controller/VectorQueryController.java:

package com.dhanishempower.ai.vector.controller;

import com.dhanishempower.ai.vector.service.SemanticSearchService;
import org.springframework.ai.document.Document;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Controller exposing type-safe REST endpoints to query and retrieve vector data.
 */
@RestController
@RequestMapping("/api/v1/vector-search")
public class VectorQueryController {

    private final SemanticSearchService searchService;

    public VectorQueryController(final SemanticSearchService searchService) {
        this.searchService = searchService;
    }

    /**
     * Executes a semantic similarity search across your document index.
     *
     * @param query Clean text query phrase from the user.
     * @param limit Maximum number of matching records to return.
     * @return List of matching documents sorted by similarity.
     */
    @GetMapping
    public ResponseEntity<List<Document>> performSemanticSearch(
            @RequestParam(value = "query", defaultValue = "Spring Boot microservices") final String query,
            @RequestParam(value = "limit", defaultValue = "3") final int limit) {
        
        List<Document> matchingResults = this.searchService.executeSemanticLookup(query, limit);
        return ResponseEntity.ok(matchingResults);
    }
}

8. Technical Interview Preparation Masterclass

Review these common architectural interview questions to help prepare for technical discussions focused on high-scale enterprise vector data systems:

Q1: What is the primary difference between traditional relational database indexes and vector database indexes?

Answer Blueprint: "Traditional database indexes, like B-Trees, are built for structured lookups, allowing systems to navigate ordered paths to find exact values, clear data ranges, or sorted keys quickly. Vector indexes, like HNSW, operate on an entirely different approach. Because navigating multi-dimensional spaces requires intense mathematical calculations, vector indices trade absolute precision for massive speed improvements. They group dense floating-point arrays into searchable geometric clusters and graph networks, utilizing Approximate Nearest Neighbor (ANN) search algorithms to return highly accurate results in milliseconds, even across millions of records."

Q2: Why does an application experience high latency during the initial indexing phase, and how can engineers optimize this pipeline?

Answer Blueprint: "Vector indexing delays are caused by two primary resource bottlenecks: the network roundtrips required to send text chunks to external embedding models, and the intensive mathematical calculations your database performs to rebuild its index graphs during large data writes. To optimize this pipeline, developers should process data ingestion streams concurrently using Spring's virtual thread pools to handle network waits efficiently. Additionally, utilizing bulk insert operations instead of single data writes dramatically reduces database indexing overhead."

Q3: Can you run similarity queries across different embedding models if their vector lengths match?

Answer Blueprint: "No, this will fail. Vector coordinates are completely dependent on the internal neural mappings and semantic features of the specific model that generated them. Even if two different models happen to output the exact same number of dimensions, their underlying coordinate systems are entirely different. Attempting to run similarity searches between mixed models will return random and meaningless results because the same position in space represents completely unrelated concepts across the two different models."


9. Comprehensive Systemic Progression

You now have a foundational understanding of vector mathematical principles, high-dimensional text tokenization pipelines, and unified Spring AI database integration strategies. By mastering these architectural concepts, you can build reliable, high-performance semantic search engines that abstract the complexities of raw vector mechanics away from your core Java application code.

Now that your data tier is operational, explore our remaining enterprise masterclasses to continue building your cloud-native AI expertise:

About the Author

Naresh Kumar

Naresh Kumar

Senior Java Backend Engineer experienced in Banking, Payments, ISO 20022, Spring Boot, Microservices, Kafka, Docker, Kubernetes, AWS and Cloud Native Systems.

Built enterprise payment solutions, transaction processing systems, API platforms and scalable microservices used in production.

LinkedIn Profile