Carvajal made the breakthrough in the 74th minute when he headed a corner from Toni Kroos into the back of the net, before Vinicius netted nine minutes later to secure the trophy for Carlo Ancelotti's side.
Here, Sports Mole takes a close look at how each player performed during the Champions League final, with Dortmund also impressing for long periods of the contest.
BORUSSIA DORTMUND
Goal
Gregor Kobel: The 26-year-old, who has had an excellent season, made some smart saves in the second period, with Dortmund coming under pressure, but he had no answer to the efforts from Carvajal and Vinicius. (7/10)
Defence
Julian Ryerson: Found it difficult up against Vinicius, with the Brazilian causing all sorts of problems in the second period, and he also struggled to contribute from an attacking point of view. (6/10)
Mats Hummels: Hummels has been so impressive in the Champions League this season, and he was strong in the first half, but he found it tough in the second 45 minutes. (6/10)
Nico Schlotterbeck: Comfortably his team's best player on the night, Schlotterbeck made a number of important tackles and interceptions over the course of the 90 minutes, and he was unfortunate to be on the losing side. (8/10)
Ian Maatsen: Maatsen was caught out on a couple of occasions defensively in the second period, but he was a threat going forward, especially in the opening 45 minutes. (6/10)
Midfield
Emre Can: The 30-year-old recovered from an early injury scare to play 80 minutes of the final, but like a number of his teammates, he found it difficult after the break. (6/10)
Julian Brandt: Had Dortmund's first chance of the match in the 14th minute, but he fired wide of the post. Proved to be a threat when he had time on the ball. (7/10)
Marcel Sabitzer: Has been one of the unsung heroes for BVB en route to the final, and he enjoyed a solid yet unspectacular night, finishing with a pass completion of 97%. (6/10)
Attack
Jadon Sancho: Earned plaudits for his performance in the semi-finals, but the on-loan Manchester United attacker was simply unable to get into the final. (5/10)
Niclas Fullkrug: Hit the post in the first period and had a late header disallowed for offside. Proved to be a constant threat for BVB during the 90 minutes of action. (7/10)
Karim Adeyemi: Was Dortmund's biggest threat in the opening 45 minutes, but the attacker was guilty of being wasteful at the vital moment. Faded in the second period. (7/10)
Substitutes
Marco Reus: The German was introduced in the 72nd minute, shortly before Real Madrid scored their opener, and he struggled to get into the match on his final appearance for the club. (6/10)
Donyell Malen: Provided the cross for Fullkrug to net late on, but the effort was chalked off for offside. Looked lively during his short time on the field. (6/10)
Sebastien Haller: Entered the field shortly before Real Madrid doubled their advantage, and the experienced striker saw little of the ball in London. (6/10)
Jamie Bynoe-Gittens: Was given the final stages of the Champions League final, but it was too late for him to have any sort of impact. (6/10)
REAL MADRID
Goal
Thibaut Courtois: Having proved his fitness towards the end of the 2023-24 La Liga season, Courtois was given the nod between the sticks at Wembley, and he put in a commanding performance to demonstrate why he is one of the best goalkeepers in world football. (8/10)
Defence
Dani Carvajal: Overcame a difficult start to the match to become a driving force for Real Madrid on the night. Scored his side's opener with a brilliant header and continued to push his side forward in search of more goals. (9/10)
Antonio Rudiger: Used the ball incredibly well on the night, completing 74 of his 78 passes, while he was strong in the air and on the ground during a dominant performance. (8/10)
Nacho: Could be his final appearance for Real Madrid, and the Spaniard provided a base for his side to build from in the second half of action. (7/10)
Ferland Mendy: There remains uncertainty surrounding his long-term future at Real Madrid, but Mendy was excellent at Wembley, putting in a strong defensive performance at left-back. (8/10)
Midfield
Federico Valverde: Was not his best performance on the ball, but he covered the ground incredibly well, with his energy proving to be key in the second half of action. (7/10)
Eduardo Camavinga: Benefited from Aurelien Tchouameni's injury to start the final, and he almost scored late on with a wonderful strike. A solid performance from the Frenchman. (7/10)
Toni Kroos: Provided an assist on his final appearance for Real Madrid, with the midfielder retiring from football this summer, but he showed that he is still capable of putting in world-class performances at the highest level. (8/10)
Jude Bellingham: Found it difficult in the first period, but Bellingham had more of an impact in the second period and provided the assist for Vinicius to score late on. (7/10)
Attack
Rodrygo: Found it tough to get into the match for long spells, with the 23-year-old struggling to outwork the Dortmund defence, but his constant movement played a role in Real Madrid ultimately securing the victory. (6/10)
Vinicius Junior: Scored late on to secure the victory for Real Madrid, and after a quiet opening 45 minutes, he was very dangerous for Los Blancos in the second period. (7/10)
Substitutes
Joselu: Was rewarded for his semi-final heroics with a substitute appearance late on, and he showed some nice touches in the final exchanges. (6/10)
Luka Modric: Could also perhaps be leaving Real Madrid this summer, and he was given the final stages of the clash at Wembley. (6/10)
Eder Militao: Was overlooked for a start in the final despite returning from a serious knee injury, but he was able to contribute in the final moments. (6/10)
Lucas Vazquez: Was introduced in the 93rd minute of the contest for Vinicius, and he helped close out the match for the 15-time European champions. (6/10)