Jumping on the microservices craze (which allows me to experiment with all kinds of technologies), I've built a personal portal. It's helping me simplify my life. Or at least, that's the purpose :)
I expect that the functionality of the portal will change often. It adapts to my life.
That why I have chosen to design the portal as microservices. The goal is to easily write new functionality and disable unused modules. This decision allows me to use different technologies, making it interesting to toy around with new technology hypes.
Functionalities include:
Since modules should be easily removed/replaced/introduced, it's important for modules to have as less dependencies on each other as possible. On the other hand, I expect the portal to be a smart, proactive system, which requires modules to be sharing data all the time.
The preferred communication method is asynchronous, generic data exchange. When something occurs that could be of interesting for other modules, the module is expected to publicize this information on the Event topic. Every other module that's interested will receive this information, doing something meaningful, or throwing the message away.
In case that synchronous communication is required, for example for queries of other modules so that information can be shown in the front-end, REST webservices should be used.
There is a dedicated front-end module which contains the front-end components for every backend module.
Wait, in the spirit of the back-end, shouldn't this monolithic front-end also be split into microservices?
While the back-end functionality can be kept apart in separate components (if some supporting components are put in place), this is much harder in the front-end. At first, I've tried to create a "real modular" front-end.
Still, the user will access the app in one place only. This means I have to assemble all components in one app, the so called "core app". This core app
These are the options that I thought of, to realize this:
Neither options cut it. I want a highly-functioning progressive web app.
Ok, my conclusion is that a high-performing front-end cannot be split into completely separate modules, due to the design of the web.
The best second thing is to have a single front-end, but keep the different domains separated via modules or web components.
The unsplittable common part is kept in a single location. Efforts are made to keep these as small and clear as possible.
I'm still happily using all the features I've built. Maintaining them... that doesn't really happen too much.
In the past 7 years, since I started this project, my life has changed. The largest bulk of my time goes to my familiy - and especially my son.
That's also the biggest problem of this project: while it was super nice to build 15+ smaller modules, all in a technology that fits the use case best, maintaining all these different things became a burden.
If I ever get the freedom to do a rewrite, I'd probably go for a nice Spring Boot-based backend, modularized with Spring Boot Modulith.
This way, I can keep the components separately, while