Typically via HTTP using JSON. Frequently though people realize JSON is a bad format for exchange between many services at scale so they will switch to something like protobufs/thrift/avro.
The HTTP part is not a requirement either, as there are microservices that talk via application specific tcp protocols , udp, or if they are housed on the same machine memory mapped files.