Hamilton's lead in the Formula One standings was cut to 10 points after eight of 19 races, the Briton making a poor getaway from pole position and being beaten into the first corner by the determined German.
The victory was Rosberg's third of the season, to Hamilton's four, and left him on 159 points to his rival's 169.
Asked why he did not drive every race like that, Rosberg smiled: "I will try from now on," he told reporters. "It's an awesome feeling of course to win again here. The start made the race.
"It really worked out perfectly today," added the German, who turns 30 next weekend.
Any hopes of a chase to the end disappeared when Hamilton, who finished 3.8 seconds behind, collected a five-second penalty for crossing the white line as he left the pits on the 35th of the 71 laps.
The double world champion recognised that he was never close enough even without the penalty.
"Nico did a fantastic job today. He was quicker during the race, I had a bad start which lost me ground," said Hamilton in podium interviews conducted by former F1 racer Gerhard Berger. "I was pushing as hard as I could."
A small consolation for Hamilton was the fact that he led for three laps while Rosberg pitted, allowing him to equal triple champion Jackie Stewart's 45-year-old record of leading 17 successive races.
Brazilian Felipe Massa finished a distant third for Mercedes-powered Williams after holding off Ferrari's Sebastian Vettel, who lost crucial seconds on his one pitstop when the right rear wheel gun jammed.
"I just managed to keep the line and not make any mistake and just use a little bit of experience," said Massa, who started on pole last year, after his 40th career podium.
Vettel's team mate Kimi Raikkonen and McLaren's Fernando Alonso collided and crashed into the barriers after the second corner, bringing out the safety car for five laps.
The McLaren ended up on top of the Ferrari, fortunately without hitting Raikkonen's head or hands, and perched on the barriers.
Stewards investigated after the race and decided to take no further action against either driver.
SCARY MOMENT
Alonso, who had started on the back row after collecting a 25-place drop following engine and gearbox changes, said the collision with his former Ferrari team mate was a scary moment.
"Kimi had a lot of wheel spin out of turn two. We were overtaking him and he lost the car on the left. I was on the left. I could not see anything. I looked in the mirror and saw a car under my car," he said.
The Spaniard waited for Raikkonen to get out of the car before they walked away together. Never one to waste words, the Finn described the incident as 'not ideal'.
Williams's Valtteri Bottas finished fifth, ahead of 2015 Le Mans 24 Hours winner Nico Hulkenberg in a Force India and Venezuelan Pastor Maldonado seventh for Lotus.
Max Verstappen, the 17-year-old Dutch rookie, was eighth for Toro Rosso after struggling to control his car on worn tyres at the end and Mexican Sergio Perez made it a double points finish for Force India.
Red Bull's Daniel Ricciardo grabbed a consolation point for the unhappy hosts with 10th place.
Only 14 of the 20 cars finished, with both Honda-powered McLarens out of action after just 10 laps.