If I were trying to convince myself to extract a (micro)service, today, I’d do it like this. First I’d have a conversation with myself:
- you are making tactical changes slightly easier at the expense of making strategic changes quite hard; is that really the trade-off you’re after?
- you must have the operational acumen to provision and deploy new services in less than a week
- you must have the operational acumen to instrument, monitor, and debug how your applications interact with each other over unreliable datacenter networks
- you must have the design and refactoring acumen to patiently encapsulate the service you want to build inside your current application until you get the boundaries just right and only then does it make sense to start thinking about pulling a service out
I would reflect upon how most of the required acumen is operational and wonder if I’m trying to solve a design problem with operational complexity. If I still thought that operational complexity was worthwhile, I’d then reflect upon how close the code in question was to the necessary design. If it wasn’t, I would again kick the can down the road; if I can’t refactor the code when it’s objects and methods, there’s little hope I can refactor it once its spread across two codebases and interacting via network calls as API endpoints, clients, data formats, etc.
If, upon all that reflection, I was sure in my heart that I was ready to extract a service, it’d go something like this:
- try to encapsulate the service in question inside the current app
- spike out an internal API just for that service; this API will become the client contract
- wrap an HTTP API around the encapsulation
- make sure I have an ops buddy who can help me at every provisioning and deployment step, especially if this sort of thing is new and a monolith is the status quo
- test the monolith calling itself with the new API
- trial deploy the service and make some cross-cutting changes (client and server) to make sure I know the change process
- start transferring traffic from the monolith to the service
In short, I still don’t think service extraction is as awesome as it sounds on paper. But, if you can get to the point of making a Modular Monolith, and if you can level up your operations to deal with the demands of multiple services, you might successfully pull off (micro)services.