index.php creates application instance (
\Magento\Framework\App\Http) using objectManager (that is created before that in bootstrap) and calls method
Http Application instance does initial routing: it takes first part of url to figure out which area should be loaded (admin/frontend/rest/...).
When area is defined, configuration for that area is loaded (unlike Magento 1 where all configuration was loaded).
Then application object calls
Magento\Framework\App\FrontControllerInterface::dispatch of requested area. Front Controller does routing same as in Magento 1: all routers are iterated to match request. The router that matches the request returns instance of ActionController matched to
FrontController. This process is more efficient
because only routers of one area are used (admin router is not used in frontend). All the extra behavior was moved from front controller to
FrontController and Action Controllers.
FrontController gets instance of action controller it calls
dispatch on it. Action controller performs its task and returns instance of some implementation of
ResultInterface (like page, redirect, ...).
FrontController just returns
ResultInterface to Application Instance that renders the response.
I did presentation on this at Meet Magento NL: