Cannon was born in Kettering and attended Bishop Stopford School in the town. He is the son of Vince Cannon, who made 438 appearances for Northampton Saints, captained the side and is in the club's Hall of Fame. Despite this Cannon didn't play rugby until he was in secondary school. Cannon also played for local rugby club Kettering RFC, lining out for the team in the Midlands Division 2 East. From Kettering, he was signed to the Northampton Saints academy.
Cannon joined Northampton Saints academy for the 2007–08 season. He made his debut for the first team in the 2007–08 National Division One on 4 March 2008. He was still in the academy but an injury crisis meant that he started in the midweek game against Launceston, which Northampton won 72–7. Cannon was named on the bench against Pertemps Bees four days later, but did not come on. He made his second appearance for the side as a replacement against Exeter Chiefs on 22 March 2016 and started against Nottingham a week later on 29 March. Cannon made a total of three appearances for the Saints in his debut season as they were promoted to the Premiership.
In the 2007–08 season, Cannon's second year in the academy, he didn't feature for Northampton's first team after the club's return to the Premiership. He was an unused replacement in a 2008–09 EDF Energy Cup game against Bristol. In October 2007, Cannon was sent out on loan to get game time.
Cannon was loaned to Bedford Blues in the National League One for the 2008–09 season. He made his debut for the team on 1 November 2008 when he played the full 80 minutes against Cornish Pirates. Cannon made a total 17 appearances for the Blues during his loan, all but four of these coming as starts, as Bedford finished third in the division.
Cannon stayed with Northampton Saints for the 2009–10 season. He made his Premiership debut on 31 October 2009 against Leicester Tigers, starting the match and playing 55 minutes in a 29–15 loss. Cannon featured in two more games in the 2009–10 Premiership, coming on as a late replacement against Leeds Carnegie and starting against Bath. Saints finished second in the league table, but were beaten in the semi-final by Saracens. He also played three times in the 2009–10 LV Cup, which Saints ultimately won, and scored his first try in a Cup game against Ospreys. Cannon played in a total of six games for the first team over the course of the season. He left the club at the end of the season having made a total of nine first team appearances.
It was announced in April 2010 that Cannon had signed a two-year deal with Wasps. He joined the side ahead of the 2010–11 season. Cannon made his Wasps debut in a 2010–11 Premiership against Newcastle Falcons on 10 September 2010. He made his first ever appearance in the Heineken Cup as a replacement against Toulouse on 10 October 2010. Cannon made a total of 15 appearances in the Premiership in his first season with the side and played in four of Wasps' six games in the 2010–11 Heineken Cup. He also started four games in the 2010–11 LV Cup. Cannon didn't play in the 2010–11 Challenge Cup for the side, being an unused replacement in the team's only game in the competition, a 32–22 defeat to Harlequins in the quarter-finals. All together, he made 23 appearances in his debut season, all but five of these coming as starts.
Cannon didn't play as regularly for Wasps in his second season, missing a large part of the season through injury. His first appearance of the year came on 24 February 2012, when he played 80 minutes in a 2011–12 Premiership match against Sale Sharks in a 46–34 defeat. He played in a further four Premiership games, as Wasps finished in 11th place avoiding relegation by just one point. Cannon also made a single appearance in the 2011–12 Challenge Cup, starting in the quarter-final against Biarritz which Wasps lost 26–23. Despite his lack of game time over the course of the season, Cannon signed a contract extension with Wasps in March 2012.
With his return to fitness, Cannon played more regularly in the 2012–13 season. He made 12 appearances in the 2012–13 Premiership, with eight of these coming as starts, as Wasps finished 8th. Cannon played in four of Wasps' six pool stage games in the 2012–13 Challenge Cup and scored his first try for the club against Mogliano, but didn't feature in the quarter-final defeat to Leinster. In addition to the league and Challenge Cup, he also played in four games in the 2012–13 LV Cup. Cannon played a total of 22 games in his third season with the team, and on the back of these performances was awarded another contract extension.
Cannon played 12 times in the 2013–14 Premiership, starting four of these games. He also played in three games in the 2013–14 Challenge Cup and four in the 2013–14 LV Cup, starting all of these. At the end of the season, Wasps finished 7th in the Premiership, which put them into a play-off to qualify for the following season's Champions Cup. Cannon did not take part in the two-leg play-off against Stade Français, which Wasps won.
In the following season, Cannon continued to have a limited role in the first team, starting five of the team's 2014–15 Premiership games and coming on as a replacement in a further three. He started all four of the team's games in the 2014–15 LV Cup, and featured from the replacements bench in a 2014–15 Champions Cup game against Castres. Despite his lack of game time, Cannon signed another contract extension with Wasps for the 2015–16 season.
Cannon made his first appearance of the 2015–16 season in a Premiership game against Harlequins on 16 October 2015. In the middle of the season however, Cannon went on loan to London Scottish in the Championship. He made a single appearance for the side during his loan, starting against Rotherham Titans on 5 December 2015. Cannon returned to Wasps in the new year and featured from the bench against his former club Northampton Saints on 29 January 2016. Following this, he played in eight more Premiership fixtures, making a total of 10 appearances for Wasps for the season. After spending the 2016–17 preseason with Wasps, Cannon left the club in September 2016, having made 93 appearances for the first team.
Cannon joined Irish side Connacht in September 2016. He signed on a one-year deal with the club for the 2016–17 season and was included in the province's European squad.
Cannon has played rugby at under-age level for England. He played for the England under-18 team while he was a student at Bishop Stopford School and won a European Championship with the side in 2006. Cannon was part of the England under-20 squad that won a Grand Slam in the 2008 Under-20s Six Nations. Cannon made his debut for the under-20 side in the final game of the tournament against Ireland on the back of his performance for Northampton Saints in the National League One. He was not named in the English squad for the 2008 Junior World Cup however.
Cannon is also qualified to represent Ireland at international level.