Service · Web development

Custom microservices architecture development.

A monolith that no longer scales, or a greenfield platform that must be ready for growth from day one: we design and build microservices architectures in which each service covers its own business capability, can be deployed independently and scales with demand.

Domain-Driven DesignKubernetesEvent streamingAPI gateway

Microservices are not a goal — they are a choice.

A microservices architecture splits your application into independent services, each covering a specific business capability. Order processing, pricing, customer data, notifications: each gets its own service, its own data store, its own deployment cycle and its own team ownership. The pattern emerged at organisations such as Netflix, Amazon and Spotify, which found that a monolithic codebase with hundreds of engineers gets stuck on coordination, not on technology.

That sounds appealing, but it is not a free upgrade. Microservices bring complexity: distributed transactions, observability, service discovery, schema evolution, cross-cutting authentication. You trade code complexity for network complexity, and you buy independent deployment cycles at the cost of a platform team to keep them running.

We help you decide honestly when microservices are worth the effort, and when a well-structured modular monolith or platform migration will serve you better. If we build, we build properly: from bounded contexts and API gateways to observability stacks and GitOps pipelines. Not an experiment, but production-ready architecture your team can manage after we have gone.

Three engagements in which we build microservices.

The right route depends on your starting point: a greenfield project, a stuck monolith, or a multi-system landscape following an acquisition. In the first conversation, we decide together which engagement fits best.

Greenfield platform · fixed sprint budget

New platform from scratch

A new SaaS or platform product designed from the first service for multi-tenancy, scale and team velocity. We start with event storming and Domain-Driven Design, define bounded contexts, and build the first services around the most valuable business capabilities.

DDD workshopService decompositionAPI gatewayEvent streaming
Strangler fig migration · fixed sprint budget

Untangling the monolith, service by service

Your monolith still works, but it no longer scales with the business. We carve out domains step by step using the strangler fig pattern. First the capabilities causing the most velocity pain, such as pricing, search or notifications, and only later the difficult core. The monolith keeps running until the last piece has been extracted.

Bounded contextsAPI gateway routingEvent bridgesData migration
Post-M&A landscape · fixed sprint budget

Service mesh over a mixed landscape

After a merger or acquisition, you are left with multiple stacks, languages and deployment mechanisms. We lay a service mesh (Istio or Linkerd) over the existing systems, harmonise observability and authentication, and migrate underlying systems to a consistent platform at your own pace.

Service meshmTLSMulti-clusterPolyglot stack

What you get at the end.

A working platform plus the entire runway around it: code, infrastructure, observability, runbooks and a team that can manage it themselves. Not just a set of services in production, but the discipline to build new ones alongside them.

  • The microservices themselves: production and stagingBackends in Node.js, Spring Boot, .NET, Go or Python (FastAPI), depending on your stack preference. Deployed on Kubernetes (EKS, GKE, AKS, OpenShift) or Nomad.
  • API gateway and service discoveryKong, Tyk, Apigee or AWS API Gateway as the front door. Service discovery, load balancing, circuit breakers and rate limiting configured as standard.
  • Event streaming backboneKafka, NATS or RabbitMQ as the asynchronous backbone, with Confluent Schema Registry for schema evolution and backward compatibility.
  • Observability stackOpenTelemetry instrumentation, distributed traces in Jaeger, metrics in Prometheus, dashboards in Grafana, and structured, searchable logs.
  • CI/CD and GitOpsGitHub Actions or GitLab CI for builds; ArgoCD or Flux for declarative deployments; pull request preview environments for each service.
  • Infrastructure as CodeFull infrastructure in Terraform or Pulumi, secrets in HashiCorp Vault or AWS Secrets Manager. Reproducible, auditable, peer-reviewed.
  • Documentation and runbooksArchitecture decision records, sequence diagrams for each saga, incident runbooks for each service. Your team knows how it works and what to do when something fails.
  • Managed services agreement (optional)Ongoing maintenance, security patches, on-call support and further development for a fixed monthly fee, with clear response times.

When microservices genuinely pay off.

Not every platform benefits from microservices. We help you assess honestly which patterns you recognise and which route suits your situation. See also our related service cloud-native platform development for the wider context.

Scaling pressure

The monolith drives up CPU and costs

One component peaks on Black Friday, so you scale the entire system. Microservices let you scale only the busy services horizontally — pricing, search, checkout — while the rest keeps running quietly.

Team velocity

Several teams collide in the same codebase

Four teams in one repository, one deployment pipeline, Friday deployments nobody dares to make. Independent release cycles per bounded context give each team its own rhythm and ownership.

Fault isolation

One bug brings down the entire platform

A memory leak in the reporting module takes your checkout offline. Microservices contain failures: a crashing service only affects the capability behind it, not the rest of your platform.

Polyglot stack

You want the right tool for each problem

Real-time event processing in Go, ML inference in Python, transactional core in Java. Giving each service its own runtime means your team can choose the appropriate tool for every problem.

When microservices are genuinely not a good idea.

Honestly, for many organisations a modular monolith is faster, cheaper and less burdensome to operate. If you fall into one of these categories, we often recommend a different route.

Team size

Small team, few parallel deployments

For a team of two to five engineers, the operational overhead of microservices is rarely worth it. A well-modularised monolith often scales far enough and is much easier to understand in production.

Complexity

Simple application, limited domains

A CRUD application with a handful of entities does not warrant ten services. The burden of distributed systems outweighs the gains — you trade code complexity for network complexity.

Velocity

Low rate of change

If you deploy once a quarter, independent deployment velocity is no advantage. The effort you put into pipelines, observability and service mesh won't pay off at this scale.

Maturity

No platform team or operational discipline

Microservices require invested time in DevOps discipline, on-call rotations and an observability culture. Without that foundation, your architecture becomes a minefield rather than a source of freedom.

How a microservices engagement works with us.

1

Discovery and event storming

Together with your domain experts, we map out which business events actually exist, which commands trigger them, and where the natural boundaries between domains lie. By the end, we know which bounded contexts there are and which services are most worth extracting. Domain-Driven Design is not an academic exercise here but the foundation under every successful decomposition — wrong boundaries lead to a distributed monolith, the worst of both worlds.

2

Architecture and foundation

Kubernetes cluster, API gateway, event bus, observability stack, CI/CD pipelines, secrets management and IaC baseline. A service skeleton that lets your team deploy the first service from top to production. We document the choices in architecture decision records so that later teams understand why Kafka was chosen over NATS, or why Istio rather than Linkerd. Part of this phase is also setting up saga orchestrators for distributed transactions and a schema registry for backwards compatibility.

3

Build in iterations

Each iteration delivers at least one working service with monitoring, tests and a deployment pipeline. We tackle the capabilities with the highest business value or the sharpest delivery pain first, and leave the complex legacy core until later.

4

Migration or rollout

For a strangler fig migration, we move route by route via the API gateway, using dual writes and event bridges to the monolith. For greenfield projects, we roll out in phases per business capability, using feature flags to manage risk.

5

Knowledge transfer and maintenance

We train your team on the operational side: how to read distributed traces, how to debug sagas, and how schema changes are handled. Afterwards, ongoing maintenance or co-development with your own platform team is available as an option.

Frequently asked questions.

What clients most often want to know before starting a microservices project.

When is microservices the right choice, and when is it not?
Microservices make sense when you face genuine scale pressure, several teams need to work in parallel, you have polyglot stack requirements, you need fault isolation, or you want independent deployment cycles per business capability. For smaller teams, simpler applications or little delivery pressure, a modular monolith is almost always the wiser choice. In the first conversation, we help you honestly establish which direction to take. That is more often a no to microservices than you might expect.
What is the difference between a monolith and microservices in practice?
In a monolith, all business logic lives in one codebase, with one deployment and often one database. In a microservices architecture, each business capability is its own service with its own datastore, its own team ownership and its own deployment pipeline. You gain independent scalability and team velocity, but pay with greater operational complexity: distributed transactions, schema evolution, observability and service mesh. A modular monolith sits somewhere in between and is often a sensible intermediate step.
Do we really need Kubernetes for microservices?
Not absolutely, but in practice almost always. Kubernetes (managed through EKS, GKE, AKS or OpenShift) has become the standard for running containerised services with auto-scaling, self-healing and declarative deployments. Alternatives such as HashiCorp Nomad exist and sometimes suit smaller setups better. ECS, Cloud Run or App Runner can work for a handful of services. With more than ten services and multi-team velocity, Kubernetes almost always wins.
How do you approach a strangler fig migration?
We place an API gateway in front of the monolith and gradually route traffic to new services. For each capability, we identify the bounded context, build the new service with its own datastore, and synchronise data via change data capture or event bridges until the new service is the canonical source. The monolith keeps running until the last piece is removed. Priority goes to the capabilities with the highest delivery pain or the greatest scale pressure, not the most difficult core. See also our page on having your platform migration carried out.
How many services should we have?
As few as possible to solve the problem. The right number follows from your business domain, not from a target figure. Start with coarse bounded contexts such as order, customer, pricing, payment and notification, and only split further when a service becomes too large for one team or when deployments start interfering with each other. Premature decomposition into thirty microservices is one of the most expensive mistakes we see.
How much should we invest in observability?
A lot — and it isn't an option but a requirement. Without distributed tracing (OpenTelemetry, Jaeger or Tempo), structured logs and service-level metrics, a microservices platform is simply not operable. We design observability as a first-class part of the platform, not as something squeezed into the last sprint. The rule of thumb: if you aren't willing to make time for observability, don't choose microservices.
How long does a microservices project take?
That depends heavily on scope: a greenfield platform with three or four core services can be in production within a number of sprints. A full strangler-fig migration of a large monolith is a multi-sprint project that often runs alongside business as usual. In the discovery phase, we give you a well-founded estimate based on the number of bounded contexts and the complexity of data migration.
How do you handle compliance — ISO 27001, NIS2, DORA, GDPR?
A separate audit trail per service, encryption in transit and at rest, role-based access via your identity provider, and infrastructure as code so that all changes are reviewable and reproducible. For financial institutions under DORA, we explicitly build for incident reporting, operational resilience and third-party risk. We handle GDPR aspects such as data minimisation and retention policies per service. For systems with strict uptime requirements, we often pair this architecture with a high-availability system development project.
Which tech stack do you recommend for services?
We are polyglot — depending on the capability and your team's skills, we choose Node.js (TypeScript), Spring Boot, .NET, Go or Python (FastAPI) for backend services. For service-to-service communication we typically use gRPC for its type safety and performance, with REST or GraphQL for public APIs. Kubernetes is usually the deployment target, running on AWS (EKS), Azure (AKS), GCP (GKE) or, for cost-conscious setups, on Hetzner with managed Kubernetes. Data per service: PostgreSQL by default, Redis for caches, Elasticsearch for search functionality, and MongoDB or DynamoDB where document stores are more natural.
How do you handle distributed transactions and data consistency?
In a microservices architecture, classic ACID transactions spanning multiple services no longer exist. We use the saga pattern — a chain of local transactions with compensating actions on failure — implemented either as orchestration (one central saga coordinator) or choreography (services react to each other's events). For read models we apply CQRS where it makes sense, with event sourcing for capabilities where a complete audit history matters, such as payments or contracts. We are pragmatic: not every service needs event sourcing.

Talk to us about your microservices architecture.

A free, no-obligation half-hour introduction. We listen to your current situation — monolith, greenfield or post-M&A — ask sharp questions, and give direction on whether microservices really are the right answer. Would you rather see what we have built before? Then take a look at our enterprise software projects.

Edit content