Micro-‑service ¡Developer ¡Experience ¡ ¡ Node ¡Interac6ve ¡2015 ¡ Peter ¡Elger ¡ @pelger ¡ ¡
Micro-‑services ¡ • NOT ¡a ¡new ¡concept ¡-‑ ¡See ¡‘unix’ ¡ J ¡ • Small, ¡focused, ¡decoupled ¡components ¡ • Easily ¡understood ¡ • Rapid ¡itera6ve ¡deployment ¡ • Architectural ¡style ¡par6cularly ¡suited ¡to ¡ node.js ¡
That’s ¡Awesome! ¡But… ¡
Shell ¡Hell? ¡
Tradeoffs ¡ • Micro-‑services ¡ – Smaller ¡units ¡of ¡code ¡ – Easier ¡to ¡reason ¡about ¡in ¡isola6on ¡ – Easier ¡to ¡test ¡in ¡isola6on ¡ – Rapid ¡incremental ¡deployment ¡ ¡ ¡ • Monoliths ¡ – Large ¡amount ¡of ¡code ¡ – Much ¡more ¡complex ¡to ¡reason ¡about ¡ – More ¡difficult ¡to ¡test ¡in ¡isola6on ¡ – Highly ¡coupled ¡slow, ¡risky ¡deployments ¡
Tradeoffs ¡ • Micro-‑services ¡ – Harder ¡to ¡run ¡a ¡system ¡in ¡development ¡ • Mul6ple ¡processes ¡ – Trickier ¡to ¡apply ¡debuggers ¡and ¡tooling ¡ ¡ • Monoliths ¡ – Easier ¡to ¡run ¡a ¡system ¡in ¡development ¡ ¡ • single ¡process ¡ – Easier ¡to ¡apply ¡debuggers ¡and ¡tooling ¡
Op6ons? ¡
Just ¡develop ¡services ¡in ¡isola6on? ¡ • Developing ¡single ¡services ¡is ¡simple ¡ – Easy ¡to ¡unit ¡test ¡ – 100% ¡line ¡coverage ¡is ¡usually ¡achievable ¡ • Then ¡integrate ¡on ¡staging ¡or ¡produc6on ¡only. ¡ ¡
Script ¡it ¡ • Develop ¡custom ¡shell ¡scripts ¡to ¡start ¡and ¡stop ¡ the ¡system ¡under ¡development ¡ • This ¡can ¡work ¡well ¡ – Used ¡this ¡on ¡several ¡projects ¡ • However ¡there ¡is ¡addi6onal ¡overhead ¡in ¡ keeping ¡scripts ¡current ¡ • Also ¡need ¡to ¡ensure ¡that ¡developer ¡machines ¡ have ¡the ¡same ¡infrastructure ¡
Use ¡containers? ¡ • Tools ¡like ¡docker-‑compose ¡allow ¡us ¡to ¡start ¡and ¡ stop ¡mul6ple ¡containers ¡(i.e. ¡services) ¡in ¡one ¡go ¡ • Also ¡allow ¡us ¡to ¡define ¡the ¡infrastructure ¡ requirements ¡cleanly ¡ – However ¡the ¡container ¡build ¡cycle ¡can ¡be ¡slow ¡and ¡ frustra6ng ¡ – Environmental ¡differences ¡between ¡development ¡and ¡ produc6on ¡can ¡cause ¡fric6on ¡ – Debugging ¡using ¡containers ¡can ¡be ¡a ¡challenge ¡to ¡ setup ¡
Three ¡strikes ¡and ¡automate… ¡ h_ps://github.com/apparatus/fuge ¡
Goals ¡ • Provide ¡a ¡tool ¡that ¡generates ¡micro-‑service ¡ scaffolding ¡ ¡ • Provide ¡a ¡run ¡6me ¡environment ¡for ¡micro-‑ service ¡development ¡that ¡supports ¡ – Rapid ¡development ¡ – Reduces ¡container ¡fric6on ¡ – Eases ¡debugging ¡
Stack ¡
Stack ¡
Code ¡6me!! ¡ fuge generate system
System ¡Genera6on ¡
System ¡Genera6on ¡
System ¡Genera6on ¡ • Uses ¡Dockerfile ¡and ¡docker-‑compose ¡syntax ¡ • Fuge ¡uses ¡these ¡files ¡to ¡run ¡local ¡processes ¡ and ¡containers ¡ ¡
System ¡execu6on ¡ Fuge shell compose-dev.yml
Add ¡a ¡service ¡ ¡ ¡ fuge generate service
Add ¡a ¡service ¡
Add ¡Infrastructure ¡ • docker ¡pull ¡mongo ¡ • Update ¡compose-‑dev.yml ¡ • Add ¡some ¡code ¡to ¡service1 ¡ • restart ¡
Add ¡Infrastructure ¡
Proxy ¡ • We ¡are ¡now ¡recording ¡data ¡into ¡MongoDB ¡ running ¡in ¡a ¡container ¡from ¡a ¡process ¡ ¡ • Fuge ¡will ¡proxy ¡connec6ons ¡between ¡processes ¡ and ¡containers ¡ – Without ¡our ¡code ¡needing ¡to ¡be ¡configured ¡ ¡ • Mixing ¡containers ¡and ¡processes ¡with ¡reduced ¡ fric6on ¡
Logging ¡ • For ¡convenience ¡ • Fuge ¡creates ¡per ¡service ¡logs ¡at ¡ – ./fuge/log/<servicename>.log ¡ ¡ • Fuge ¡grep ¡ – Search ¡by ¡service ¡or ¡over ¡all ¡
Debugging ¡ • Experimental ¡ • Fuge ¡provides ¡a ¡debug ¡command ¡ – Currently ¡requires ¡node-‑debug ¡installed ¡ • A_ach ¡a ¡debugger ¡to ¡a ¡specific ¡service ¡
Retrofit ¡-‑ ¡Nodezoo ¡
Retrofit ¡-‑ ¡Nodezoo ¡ • Exis6ng ¡system ¡ • Added ¡compose ¡yml ¡ – Broken ¡out ¡infrastructure ¡from ¡code ¡ • Docker-‑compose ¡runs: ¡ – Redis, ¡elas6csearch, ¡influx ¡and ¡beanstalkd ¡ ¡ • Fuge ¡runs: ¡ – Frontend ¡and ¡services ¡
Summary ¡ • Developing ¡micro-‑services ¡presents ¡its ¡own ¡ unique ¡challenges ¡ • Tooling ¡can ¡help! ¡ ¡
Contributors ¡
Thank ¡you! ¡ ¡ ¡ • h_ps://github.com/apparatus/fuge ¡ • npm ¡install ¡–g ¡fuge ¡ • @pelger ¡
Recommend
More recommend