The latest edition of the MLS All-Star game saw Bayern take the lead after eight minutes through Robert Lewandowski, while the MLS All-Stars equalized in the 51st courtesy of a fine strike from Bradley Wright-Phillips.
Donovan then netted the winner with 20 minutes to play after a nice ball from Portland's Diego Valeri, lifting the All-Stars to the win over the German powerhouse.
It didn't take Bayern long to assume control of the game, and after Lewandowski was denied by goalkeeper Nick Rimando in the seventh minute, the Bayern striker hammered a swerving shot past Rimando from the top of the box after taking a pass from Rafinha.
Rimando was busy in the first half and he needed to be sharp to keep out a chance from Pierre-Emile Hojbjerg before a fine reaction stop on a close-range shot from Xherdan Shaqiri.
The Real Salt Lake netminder stayed active with saves on Julian Green and another on Shaqiri before the break, while the All-Stars best chance was a dipping volley from Thierry Henry that just sailed over the crossbar.
All-Stars coach Caleb Porter changed nearly his entire team at halftime, and the All-Stars responded by leveling the match in the 51st when Wright-Phillips brought down a flicked header from Erick Torres and lashed a powerful shot into the upper right corner of the net.
Goalkeeper Bill Hamid came on at halftime for Rimando and he made a nice save on a free kick from David Alaba five minutes before the All-Stars took the lead.
Valeri played provider with a wonderful ball over the top from the right wing and Donovan finished inside the box by bringing the ball down and poking it past Bayern goalkeeper Manuel Neuer.
Hamid did well to keep out a strong volley at close range from Juan Bernat in the 79th, while the All-Stars were able to hold out for the final 10 minutes despite Bayern bringing on substitutes Thomas Muller, Mario Gotze, and Bastian Schweinsteiger among others.