New: CentriCall AI voice agents that answer, qualify, and book around the clock
Backend

Java development for systems that have to keep running for another decade

Centricone builds Spring Boot services and modernizes older Java estates — the applications that quietly run operations, where an outage is measured in business impact rather than in user complaints.

What we build

What we build with Java

Spring Boot services

Modular services with configuration, security, and observability handled by the framework rather than reinvented per team.

Legacy Java modernization

Old application servers, ageing Java versions, and monoliths carved into services one bounded context at a time, with nothing stopping while it happens.

JVM performance and memory work

Garbage collection tuning, heap analysis, and connection pool sizing — the JVM gives you real levers, and most estates have never had them adjusted.

When Java is the right call — and when it is not

We would rather talk you out of a stack than deliver the wrong one well.

Reach for it when

  • Long-lived enterprise systems where stability and support horizon dominate
  • High-throughput backends that benefit from JVM performance and true threading
  • Organizations with existing Java expertise and operational tooling

Pick something else when

  • Small services where the startup time and memory footprint are disproportionate
  • Teams optimizing for speed of initial delivery above all else
  • Serverless workloads where cold starts matter, unless you are prepared to work at it

What we normally run alongside it

No stack is one tool. These are the pieces that usually show up with Java on our projects.

  • Spring Boot
  • PostgreSQL
  • Kafka
  • Kubernetes
  • Maven

Java questions we get asked

Weighing it against something else? Tell us the constraints and we’ll give you a straight recommendation.

For long-lived, high-throughput backend systems, yes. The JVM is exceptionally well understood operationally, the ecosystem is deep, and the support horizon is measured in decades. It is a poor choice when you need minimal footprint or the fastest possible path to a first version.
Usually, in steps. The jump across the module system is the one that costs real effort; after that upgrades are far less painful. We assess dependencies first, because that is where the work actually is.
Only where you have a reason: independent scaling, independent deployment, or independent teams. Splitting a monolith without one of those trades a code problem for a distributed-systems problem, which is harder. We will say so if that is what we see.
Kotlin for new services, in most cases — it is fully interoperable, runs on the same JVM, and removes a category of null-related bugs by design. The two mix freely in one codebase, so this is not a migration decision and does not need to be made all at once.
With a profiler attached to something that resembles production, never by guessing at JVM flags. In practice the wins are almost always in the data access layer — queries issued in a loop, missing indexes, a cache that was never sized — and garbage collection tuning matters far less often than its reputation suggests.
Yes, and the licence cost usually pays for the work. The target is typically Spring Boot with an embedded server, which removes the application server entirely. The effort concentrates on whatever used the vendor's proprietary features — JMS, transactions, and the deployment descriptors — rather than on the business code.