Issue
When I use a Spring Boot app in local it uses, localhost:8080
. When it is pushed to Pivotal Cloud Foundry, it has some route https://my-app.xyz-domain.com
and we can access the URL without a port, what is happening behind the scene?
Solution
On CloudFoundry, your application is actually still running on localhost:8080
. The reason that you can access your application through https://my-app.xyz-domain.com is that the platform handles routing the traffic from that URL to your application.
The way this works is as follows:
You deploy your application. It's run by the foundation in a container. The container is assigned a port, which it provides to the application through the
$PORT
env variable (this can technically change, but it's been 8080 for a long time). Your application then listens onlocalhost:$PORT
or effectivelylocalhost:8080
.The platform also runs Envoy in your container. It's configured to listen for incoming HTTP and HTTPS requests, and it will proxy that traffic to your application on
localhost:$PORT
.Using the
cf
cli, you map a route to your application. This is a logical rule that tells the platform what external traffic should go to your application. A route can consist of a hostname, domain, and/or path. For example,my-cool-app.example.com
ormy-cool-app.example.com/foo
. For a route to work, the domain must have its DNS directed to the platform.When an end-user accesses the route that you mapped, the DNS resolves to the platform and the traffic is directed to the external load balancers (sometimes TCP/layer4, sometimes HTTPS/layer7) that sit in front of the platform. These proxies do not have knowledge of CF, they just proxy incoming traffic.
Traffic from the external load balancers is spread across the set of the platform Gorouters. The Gorouter is a second layer of proxies, but these proxies have knowledge of the platform, specifically, all of the routes that have been mapped on the platform and where those applications actually live.
When a request comes to Gorouter, it will recognize the route like
my-cool-app.example.com
and look up the location of the container where that app is running. Traffic from Gorouter is then proxied to the Envoy which is running in the app container. This ties into step two as the Envoy will route that traffic to your application.
All in total, incoming requests are routed like this:
Client/Browser -> External LBs -> Gorouters -> Envoy -> Application
Answered By - Daniel Mikusa
Answer Checked By - Robin (JavaFixing Admin)