1. A method comprising: determining, by a processing device executing a middleware layer, capabilities of a computing device in response to receiving a request for an application; determining, by the middleware layer, a service level agreement of an application level service used by the application; selecting one or more services of the middleware layer to assign to the application in view of the service level agreement of the application level service used by the application, a service level agreement that specifies an obligation of the one or more services of the middleware layer with respect to the application, and whether a remote computing device has available resources to satisfy the service level agreement that specifies the obligation of the one or more services of the middleware layer with respect to the application; determining whether to install the one or more services on at least one of the computing device or on the remote computing device in view of the service level agreement of the application level service used by the application, the capabilities of the computing device and a resource specification of the one or more services; in response to a determination that the capabilities of the computing device are insufficient to satisfy a requirement of a first service of the one or more services, installing a proxy for the first service on the computing device; and installing the first service on the remote computing device, wherein the application interfaces with the proxy; determining that the first service invokes a second service on the remote computing device; migrating the first service and the second service from the remote computing device to an additional computing device; determining that the first service is divisible; and in response to a determination that the first service is divisible, dividing the first service into a plurality of components, causing an installation of a first component of the plurality of components on the computing device, and causing an installation of a second component of the plurality of components on an additional computing device.