前端微服务-面向web平台级应用的设计
从去年开始,前端领域就出现了一个‘微应用’的名词,说的是前端架构的一种设计思路,业内都把它和后端的微服务进行类比,当时忙于公司的项目。没有静下心来好好了解,现在项目结束,再加上最近看的几篇关于前端微服务的文章,(特别讨厌有些文章说的天花乱坠,引用各种高大上的名字,一篇通读下来什么也没有获得)回头一想,我们做的这个架构设计不就是 ‘微服务’吗?
首先说一下前端微服务。
我觉得这是一种架构设计,不是什么新技术,而是多种技术结合的产物,既然是架构设计那么它就得有使用场景,否则那是空谈,而它的使用场景则是面对平台级的产品解决方案,可以支撑许多web应用,各个应用之间相互独立解耦,又可以不断扩展,不仅易于老代码,老业务的维护,而且开发项目也是游刃有余的。对于开发人员来说,这样的架构设计也是独立的,完完全全可以负责单独的web应用,而不需要和别的团队交叉式协作,所以我觉得如果产品是平台级的,做的是解决方案的东西,长期支撑公司发展的,那它的一种设计思路不妨一试,但如果就是几个独立的web应用,比如说公司官网,后台系统,支付系统,这几个一点关联都没有的项目,没有必要来这样做,反而会增加项目本身的难度。
它的出现我觉得很大程度上是由于spa单页面应用的出现,组件化的出现,让一个完整的页面从几个标签的组合,到模块功能的组合,再到应用的组合,一步步过渡,最初一个页面由几个标签加点文字或者图片组成,主要用来向消费者输出信息,到后来ajax出现,局部刷新人机交互,页面成了按照功能模块来划分,再到现在单页面应用,直接按照应用来划分,每一个应用有自己的一套数据,交互,逻辑,业务等等,页面成了一个容器,或者说是一张幕布,它所做的就是有一个加载机制,更够很多好地处理各个应用的关系和数据通信,所以一步步走过来,有各大浏览器厂商对引擎的升级换代,有硬件的迭代,还有大量交互数据的出现,体验的升级等等因素,这些诉求让前端领域不再是展示内容那么简单,需要不断突破自我,架构设计应运而生。
微服务里面容器或者称为平台该怎么搭建,怎么加载不同的web应用,应用之间如何数据通信,应用怎么扩展定义,那些平台级核心方法如何处理等等,带着这些问题,结合我司的项目谈谈我的看法及设计思路。
首先有一个最基本的容器
由于项目的复杂特点和背景,我们使用的是jq,别觉得low,用小米加步枪能打败敌人更是说明策略用得好,容器呢则是iframe,应用之间数据通信呢,则是挂载了window这个大对象。
加载机制
那么如何去加载不同的应用呢,有的做法是将所有的应用js文件在首次全加入进来,每一个应用都是一个独立的大对象,根据地址栏的url组成,获得其中的hash名,这个名字可以是应用的名字,去实例化特定的应用。
或者学习一下vue-router,利用hash改名字,页面不刷新的特点,去按需加载特定的应用js文件。
在或者直接以整个web组件的形式,通过document.append的方式直接插入进来。
我司采用的是第二种,这样的方式可控,加载机制可以自定义处理。毕加索的名言,‘优秀的艺术家抄袭创意,杰出的艺术家剽窃灵感’。
然后各个应用该如何处理呢,怎么才能做到应用独立扩展,而又没有重复代码呢?
按照如今一切js文件皆模块的原则,每个应用的数据,交互逻辑,都是独立的类,或者独立的模块,这个每次扩展就是一个独立的类,包含着新业务的特定数据和逻辑,相互之间使用import进行引用,不会出现代码越来越多,惨不忍睹的情况,而每一个应用它都有一个index.js文件,在每次启动应用的时候去加载这个index文件。
而那些平台级基础层的组件如何操作呢
继承,由于是平台级的基础层,每个应用都会使用,所以在每个应用的逻辑处理时,都需要通过继承来使用平台级的方法,当然每个应用都不一样,平台级的工具要做到‘拿来即用’,应用可以结合自己的数据自由组合这些工具,搭建自己的应用,软件行业里面有句名言,‘架构设计中,没有一个问题是不能通过一层抽象层来解决,如果有,那就是两层’。
注意后期维护
如果不明白这个架构思路,当有新人接收项目,或者出现新的业务的时候,很容易将这个架构打破,可能还是会按照程序员他自己原来的思路去往上堆,如果是个高手他可能会看明白,但是个初中级的段位呢?对吧,最明显的例子就是你可能仅仅加一个小功能,想当然地直接插入进去,虽然成功了,结果很容易忽视它是一个平台级的还是应用级的方法,甚至可能会因为命名而导致你其他应用的部分功能不好使,所以架构规则很重要,同时也会发现,当你只是要添加一个小功能的时候,基于这是一个平台级的应用,合理地增加新功能是一件不容易的事,你可能会质疑它,但随着你的不断深入,抽丝剥茧,你最终会发现,这一切都是有原因可言的。
关于后台通信
由于将项目所有的重心放在了前端,所以弱化了后端的功能,只需要提供最基本的数据增删改查即可。
关于构建部署
如何前端构建部署都是基于webpack工具来操作,平台级的部署也能够体现微服务的特点,独立部署,独立构建,所以在需要结合项目去自定义脚手架,在我司项目中,自定义npm命令,以web应用名来定义,而在webpack文件夹下,目录结构大概是这样:
和其他脚手架类似,有一个最基本的base文件,来做平台级的构建优化,比如压缩静态资源,babel转编译,打包编译,开发环境和构建环境的差异化部署等等,来覆盖整个应用,然后各个应用有自己独立的webpack文件,对webpack有一定了解的人都知道,在应用中继承或者使用baseJS文件,直接require进来即可,由于webpack的几大要素都是通过对象属性来构成的,所以想二次加工这baseJS文件,可以直接修改这些属性即可,如此,便建立了应用自己的构建部署,
在package.json文件中根据命令定义好了特定web应用的webpack文件
而在cmd命令中,只需输入命令npm run XXX,则会在package.json命令中自动加载特定webpack文件
快速理解
项目特别复杂,你又想特别快入手,明白它的架构设计,我觉得抓住两点很重要,第一是数据流,你得注意它的数据结构和流向,从上到下(父子组件,应用之间),从左到右(兄弟组件,应用之间),数据又是如何展示到各个应用的,有一个整体概念,第二,事件机制,其实就是数据处理的交互,每一部分的数据都如何产生的,逻辑处理是怎样的,再深入到具体的应用中,去分析它的业务即可,这也是为什么大学里面计算机专业的课程很大一部分是在教授数据结构和算法,而不教你一大堆主流框架,各种java,R,go,javascript编程语言的原因,说到底,我认为,一个应用就是由数据结构,算法,以及本身的业务数据构成的,而那些vue或者react只不过是一种工具,让你更好地实现你的idea。
写着写着,其实发现这个vue的设计思想特别像,我觉得vue的组件化设计其实就是面向对象思路,react更多的是函数式编程,一切js皆文件,以一种web组件的形式来集成应用,无论是哪一种主流框架结构,更多的理解框架本身的设计思路,并融会到自己的项目中,也算是一种借鉴和突破,我认为不一定非得用主流框架,使用一大堆API就是新技术,借鉴思想,修炼js内功,结合业务突破瓶颈,才是最根本的。
其他方面的有时间再完善。
前端微服务-面向web平台级应用的设计的更多相关文章
- 第11篇Kubernetes部署微服务电商平台
kubernetes部署sock-shop微服务电商平台: 准备条件 确保kubernetes可以访问:reg.yunwei.edu镜像库 需要准备镜像: 部署微服务 ...
- Apollo-open-capacity-platform 微服务能力开发平台 (转)
来自大佬的apollo整合微服务的教程:欢迎大家点评和star,链接如下:https://gitee.com/owenwangwen/open-capacity-platform 官方demo链接:h ...
- 寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加
寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现.本文记录HAPro ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_04微服务下电商项目基础模块设计
笔记 4.微服务下电商项目基础模块设计 简介:微服务下电商项目基础模块设计 分离几个模块,课程围绕这个基础项目进行学习 小而精的方式学习微服务 1.用户服务 ...
- 华为云MVP:来自工业制造领域的微服务与云平台实践
[摘要] 首先,和大家先聊聊的是为什么微服务.DevOps和云计算会在各个产业大行其道;其次,再谈谈微服务架构设计有那些自己独特的设计思想,和传统的SOA有什么区别;最后,我们再一起看一看在工业领域云 ...
- Aooms_微服务基础开发平台实战_002_工程构建
一.关于框架更名的一点说明 最近在做年终总结.明年规划.还有几个项目需要了结.出解决方案,事情还比较多,死了不少脑细胞,距离上一篇文章发出已经过了3天,是不是有些人会认为我放弃了又不搞了,NONO,一 ...
- Mosaic 前端微服务框架
Mosaic 是一系列的服务.库,集成在一起,定义了组件如何彼此交互,可以用来支持大规模的web 站点开发 一张架构图 说明 尽管上图中的一些组件已经迭代演化了(skipper 的route 配置,上 ...
- Kubernetes 部署微服务电商平台(16)
一.概念 微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事.这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整 ...
- 【GoLang】go 微服务框架 && Web框架学习资料
参考资料: 通过beego快速创建一个Restful风格API项目及API文档自动化: http://www.cnblogs.com/huligong1234/p/4707282.html Go 语 ...
随机推荐
- css布局--两列布局,左侧固定,右侧自适应(其中左侧要可以拖动,右侧水平滚动条)
(css布局所要实现的效果) 在前端面试中经常会被问到CSS布局,两列布局,左侧固定,右侧自适应.前几天去面试,遇到了这道题的升级版,要求左侧可拖动,右侧要有水平滚动条.拿到题目确实有些大脑短路,不知 ...
- Luogu P1080国王游戏(贪心)
国王游戏 题目链接:国王游戏 ps:题目数据说明了要写高精度. 这个题的答案是\(a.l * a.r < b.l * b.r\)按照这个进行排序 题解中大部分只是如何证明排序是: \(a.l * ...
- Spring容器的理解
控制反转(IOC,Inversion Of Contorl)和依赖注入(DI,Dependency Injection) IOC是一个宽泛的概念:对某事物的控制权由A转移到B. DI是实现IOC的一种 ...
- Could not connect to Redis at IP No route to host
这个问题是在用远程去访问redis出现的 原因:是服务器新装系统 iptables这个的问题 解决办法: sudo iptables -F 轻松解决
- Django中的csrf相关装饰器
切记: 这俩个装饰器不能直接加在类中函数的上方 (CBV方式) csrf_exempt除了,csrf_protect受保护的 from django.views import Viewfrom ...
- android 之 GridView
GridView 的用法基本与ListView类似. 程序布局文件main.xml <?xml version="1.0" encoding="utf-8" ...
- GET 方法和 POST方法区别
两种 HTTP 请求方法:GET 和 POST 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST. GET - 从指定的资源请求数据. POST - 向指定的资源提交 ...
- 【LeetCode】Two Sum(两数之和)
这道题是LeetCode里的第1道题. 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会 ...
- 九度oj 题目1467:二叉排序树
题目描述: 二叉排序树,也称为二叉查找树.可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值: 2. 若右子树 ...
- LINQ学习笔记 Join 与 Group join
LINQ中的Join对应T-SQL中的内连接,并无左连接的方法,当然也没有右连接. 要达成Left join必须依靠GroupJoin来完成. GroupJoin顾名思义就是先集团在做加入,加入的不同 ...