Migrating from Monolith to Microfrontends
Yaprak Ayazoğlu
ConfrontJS 2018
@yaprakaya
About me...
Yaprak Ayazoğlu
Freelance Frontend Engineer
Google Developer Expert in Web Tecnologies
@yaprakaya
- Netherlands in the past 4 years
- M.S. Computer Science
- B.S. in Electrical and Electronics Eng.
- 1 Solar powered and Hydrogen Powered car
- Mentoring @LoncaWorks
@yaprakaya
@yaprakaya
@yaprakaya
bol.com
@yaprakaya
What am I doing @bol.com?
@yaprakaya
Change...
Webshop ->Sellers
@yaprakaya
When I started @bol.com
@yaprakaya
Architecture
- Monolith
- Java in the backend
- A mixture of Angular 1.x, Backbone, Handlebars in the frontend
@yaprakaya
Domains in Seller Dashboards
@yaprakaya
@yaprakaya
Monolith
Seller Dashboards
Returns
Orders
My Assortiment
...
Downstreams
Pain points
- Deployment
- Code reuse
- Inertia (hard to adapt and implement new ideas)
- Maintenance
- Owneship
@yaprakaya
Time to change...
@yaprakaya
Expectations
- Teams that can work independent of each other
- Publishing code flawless and being able to publish frequently
- Able to adapt and implement innovations
- Using new technologies
- Migrate without affecting the end users
@yaprakaya
Domains
- /orders
- /offers
- /home
- /performance
- /assortment
- /returns
- ... vs.
@yaprakaya
Before...
@yaprakaya
Monolith
Seller Dashboards
Returns
Orders
My Assortiment
...
Downstreams
After Return Domain Detached
@yaprakaya
Monolith
Seller Dashboards
Returns
Orders
My Assortiment
...
Downstreams
FE
BE
@yaprakaya
BFF (Backend for frontend)
Backend for Frontend is a shim to help organize microservice architectures and coordinate functionality across a diverse, wide system. A BFF is a layer between the downstream services and UI.
Microfrontend
A composition of techniques, strategies and recipes for building a modern web app with multiple teams using different JavaScript frameworks.
@yaprakaya
Examples of Micro Frontend
- Orders
- Returns
- Delivery services
- Warehouse management
@yaprakaya
@yaprakaya
Monolith
Seller Dashboards
Returns
Orders
My Assortiment
...
Downstreams
FE
BE
FE
BE
...
Features
- It does not own data
- including session
- Independent of each other
- Reusable in different portals
- Live in different urls, different servers, different machines
@yaprakaya
Single Sign On
- Session information
- First service that detached from seller dashboard
- The service without UI
- Key microservice that makes the system look like one complete system
@yaprakaya
Menu
@yaprakaya
As we speak...
- 8 different teams who works in 6 different departments
- More than 20 micro frontend
- Services that are deployed for several different user groups and different portals
@yaprakaya
Problems
- The same look and feel and user experience
- Shared libraries
- SSO
- Problems in hardware level
@yaprakaya
Was it a success in first take?
@yaprakaya
The first microfrontend experiment
- Supplier portal
- Angular Module for each domain
- A SPA that is glued to each other on the browser
@yaprakaya
Supplier Portal
Application
1
Application
2
Application
3
@yaprakaya
SPA structure
<html>
<head>
…
<script src=“/wrapper/bundle.js”></script>
<script src=“/application-1/bundle.js”></script>
<script src=“/application-2/bundle.js”></script>
<script src=“/application-3/bundle.js”></script>
…
</head>
…
</html>
@yaprakaya
Downs
- Hard to maintain
- Separate repositories become dependent to each other on run time
- 3rd party library updates affected whole system
@yaprakaya
Ups
- Performance
First of all...
- Supplier portal is still in use
Modern Technologies
@yaprakaya
@yaprakaya
Typescript
- Able to define types
- Able to define interface for REST communication
- Able to define types for streams (Observables)
- Editor support
@yaprakaya
@yaprakaya
@Injectable()
export class PackingListService {
private packingListUrl = 'url/to/packing-list';
constructor(public http: HttpClient) { }
public getPackingList(listId: string):
Observable<SendStockItem[]> {
return this.http
.get(`${this.packingListUrl}?list-id=${listId}`)
.map((json: any) => {
const packingList = PackingListDto.fromJson(json);
return packingList.lines;
});
}
}
@yaprakaya
import { SendStockItem } from './send-stock-item';
export class PackingListDto {
id: string;
retailerId: string;
sendStockItems: SendStockItem[];
static fromJson(json: any): PackingListDto {
return PackingListDtoSerializer.fromJson(json);
}
}
class PackingListDtoSerializer {
static fromJson(json: any): PackingListDto {
const packingListDto = new PackingListDto();
packingListDto.id = json.id;
packingListDto.retailerId = json.retailerId;
packingListDto.sendStockItems = json.lines.map((line) => {
return SendStockItem.fromJson(line);
});
return packingListDto;
}
}
@yaprakaya
import { FormGroup } from '@angular/forms';
export class SendStockItem {
id: string;
selectedQuantityFormItem?: FormGroup;
static fromJson(json: any): SendStockItem {
return SendStockItemSerializer.fromJson(json);
}
}
class SendStockItemSerializer {
static fromJson(json: any): SendStockItem {
const sendStockItem = new SendStockItem();
sendStockItem.id = json.id;
return sendStockItem;
}
}
Angular
- Component based
- Form and validation support
- Localization support
- Dependency injection in unit tests
- CLI
- Ecosystem
- Framework
@yaprakaya
Shared libraries
@yaprakaya
Styling
@yaprakaya
Angular Component
Library
@yaprakaya
Framework agnostic component library and style guide
@yaprakaya
Wrap up
- Autonomous and independent teams
- Ownership
- Easy to adapt new ideas
- New technologies
@yaprakaya
Questions?
@yaprakaya
Thanks
@yaprakaya
https://frontconnect.nl/
info@frontconnect.nl
https://slides.com/yaprakayazoglu/monolith-to-microfrontend/
Migrating from Monolith to Microfrontends
By Yaprak Ayazoglu
Migrating from Monolith to Microfrontends
Recently, bol.com seller dashboards, which used to be a monolith, decomposed into microfrontends defined by a business domain concept. We experimented on different ways of microfrontend techniques and picked one. Since each application can run independently on their own minimal setup, this gave the teams great flexibility, autonomy and yet improved the ownership of the individuals. Despite some drawbacks, such as UX consistency, performance issues, etc. this technique definitely proved itself within bol.com. In this case study, you will hear our gains from using microfrontends.
- 3,907