Barcelona took a huge step towards winning their first league title in four years by beating the champions for a third successive time. The result left second-placed Real 12 points adrift of the leaders.
Roared by almost 100,000 fans in a sold-out Camp Nou, Barca were the better side and earned a well deserved win against a Real Madrid side that at times seemed resigned to their fate.
"We have to be honest... We never gave up, but we are already four games behind them. Nothing is impossible, but the truth is that it's very difficult (to win the title)," Real goalkeeper Thibaut Courtois told Movistar Plus.
It was an electrifying game from the start with Barcelona pressing high and they almost scored in the sixth minute with a point-blank header by Raphinha that Courtois brilliantly stopped with a reflex save using his right fist.
From the rebound, Sergi Roberto fired a fierce shot inches over the bar.
But Barcelona were quick to regroup and they took control of game.
Andreas Christiansen could have scored twice from two corners and Raphinha, who was arguably Barcelona's most dangerous player, attempted an angled shot from the edge of the area that Courtois denied with another great save.
Real seemed content to sit on their lead but their strategy backfired. At the stroke of halftime, their defence failed to clear the ball from the box and Sergi Roberto quickly pounced to fire an unstoppable strike to the left of the goalkeeper.
Barcelona did not take the foot off the gas after the break and created several opportunities but it was Real substitute Marco Asensio who netted a goal that could have changed the script in the 81st minute.
However, his close-range effort was ruled out by the VAR after the replay showed he was fractionally offside.
Barca kept pushing for the winner and finally got it in added time when Alejandro Balde raced down the left channel and crossed to Kessie who was left unmarked in the far post. He unleashed an unstoppable first touch strike to give Barca the win of the season.
PSG handed first Ligue 1 home defeat this season
Paris St Germain suffered yet another setback as they slumped to their first Ligue 1 home defeat of the season when they were beaten 2-0 by Stade Rennes on Sunday.
PSG lead second-placed Olympique de Marseille, who ended Stade de Reims's 19-game unbeaten run in the league with a 2-1 away win, by seven points, but the capital side were knocked out of the Champions League by Bayern Munich earlier this month and eliminated from the French Cup by OM in February.
That left only the league title to focus on, and Sunday's performance at the Parc des Princes exposed their shortcomings and put further pressure on coach Christophe Galtier.
Once again, their attacking plans were limited to finding Kylian Mbappe, while the defence was not up to the task in the absence of the injured Presnel Kimpembe and Marquinhos.
Rennes, who prevailed with goals by Karl Toko Ekambi and Arnaud Kalimuendo, have now beaten PSG twice this season as they moved up to fifth on 50 points from 28 games, 16 behind PSG.
Monaco are fourth on 54 after beating AC Ajaccio 2-0 away earlier on Sunday.
"For sure we played a very bad game. There is little to say. I'm sorry for the fans who are always there. It's not us, it's not our team," said PSG midfielder Vitinha.
"We are very, very sad because we never imagined this. The club don't deserve this. It's not enough. We have to do better in the next game.
"You get the feeling that the players didn't give it their all but that's not how I feel," said Galtier.
Mbappe had two attempts brilliantly denied by Steve Mandanda -- a fine chip by the France forward in the 26th minute and a powerful shot from inside the area five minutes from the break.
Rennes, instead, made the most of their chances.
On the stroke of halftime, Toko Ekambi collected a superb long pass from Benjamin Bourigeaud and fired home from just inside the box, making up for a couple of earlier bad choices.
Rennes doubled their advantage with their second shot on target, three minutes into the second half, as Kalimuendo latched on to a cross from Lesley Ugochukwu to beat Gianluigi Donnarumma.
Forward Hugo Ekitike replaced midfielder Fabian Ruiz while midfielder Renato Sanches came on for defender Juan Bernat before the hour, but it was Rennes who came closest to scoring again through Toko Ekambi.
Later on Sunday, Alexis Sanchez netted a double to give OM all three points at Reims, who had gone unbeaten in Ligue 1 for six months.
Reims, who had opened the scoring through Folarin Balogun, are ninth on 43 points.
Leverkusen stun Bayern Munich
Bayer Leverkusen's Exequiel Palacios scored two second-half penalties to complete a 2-1 comeback victory over visitors Bayern Munich on Sunday and deny them the Bundesliga lead.
Bayern were nowhere to be seen at the start with the hosts unleashing a flurry of shots towards Yann Sommer's goal in the opening 15 minutes.
Their overall performance going into the one-week break for international matches and ahead of the April 1 Der Klassiker against leaders Borussia Dortmund was not what coach Julian Nagelsmann wanted to see.
"We did not deserve the first-half lead. We did not have the activity we had with the ball in the past weeks," said Nagelsmann.
"The penalties were correct. It all took too long for us today and we deserved to lose because were the worse team."
Bayern did, however, score against the run of play and with their first shot of the game when Joshua Kimmich's effort was deflected in after 22 minutes.
Things, however, took a turn for the worse for Bayern after the break with sloppy defending earning the hosts two penalties.
Palacios draw them level with a well-taken 55th minute spot kick and then earned another, this time for a foul by Dayot Upamecano.
The Argentine stepped up again to beat Sommer for a second time and complete the comeback for Xabi Alonso's team in the 73rd.
They hung on to victory despite late pressure from the Bavarians and chances from Kinglsey Coman and Matthijs de Ligt.
Bayern, who face Manchester City in the Champions League quarter-finals next month and are also through to the German Cup last eight, remain in second place on 52 points, one behind leaders Dortmund, who crushed Cologne 6-1 on Saturday.
Leverkusen climbed up to eighth on 37.
"It is clear against Dortmund we have to win, to firstly take over the lead and then hopefully bring the title to Bayern," Nagelsmann said.
"If we don't win it or lose then with the form that Dortmund currently have it will be difficult."
Runaway league leaders Napoli crush Torino
Serie A leaders Napoli thrashed Torino 4-0 away with a double from Victor Osimhen and goals from Khvicha Kvaratskhelia and Tanguy Ndombele on Sunday to move closer to the title.
The Naples side have a 21-point lead over second-placed Inter Milan, who host Juventus later on Sunday.
"The players showed great hunger," coach Luciano Spalletti said. "Once again I went to talk to the lads before the game afraid that there might be a bit of complacency but once again they showed me they are cut from a different cloth.
"As the Naples saying goes: he who is hungry doesn't sleep."
Napoli took the lead after nine minutes when Piotr Zielinski's corner found Osimhen in the centre of the box and he headed into the bottom left corner.
Kvaratskhelia doubled the lead in the 35th minute with a penalty after being fouled by Karol Linetty.
Osimhen scored his second and reached a league-leading 21 goals this season six minutes into the second half with another header following Mathias Olivera's cross.
"It is good to have this win, I want to congratulate the team and we must keep going like this," Osimhen said.
"We are happy that we are on the right track to deliver the fans this prestigious title and hopefully something more."
Substitute Ndombele made it 4-0 with his first Serie A goal in the 68th when Kvaratskhelia set him up in the centre of the box and the France international slotted home.
Napoli next host fourth-placed AC Milan while mid-table Torino visit Sassuolo after the international break.
Juventus entertain slim Champions League hopes with win at Inter
Juventus maintained their slim hopes of making it to next season's Champions League when Filip Kostic's goal earned them a 1-0 win at Inter Milan in Serie A on Sunday.
Kostic struck midway through the opening half to put Juve, who in January were deducted 15 points by an Italian soccer court investigating their transfer dealings, on 41 points after 27 games.
They trail fourth-placed AC Milan, who occupy the last Champions League qualifying spot, by six points after the defending champions lost 3-1 at Udinese on Saturday.
Inter are third on 50 points, 21 behind runaway leaders Napoli and two adrift of Lazio, who moved up to second thanks to their 1-0 win against AS Roma.
At the San Siro, Nicolo Barella had a couple of chances denied by Wojciech Szczesny as Inter dominated the early stages, five days after reaching the Champions League quarter-finals at the expense of Porto on Tuesday.
But Juve went ahead on 23 minutes when Kostic fired home with a low crossed shot after being set up by Adrien Rabiot -- a goal that was validated after a lengthy review following a suspected handball by the France midfielder.
Some good defending by Matteo Darmian on Dusan Vlahovic kept Inter in the game early in the second half but the hosts lacked a cutting edge up front and ended up with their third defeat in their last four Serie A games.
Lazio battle past 10-man AS Roma in derby
Lazio needed a second-half goal by Matteo Zaccagni to snatch a 1-0 victory over 10-man AS Roma in their bad-tempered Serie A derby on Sunday and climb into second place, leaving their opponents in fifth.
Roma's Roger Ibanez was sent off with a second booking in the 32nd minute and there were more red cards, one for each team's coaching staff, after a dispute on the sideline a little later.
Maurizio Sarri's men, who also won the derby in the first half of the season, made the advantage count in the 65th minute with Zaccagni slipping through the defence and curling in a low shot.
They briefly thought their lead was short-lived when Lazio's Nicolo Casale put the ball in his own net two minutes later but it did not count following a VAR review.
Roma tried to find an equaliser but despite having possession they lacked the final pass and the match ended with Roma's Bryan Cristante and Lazio's Adam Marusic also getting red cards after the final whistle following a brief scuffle.
Lazio are second on 52 points, behind runaway leaders Napoli, with Roma in fifth on 47.