Skip to content

Case study: Mateu in a microservices system

In a typical microservices architecture, teams often end up with:

  • a separate frontend application
  • duplicated models between frontend and backend
  • custom APIs for every screen
  • complex synchronization between layers

This leads to slower development and higher maintenance costs.


In this project, Mateu is used to define UI directly inside backend services.

Each service:

  • owns its domain logic
  • exposes its own UI routes
  • defines its own screens using Mateu

Example:

@UI("/_users")
@Title("Users")
public class UsersHome {
@Menu
UsersMenu users;
}

Each service defines its own menus and CRUD flows:

public class UsersMenu {
@Menu
UsersCrud users;
@Menu
RolesCrud roles;
@Menu
PermissionsCrud permissions;
}

  • backend services communicate via gRPC
  • each service exposes UI through Mateu
  • frontend acts as a renderer, not as an application layer
  • UI is composed from multiple services

Instead of:

  • backend + frontend + API

You now have:

  • backend + UI definition (in the same place)

No need to redefine models in multiple layers.

Each service owns:

  • data
  • logic
  • UI

No need for:

  • custom APIs per screen
  • frontend state synchronization

UI aligns with service boundaries.


  • internal tools
  • CRUD-heavy systems
  • enterprise apps
  • distributed architectures

Mateu allows you to keep UI definition close to the backend that owns the behavior.

This reduces complexity and makes microservice-based systems easier to build and evolve.


👉 Try the demo: https://vaadin.mateu.io/fluent/use-cases/rra