Also - you give up type safety and refactoring. LoL
- on the service provider, the implementation provides the actual functionality,
- on the client, the implementation of the interface is just a stub connecting to the actual service provider.
Thus you can sort of provide separation of services as an implementation detail.
However in practice very few projects elect to do this.
Proj:
|-proj-api
|-proj-client
|-proj-service
Both proj-client and proj-service consume/depend-on proj-api so they are in sync of what is going on.
Now, you can switch the implementation of the service to gRPC if you wanted with full source compatibility. Or move it locally.