Slide 1

Slide 1 text

Micro Frontends 23卒LT会 vol.2 さとふみ @fumist23

Slide 2

Slide 2 text

自己紹介 名前: 佐藤文哉(さとふみ) 大学:早稲田大学商学部3年 Twitter : @fumist23 株式会社Gaudiyという会社でインターンしています。

Slide 3

Slide 3 text

今日話すこと ● Micro Frontendsの基本概念 ○ MicroFrontendsとは ○ 特徴 ○ メリット ○ 使用している企業例 ● Micro Frontends同士の結合 ○ Build-Time integration ○ Run-Time integration ■ Client-Side Composition ■ Server-Side Composition ■ Edge-Side Composition

Slide 4

Slide 4 text

一応・・・ ※「それ違くない?」みたいなところがあったら遠慮なく教えてください🙏 ※自分は実務でMicro Frontendsを実践したことはなく、 あくまで調べたことベースで話すのでご了承ください🙏

Slide 5

Slide 5 text

最初に、 超ざっくり FEとBEにおける アーキテクチャをおさらい

Slide 6

Slide 6 text

Monolith frontend backend

Slide 7

Slide 7 text

Frontend & Backend frontend backend

Slide 8

Slide 8 text

Frontend & Backend frontend backend フロントエンドと バックエンドの 責務の分離

Slide 9

Slide 9 text

Frontend Monolith & Microservices frontend micro service micro service micro service micro service

Slide 10

Slide 10 text

Frontend Monolith & Microservices frontend micro service micro service micro service micro service 各サービスごとに 責務を独立するように なった

Slide 11

Slide 11 text

FE Monolith & BFF & Microservices frontend micro service micro service micro service micro service BFF (Aggregation Layer)

Slide 12

Slide 12 text

FE Monolith & BFF & Microservices frontend micro service micro service micro service micro service BFF (Aggregation Layer) 各マイクロサービス との通信を集約する層

Slide 13

Slide 13 text

FE Monolith & BFF & Microservices frontend micro service micro service micro service micro service BFF (Aggregation Layer) BFFのみと通信し、 UIの責務のみ 各マイクロサービス との通信を集約する層

Slide 14

Slide 14 text

いい感じやん👍

Slide 15

Slide 15 text

と思いつつ・・・

Slide 16

Slide 16 text

frontend micro service micro service micro service micro service BFF (Aggregation Layer)

Slide 17

Slide 17 text

frontend micro service micro service micro service micro service BFF (Aggregation Layer) ここは monolithの ままで いいの??

Slide 18

Slide 18 text

frontend micro service micro service micro service micro service BFF (Aggregation Layer) ここは monolithの ままで いいの?? FEだけ 肥大化が 止まらなくない??

Slide 19

Slide 19 text

frontend micro service micro service micro service micro service BFF (Aggregation Layer) ここは monolithの ままで いいの?? FEだけ 肥大化が 止まらなくない?? 開発チームの間の 結合度高くない??

Slide 20

Slide 20 text

Micro Frontendsは??

Slide 21

Slide 21 text

ということで 本題へ󰝊

Slide 22

Slide 22 text

Micro Frontends & Microservices micro service micro service micro service micro service micro frontend micro frontend micro frontend micro frontend 各featureごとに 開発を行う。 フロントエンドの 垂直分割を可能 に。

Slide 23

Slide 23 text

Micro Frontendsとは? ‘An architectural style where independently deliverable frontend applications are composed into a greater whole’

Slide 24

Slide 24 text

Micro Frontendsとは? ‘An architectural style where independently deliverable frontend applications are composed into a greater whole’ 独立したそれぞれのフロントエンドアプリケーションを、 1つのアプリケーションに統合する アーキテクチャスタイル

Slide 25

Slide 25 text

Micro Frontendsとは? ‘An architectural style where independently deliverable frontend applications are composed into a greater whole’ 独立したそれぞれのフロントエンドアプリケーションを 1つのアプリケーションに統合する アーキテクチャスタイル そのまま やん

Slide 26

Slide 26 text

Micro Frontendsとは? ● ThoughtWorksのTechnology Radarで2016年末に紹介された。 ● マイクロサービスの思想をフロントエンドにも拡張したもの。 ● 独立したチームごとに1つのドメイン機能についてend-to-endで開発を行 い、より自律的でスケーラブルな開発組織を実現させる

Slide 27

Slide 27 text

● チームのスケーラビリティ向上 ● デプロイ容易性 ● ビルド時間の短縮 ● 特定の技術に固執しなくて良い。(React, Vue, Angular...) ● アプリケーションコードに対するキャッチアップコストの削減 Micro Frontendsの特徴・メリット

Slide 28

Slide 28 text

Micro Frontendsを使用している企業例 ・Airbnb ・DAZN ・spotify ・IKEA ...etc https://blog.bitsrc.io/state-of-micro-frontends-9c0c604ed13a

Slide 29

Slide 29 text

どうやって Micro Frontendsを実現するか?

Slide 30

Slide 30 text

それぞれ独立した フロントエンドアプリケーションを、 どうやって1つのアプリケーションに 結合させるか??

Slide 31

Slide 31 text

Micro Frontends同士の結合 ● Build-Time integration ● Run-Time integration

Slide 32

Slide 32 text

Micro Frontends同士の結合 ● Build-Time integration ● Run-Time integration

Slide 33

Slide 33 text

Build-Time integration ● npmライブラリと同じように、各コンポーネント(機能)をライブラ リとしてbuild時にinstallする。

Slide 34

Slide 34 text

Build-Time integration ● npmライブラリと同じように、各コンポーネント(機能)をライブラ リとしてbuild時にinstallする。 ○ メリット ■ サーバーのリソースを意識せずに、サーバーサイドで結合することを 可能にする

Slide 35

Slide 35 text

Build-Time integration ● npmライブラリと同じように、各コンポーネント(機能)をライブラ リとして取りこみbuild時にinstallする。 ○ メリット ■ サーバーのリソースを意識せずに、サーバーサイドで結合することを 可能にする ○ デメリット ■ コンポーネント同士の依存関係の結合度が高い ■ 重複コードや重複パッケージへの考慮の必要 ■ 最終的なバンドルサイズが大きくなる

Slide 36

Slide 36 text

Micro Frontends同士の結合 ● Build-Time integration ● Run-Time integration

Slide 37

Slide 37 text

Run-Time integration 以下の3つの方法が存在する。 ● Client-Side Composition ● Server-Side Composition ● Edge-Side Composition

Slide 38

Slide 38 text

Run-Time integration 以下の3つの方法が存在する。 ● Client-Side Composition ● Server-Side Composition ● Edge-Side Composition

Slide 39

Slide 39 text

Client-Side Composition ● その名の通り、client sideでランタイムに各Fragmentの結合を行う。 ○ Fragmentは、垂直分割されたチームによって開発されたドメイン要素・機能のこと。 ● Fragment毎に開発チームやデプロイが分割されている

Slide 40

Slide 40 text

Client-Side Composition client A client client B client C

Slide 41

Slide 41 text

Client-Side Composition 1つのページに複数のFragmentが存在する。 ・ページを統括するTeam Product 🔴 ・購入に関する責務を持つTeam Checkout 🔵 ・各商品のレコメンドを行うTeam Inspire 🟢 micro-frontends.orgで紹介されている例

Slide 42

Slide 42 text

Client-Side Composition ● Client-Side Compositionでよく使用される技術 ● iframe ● Web components ● single-spaなどのライブラリ ● Webpack5以降のModule Federation

Slide 43

Slide 43 text

Client-Side Composition ● Client-Side Compositionでよく使用される技術 ● iframe ● Web components ● single-spaなどのライブラリ ● WebpackのModule Federation この2つについて 説明します

Slide 44

Slide 44 text

Client-Side Composition ● Web Componentsを使用した例 Custom Elementの作成 Team Checkout 🔵 を例に

Slide 45

Slide 45 text

Client-Side Composition ● Web Componentsの使用 ・countのstateを保持し、表示する。 ・`blue:basket:changed`というイベント を受け取って再レンダリングする。 ・window.customElements.defineで customElementとして登録する。

Slide 46

Slide 46 text

Client-Side Composition ● Web Componentsの使用 ・親(ここでは🔴)から渡ってきたsku属性 によって価格を表示する。 ・this.dispatchEvent(new CustomEvent)で `blue:basket:changed`イベントを発火。

Slide 47

Slide 47 text

Client-Side Composition ● Web Componentsの使用 親コンポーネント🔴で別々で配置されているblue-basketとblue-buyは、 `blue:basket:changed`イベントを通してやりとりをする。 Team-Product🔴とTeam-Checkout🔵(Team-Inspire🟢)はそれぞれ独立している。

Slide 48

Slide 48 text

● ライブラリの使用 例として、single-spa(https://github.com/single-spa/single-spa) ・技術スタック関係なく、複数のSPAを1つにまとめるためのフレームワーク ・ルーティング機能や、各Micro Frontendのライフサイクルの管理を行ってくれる Client-Side Composition

Slide 49

Slide 49 text

Client-Side Composition ● メリット ○ シンプルなMicro Frontends ○ 学習コストがそれほど高くない ● デメリット ○ クライアントサイドでの結合であるため、パフォーマンスにおける懸念がある。 ○ サポートブラウザに依存する

Slide 50

Slide 50 text

Run-Time integration 以下の3つの方法が存在する。 ● Client-Side Composition ● Server-Side Composition ● Edge-Side Composition

Slide 51

Slide 51 text

Server-Side Composition その名の通り、サーバーサイドで各Fragmentを結合する。 client A client B client C server client

Slide 52

Slide 52 text

Server-Side Composition ● Layout Server & Fragment Server client Layout Server Fragment Server Fragment Server

Slide 53

Slide 53 text

Server-Side Composition ● Ara Framework  airbnb/hypernovaを使用した  Micro Frontendsを構築する  ためのモジュール群を提供

Slide 54

Slide 54 text

Ara Frameworkによる、 Server-Side Compositionの アーキテクチャ例。 Server-Side Composition

Slide 55

Slide 55 text

1. ユーザーがNova Proxyにリクエストを行う 2. Nova ProxyはWebsite Serverにリクエストを送る。 3. Website Serverは、Nova Directiveを用いて ページ上でMicro Frontensが表示される場所に placeholderを設置する。 4. Website Serverは作成したHTMLをNova Proxyに 5. Nova ProxyはHTMLをパースして、どのMicro Frontendsに対するリクエストを行うかを判断す る。

Slide 56

Slide 56 text

6. Nova Proxyは、必要なMicro Frontendのviewを取得するためにNova Clusterへのバッチリクエストを作成する。 7. Nova Clusterは、各Micro Frontendにバッチリクエストを作成する。 8. Nova Clusterはバッチリクエストを並列に送信する。

Slide 57

Slide 57 text

9. Micro Frontendsはviewのレンダリングに必要な要素を集める。必要に応じて Rest APIや GraphQLとの通信を行う。 10. Micro Frontendsは集められたデータからサーバーサイドレンダリング を行う。 11. Micro FrontendsはNova Clusterにレンダリングされたviewを返却する。

Slide 58

Slide 58 text

12. Nova Clusterは各Micro Frontendsからのレスポンスを集約し、Nova Proxyに返す 13. Nova Proxyはページ上のプレイスホルダーをSSRに成功したHTMLに置き換え、SSRに失敗した場 所ではプレイスホルダーを維持し、 clientでのfallback処理を可能にする。 14. Nova Proxyはユーザーにページを返す。 15. ブラウザ上でCSRも行われる。

Slide 59

Slide 59 text

● メリット ○ SSRを実現するため、SEO対策や初回ロードのパフォーマンスにおいて有 利。 ○ クライアントが通信する相手が限られ、通信の最適化が可能。 ● デメリット ○ 考慮に入れなければならない要素が多く、複雑性が高い。 ○ デファクトスタンダードな設計が存在しない。 Server-Side Composition

Slide 60

Slide 60 text

Run-Time integration 以下の3つの方法が存在する。 ● Client-Side Composition ● Server-Side Composition ● Edge-Side Composition

Slide 61

Slide 61 text

・エッジレイヤー(CDNなど)でコンテンツを結合する。 
 Edge-Side Composition client A client B client C edge client server

Slide 62

Slide 62 text

● メリット ○ 結合に関して、サーバーのリソースの用意が必要ない。 ○ Edge Sideで処理が行われ、レイテンシに関して有利。 ● デメリット ○ マネージドであるが故に、タイムアウトやレスポンスサイズに制限がある。 Edge-Side Composition

Slide 63

Slide 63 text

まとめ ● Micro Frontendsとは、独立したフロントエンドアプリケーションを1つのアプリケー ションに統合するアーキテクチャスタイルのこと。 ● 開発チームのスケーラビリティ向上・デプロイ容易性・技術スタックに囚われないフロ ントエンド開発などさまざまなメリットがある。 ● 結合パターンが複数存在し、用途によって多様なアーキテクチャが可能。

Slide 64

Slide 64 text

Micro Frontendsの課題やデメリットに対してはあまり深掘れなかったので、 今回紹介できなかったです🙏 反省

Slide 65

Slide 65 text

参考記事・本 ・Micro Frontends (https://micro-frontends.org/) ・Micro Frontends (https://martinfowler.com/articles/micro-frontends.html) ・フロントエンドエンジニアは Micro Frontends の夢を見るか (https://engineering.mercari.com/blog/entry/2018-12-06-162827/) ・Micro Frontends の理論と実践 -価値提供を高速化する真のマイクロサービスのあり方 (https://speakerdeck.com/nobuhikosawai/the-theory-and-practice-of-micro-frontends) ・Micro Frontends Architecture Patterns (https://zenn.dev/okmttdhr/books/8c977618755cb68ad2c0) ・Micro-Frontends: What, why, and how (https://levelup.gitconnected.com/micro-frontends-what-why-and-how-bf61f1f0a729) ・Micro frontend入門 (https://zenn.dev/silverbirder/books/2d4da5d033685752d1c7) ・The State of Micro Frontends (https://blog.bitsrc.io/state-of-micro-frontends-9c0c604ed13a)