@Andrew Syrov Using HTTP is probably the simplest way to go about this and is widely used for most microservice deployments. Usually, deployments leverage a service discovery component to route requests or use a single API Gateway for all services.
In Azure, you can use Azure APIM to register all functions under the same endpoint. This allows you to send requests to the same endpoint irrespective of which function app they are in. Check this doc that talks about Gateway Aggregation.
But there are scenarios where you could leverage other options like message queues. Use these, you can implement patterns like Choreography.
Finally, Durable Functions are a great option too if you need to run long-running processes without dealing with the underlying queues.