Microservice architectures: what have we learned