I'm confronted with a microservices architecture consisting of Spring Boot services fronted by a Vaadin Spring Boot application (with an API gateway in between), all written in Java.  Communication between the frontend app and the services, and between services, is done using JSON over HTTP (I'm not calling it REST services here because the REST principles aren't strictly followed).  JSON (un)marshalling is done using Jackson 2.Since Java is a statically typed language, both sides need to have the exact same model: if you get data from a service, change a property, then post it back to the service, you will lose data if your model was missing a property since Jackson will have silently ignored the missing property in the deserialization process.Because they need to have a dependency on the exact same version of the domain model, the services have to be built (whenever the model changes just a bit) and deployed together, making the architecture look more like a distributed monolith.How is this typically avoided?  When using a dynamic language like Javascript, all JSON properties will be retained even if the client is unaware of some of them.  Therefore the service can change without impacting the client as long as it remains compatible.
communicating micro-services in a static language (java)
java;architecture;microservices