FreeWheel 宋一玮 - FreeWheel在微服务架构下的前端改造实践

formulassudanese

2017/12/18 发布于 技术 分类

ArchSummit全球架构师峰会是InfoQ中国团队推出的面向高端技术管理者、架构师的技术大会,参会者中超过50%拥有8年以上的工作经验。 ArchSummit秉承“实践第一、案例为主”的原则,展示新技术在行业应用中的最新实践,技术在企业转型中的加速作用,帮助企业技术管理者、CTO、架构师做好技术选型、技术团队组建与管理,并确立技术对于产品和业务的关键作用。

文字内容
1. FreeWheel在微服务架构下的 前端改造实践   宋一玮   FreeWheel基础架构部主任工程师  
3. 宋一玮   FreeWheel基础架构部主任工程师   毕业于北京理工大学,曾供职于IBM、Amazon以及一家O2O创业公司,现任 FreeWheel基础架构部门主任工程师,负责FreeWheel自有前端框架SparkUI的 设计研发和推广。   从最早的ASP、JSF、Flex、Dojo,一直到移动端、Angular,以及现在 FreeWheel使用的React.js,从事前端开发已有10年。  
4. •  适用于微服务体系的前端SPA架构   •  自研前端框架SparkUI   •  新旧代码并存的渐进改造  
5. FreeWheel简介  
6. 适用于微服务体系的前端SPA架构   FreeWheel前端应用现状   •  持续开发迭代了10年多的RoR  Web 应用   •  20多个产品模块,1200+页面   •  60余万行代码,其中包含近20万行 基于jQuery的传统JS代码   •  7周的发版周期   •  全栈开发工程师以及QA工程师   改造目标   •  前后端分离:后端微服务+前端SPA   •  产品与技术紧密结合,采用主流的前 端体验和技术栈   •  更加完整的前端UT和端到端自动化 测试覆盖   •  更加灵活的发版周期   •  全栈工程师  
7. 适用于微服务体系的前端SPA架构   Configuration Managemen !t Loggin !g Monito !r Server-Side Renderin !g Data Pus !h Data Preloa !d SPA A! SPA B! Static Asset Server! SPA C! API Gateway: Auth, Throttling, Routing, Permission ! Business Service X! Business Service Y! Business Service Z! Auth Service! (SSO)! Service Registry! Container Management!
8. 适用于微服务体系的前端SPA架构   SPA A! SPA B! SPA C! Module !1 Module !2 Module !3 Module !4 Module !5 Module !6 Module !7 Module !8 Reusable Components Library! Routing! Fetch! I18n! Permission! React + Unidirectional Data Flow + Data Model!
9. 前端SPA架构  -  前端技术栈   服务器! SSR服务器端渲染! 浏览器端JS! 请求数据! JS组件! 开发语⾔言! 打包⼯工具! UT! CSS! 原有前端架构! Rails + Unicorn + Nginx! Rails MVC + ERB/HAML! jQuery! jQueryUI! Bootstrap! Handlebars! Underscore! jQuery.ajax + RESTful + JSON! 基于jQuery定制开发! Ruby + ES5! Rails Assets Pipeline! Rspec! SCSS! 新前端架构! 基于Nginx+CDN的静态资源服务器! Node.js + React SSR! React.js! SparkUI! Redux! Immutable.js! React-router! Lodash! Fetch API + RESTful + JSON! 基于React定制开发! ES6/7 + JSX! Webpack + Babel + Gulp! Mocha + Chai + Sinon + Enzyme! CSS Modules + PostCSS!
10. 前端SPA架构  -  前端CI/CD   Src Repo! Gitlab! CI! Jenkins! CD! Jenkins! Frontend Generate Doc! Doc Site! Private NPM Library Library Src! Build! UT! Publish! NPM Package! Repo! Maintainer! Business Build! Module Frontend Frontend Src! Engineer! Deployable UT! Pack! Package! Artifact Repo! Auto Test! Promote! Deploy! Docker Docker Image! Build! Micro Service Build! Src! Backend Engineer! UT! Pack! Deployable Package! Docker Image Repo! Auto Test! Promote! Deploy! Docker Build! Docker Image! Nexus & Artifactory! Staging Production Env.! Env.! Promote! Promote!
11. 前端SPA架构  –  容器化   •  微服务容器化为前端开发测试提供良好的基础   •  开发:UI-in-Docker工具(docker-compose)   •  测试:DEP(Dynamic  Environment  Provisioning)平台  
12. •  适用于微服务体系的前端SPA架构   •  自研前端框架SparkUI   •  新旧代码并存的渐进改造  
13. 自研前端框架SparkUI介绍  –  面临挑战   商业2B应用比起传统2C应用主要有如下特征:   •  软件质量标准高   •  复杂的业务模型和逻辑   Reusability! 可复⽤用性! Testability! 可测试性! •  跨功能模块的关联和交互   前端! •  单一客户对需求的影响力强   Flexibility! 灵活性! Productivity! 开发效率!
14. 自研前端框架SparkUI介绍  –  面临挑战   •  复杂的业务模型和逻辑   •  复杂的UI交互   Page! ComponentA! SubComponentA1! SubComponentA2! Loading! ComponentB! SubComponentB1! SubComponentB2!
15. 自研前端框架SparkUI   Busines s  Framewor k  Lib s  Business  Modules   Webpack + Gulp! Business  Components   Library Components! React! Modula Framework! Redux! ImmutableJS! Utilities! *  Code  Name:  SparkU I 
16. 自研前端框架SparkUI   •  超过10万行框架及可复用组件代码,其中近4万为UT单元测试,UT覆盖 率达到99.82%   •  40个子package,其中包含超过50个各类用途的可重用React组件   •  已有若干业务模块基于SparkUI完成重构或开发新功能  
17. 自研前端框架SparkUI  –  可重用组件  
18. React可重用组件设计要点   •  1.  无状态组件(Stateless  Component)优于状态化组件(Stateful   Component)    
19. React可重用组件设计要点   •  2.  组合组件(Composing  Components)优于具有DSL(Domain   Specific  Language)属性的单一组件    
20. React可重用组件设计要点   •  3.  高阶组件(HOC,Higher-Order  Components)优于混合属性 (Mixins)    
21. 自研前端框架SparkUI  –  应用状态管理   优点! 缺点! React Only! Flux! Redux! •  不依赖其他框架! •  将state抽取为store, •  单⼀一store,single 并以action⽅方式改变 source of truth;! store,单向数据流 •  ⽣生态丰富! 从React中分离出来! •  需要将深层组件 •  ⼀一个应⽤用内存在多个 •  对于⼤大型应⽤用, 的state lift up,导 store,如果在store store与业务数据差 致顶层组件中的 之间建⽴立关联,将导 别较⼤大! state越来越复杂、 致store难于维护;! •  State tree节点间的 难以维护! •  waitFor接⼝口在实际 关联较难实现! 应⽤用中会带来较多问 •  流⾏行的处理Side 题! Effects的⽅方案都不够 直接!
22. 自研前端框架SparkUI  –  应用状态管理   Modula应用状态管理框架设计理念   •  Application  State  =  Initial  State  +  Deltas,其中  Delta  是由  Actions  触发的  [  借鉴Flux,   Elm  ]   •  Application  State  可以由一棵  Model  Tree  来描述,这棵树的每个节点都是一个可以描述有 效业务实体的  Model  [借鉴Redux,  Elm  ]   •  由一个给定的  Application  State  到另一个State的  Transition  可以由  Model  Tree  提供的   Reactions  所描述,  一次成功的  Action  到  Reaction  的匹配会将  Model  Tree  演变为下一个状 态  [  原创  ]   •  Side  Effect  是上述  state  transitions  的结果,  它包含了一个更新的model实例,以及0至多个   callback  functions  [  借鉴Elm  ]  
23. 自研前端框架SparkUI  –  应用状态管理  
24. 自研前端框架SparkUI  –  前端路由   •  曾封装并使用react-­‐router   •  遇到的问题:应用状态分散在react-­‐router的 state与Modula  Model(Redux  state)里,两 者经常有同步问题   •  解决思路:将路由相关的state也合并进 Modula  Model中   •  前端路由框架spark-­‐router   •  针对Model配置路由,Component根据Model 切换相应界面   •  Functional函数式配置,可测试性良好   •  支持类似react-­‐router  v4中的multi-­‐match功能   •  可与react-­‐router共存  
25. •  适用于微服务体系的前端SPA架构   •  自研前端框架SparkUI   •  新旧代码并存的渐进改造  
26. 新旧代码并存的渐进改造  
27. 新旧代码并存的渐进改造  
28. 新旧代码并存的渐进改造  –  混合工程结构   •  SPA前端代码的源码依旧放在Rails工程Module目录下   •  通过Webpack打包的bundle  JS/CSS也按照Module对资源文件的约定 (convention)放在 目录下   modules/my_module/app/assets/javascripts/my_module/compiled •  藉由Rails  Asset  Pipeline打包进Rails工程发布包进行统一部署     •  仍使用Rails页面模版作为入口  
29. 新旧代码并存的渐进改造  –  混合工程结构   •  Rails的后端(页面)路由委托给前端    
30. 新旧代码并存的渐进改造  –  独立组件库工程   •  将SparkUI剥离为独立纯前端工程;   •  利用Webpack打包并发布到公司Nexus上私有NPM  Repository里;   •  其他工程利用npm  install安装依赖。   版本管理! 开发效率! 源码权限! 跨⼯工程复⽤用! 原有混合⼯工程! 独⽴立⼯工程! 任何对SparkUI的迭代都会直接影响到业务模 业务模块代码可以更有计划地升级SparkUI版本,在 块! 此之前⽆无须反复回归测试! SparkUI是纯JS库,Rails⼯工程开发环境给 SparkUI开发带来⼀一定负担! 不同的发版节奏令SparkUI可以追逐更⾼高的代码质量, ⺫⽬目前其源代码已超10万⾏行,单元测试覆盖率⾼高达 99.82%! 任何业务模块开发⼈人员均可修改SparkUI代码, 独⽴立的代码库可以隐藏部分SparkUI的内部API或⼯工 带来潜在代码冲突! 具代码,防⽌止业务模块中滥⽤用! 任何Rails⼯工程之外的⼯工程在利⽤用SparkUI时都 作为标准NPM包复⽤用! 会⽐比较繁琐。!
31. 新旧代码并存的渐进改造  –  新老JS代码混用   •  在SparkUI中开发了一个AdapterComponent   •  统一封装基于jQuery的老JS接口,利用componentDidMount完成其初 始化   •  严格控制新老代码在运行时的边界  
32. 新旧代码并存的渐进改造  –  质量保证   ! Post ! Check! E2E ! Auto Test! Business ! Module UT! SparkUI Library UT! •  Capybara   •  Cucumber  +  Selenium   Cypress   •  JSDOM   Mocha  +  Chai  +  Sinon   Enzyme   Babel-istanbul   SparkUI  Test  Utility  
33. 新旧代码并存的渐进改造  –  灰度上线   •  为改写或重构的模块入口设置切换开关,On则使用新代码,Off则使用 老代码   •  统一的上线包,开关值设在CM中   •  提高测试覆盖率,做好回归测试   •  上线后密切关注监控   •  发现线上问题时一键rollback回老代码  
34. 产品迭代与技术演进的平衡   •  公司上下统一认识,认可技术演进带来的长期利益;   •  定立产品研发计划时为技术演进工作保留一定比例的资源;   •  设立专门团队专注架构演进、基础设施设计开发;   •  持续提高自动化测试覆盖率。  
35. 广告时间   •  SparkUI框架开源进行时!   •  项目及其代码已通过FreeWheel母公司Comcast审查流程   •  正式名称将采用“modulajs”,部分包将于近期开源在Github上   •  Comcast开源项目首页:https://github.com/Comcast     •  届时请大家多关注,多交流  
36. 总结   •  微服务体系下,如何设计实施基于SPA的前端架构   •  即将开源的SparkUI,是一套适用于商业SPA应用的前端框架   •  以渐进改造的方式,兼顾产品迭代和技术演进