Share this
Legacy system replacement - strangling a big ball of mud with microservices
by Kosta Hahladakis on 28 April 2016
In my role as an Equinox IT Senior Consultant specialising in solution architecture, I am often asked by clients to assist in planning IT architecture and technology roadmaps. In a recent assignment I was asked to work with a team from Equinox IT to help a client modernise their core business system. In this article, I cover the work that we performed to migrate the system onto a new platform while minimising business disruption and project expenditure.
Client situation
The client’s core business system had evolved over time with many changes and new features to the point where it had become large, complex and unwieldy for the developers to maintain. The architecture had grown into a spider’s web of tightly coupled interconnected components and services. The application platform was littered with deprecated technologies and unsupported 3rd party libraries. Myself and the others from the Equinox IT team were tasked with finding a way to modernise and simplify the system so that it could better support the client’s current and future business needs.
Setting the legacy system migration strategy
Firstly, we set about establishing a strategy for modernising a large and complex system that would be workable with the client. The client did not have the appetite for a large scale rewrite or replacement project. In this situation, we decided that a Strangler strategy (like a vine plant strangling, killing and replacing it’s host tree over time) would work best. The existing system would be gradually migrated onto a new technology stack by replacing small pieces of it at a time. The core system would continue to operate while we integrated the new components alongside it. In this way, we could approach modernisation almost as a maintenance activity rather than a major programme initiative.
One of the challenges in applying the Strangler strategy is finding hooks into the current system where functionality and data could be partitioned and new solutions injected. Luckily for us, the existing system was based on a web services architecture and this provided obvious demarcation points. We would begin the migration of the legacy system at the services layer, rewriting various services as we went along and integrating them back into the larger system.
Designing the new services model
To define the scope and shape of the new services we would be developing we decided to follow a Domain Driven Design, by examining the business context and organising the services layer accordingly. We didn’t just want to do a straight out one to one replacement of the existing services as the interfaces were already very tightly coupled to the underlying platform and leaked too much implementation details.
With each service to be replaced we undertook an analysis of the related business domain.The analysis involved understanding and capturing the key business concepts, and as DDD advocates, establish a common terminology that would permeate from the requirements through to the code. Services were identified by breaking down the business domain into discrete areas of responsibility and organising these into the sub domains and bounded contexts of our analysis models.
Implementing microservices
When we set the future state architecture of the new application platform we decided upon adopting a microservices architecture. It was difficult to maintain the existing system and we didn’t want to repeat the mistakes of the past. So we put a lot of effort into ensuring that new components were developed as small, autonomous services. This aligned nicely with the Strangler migration strategy we were following allowing us to tackle updating the large system one piece at a time.
The services we developed were small and focused. Each one operated as an independent unit supporting a specific business context and managing all related data. They exposed a REST based API that had a clear interface and was simple to integrate with. Each service instance was self-hosted, running under its own embedded http server and did not rely upon any external dependencies or configurations. This made them truly portable and allowed us to treat them as the Lego bricks to assemble the foundations of the new system.
Result
Over time we made great progress in modernising the client’s legacy system. Approaching migration in an incremental manner meant we could deliver new services early and have working software in operation, and thus avoided undertaking an expensive and risky replacement project. Adopting a Domain Driven Design and Microservices architecture has set a solid foundation for modernising the legacy system. This is only the beginning of the journey but already there have been some great successes and clear way forward for the future.
You may also be interested in my recent article Enhancing continuous delivery with blue-green deployment
Kosta Hahladakis is a Senior Consultant specialising in solution architecture, based in Equinox IT’s Wellington, New Zealand office.
Share this
- Agile Development (153)
- Software Development (126)
- Agile (76)
- Scrum (66)
- Application Lifecycle Management (50)
- Capability Development (47)
- Business Analysis (46)
- DevOps (43)
- IT Professional (42)
- Equinox IT News (41)
- Agile Transformation (38)
- IT Consulting (38)
- Knowledge Sharing (36)
- Lean Software Development (35)
- Requirements (35)
- Strategic Planning (35)
- Solution Architecture (34)
- Digital Disruption (32)
- IT Project (31)
- International Leaders (31)
- Digital Transformation (26)
- Project Management (26)
- Cloud (25)
- Azure DevOps (23)
- Coaching (23)
- IT Governance (23)
- System Performance (23)
- Change Management (20)
- Innovation (20)
- MIT Sloan CISR (15)
- Client Briefing Events (13)
- Architecture (12)
- Working from Home (12)
- IT Services (10)
- Data Visualisation (9)
- Kanban (9)
- People (9)
- Business Architecture (8)
- Communities of Practice (8)
- Continuous Integration (7)
- Business Case (4)
- Enterprise Analysis (4)
- Angular UIs (3)
- Business Rules (3)
- GitHub (3)
- Java Development (3)
- Lean Startup (3)
- Satir Change Model (3)
- API (2)
- Automation (2)
- Scaling (2)
- Security (2)
- Toggles (2)
- .Net Core (1)
- AI (1)
- Diversity (1)
- Testing (1)
- ✨ (1)
- August 2024 (1)
- February 2024 (3)
- January 2024 (1)
- September 2023 (2)
- July 2023 (3)
- August 2022 (4)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (1)
- March 2021 (1)
- February 2021 (2)
- November 2020 (2)
- September 2020 (1)
- July 2020 (1)
- June 2020 (3)
- May 2020 (3)
- April 2020 (2)
- March 2020 (8)
- February 2020 (1)
- November 2019 (1)
- August 2019 (1)
- July 2019 (2)
- June 2019 (2)
- April 2019 (3)
- March 2019 (2)
- February 2019 (1)
- December 2018 (3)
- November 2018 (3)
- October 2018 (3)
- September 2018 (1)
- August 2018 (4)
- July 2018 (5)
- June 2018 (1)
- May 2018 (1)
- April 2018 (5)
- March 2018 (3)
- February 2018 (2)
- January 2018 (2)
- December 2017 (2)
- November 2017 (3)
- October 2017 (4)
- September 2017 (5)
- August 2017 (3)
- July 2017 (3)
- June 2017 (1)
- May 2017 (1)
- March 2017 (1)
- February 2017 (3)
- January 2017 (1)
- November 2016 (1)
- October 2016 (6)
- September 2016 (1)
- August 2016 (5)
- July 2016 (3)
- June 2016 (4)
- May 2016 (7)
- April 2016 (13)
- March 2016 (8)
- February 2016 (8)
- January 2016 (7)
- December 2015 (9)
- November 2015 (12)
- October 2015 (4)
- September 2015 (2)
- August 2015 (3)
- July 2015 (8)
- June 2015 (7)
- April 2015 (2)
- March 2015 (3)
- February 2015 (2)
- December 2014 (4)
- September 2014 (2)
- July 2014 (1)
- June 2014 (2)
- May 2014 (9)
- April 2014 (1)
- March 2014 (2)
- February 2014 (2)
- December 2013 (1)
- November 2013 (2)
- October 2013 (3)
- September 2013 (2)
- August 2013 (6)
- July 2013 (2)
- June 2013 (1)
- May 2013 (4)
- April 2013 (5)
- March 2013 (2)
- February 2013 (2)
- January 2013 (2)
- December 2012 (1)
- November 2012 (1)
- October 2012 (2)
- September 2012 (3)
- August 2012 (3)
- July 2012 (3)
- June 2012 (1)
- May 2012 (1)
- April 2012 (1)
- February 2012 (1)
- December 2011 (4)
- November 2011 (2)
- October 2011 (2)
- September 2011 (4)
- August 2011 (2)
- July 2011 (3)
- June 2011 (4)
- May 2011 (2)
- April 2011 (2)
- March 2011 (3)
- February 2011 (1)
- January 2011 (4)
- December 2010 (2)
- November 2010 (3)
- October 2010 (1)
- September 2010 (1)
- May 2010 (1)
- February 2010 (1)
- July 2009 (1)
- April 2009 (1)
- October 2008 (1)