先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
特点:
-
用服务进行组件化
-
围绕业务能力进行组织
-
是产品而非项目
-
端点智能化和哑管道: 控制逻辑都在端点,管道仅仅是传输
-
全自动化部署
-
语言和数据的去中心化控制
-
面向失败设计
-
渐进式设计
综合来看,其优缺点如下:
优点:
-
模块的强边界
-
独立部署
-
技术选型的多样性
缺点:
-
分布式带来编程复杂度,远程调用的消耗
-
舍弃强一致性,实现最终一致性
-
操作复杂性要求有一个成熟的运维团队或者运维基础设施
为什么要采用微服务
是否选择微服务取决于你要设计的系统的复杂度。微服务是用来把控复杂系统的,但是随之而来的就是引入了微服务本身的复杂度。需要解决包括自动化部署、监控、容错处理、最终一致性等其他分布式系统面临的问题。即使已经有一些普遍使用的解决方案,但是仍然是有不小的成本的。
生产力和复杂度的关系如图所示,可见系统越复杂,微服务带来的收益越大。此外,无论是单体应用还是微服务,团队的技能都需要能够把控住。
马丁.福勒的一个观点是:除非管理单体应用的成本已经太复杂了(太大导致很难修改和部署),否则都不要考虑微服务。大部分应用都应该选择单体架构,做好单体应用的模块化而不是拆分成服务。
因此,系统一开始采用单体架构,做好模块化,之后随着系统变得越来越复杂、模块/服务间的边界越来越清晰,再重构为微服务架构是一个合理的架构演化路径。
四个可以考虑上微服务的情况:
-
多人开发一个模块/项目,提交代码频繁出现大量冲突。
-
模块间严重耦合,互相依赖,每次变动需要牵扯多个团队,单次上线需求太多,风险大。
-
主要业务和次要业务耦合,横向扩展流程复杂。
-
熔断降级全靠if-else。
微服务的三个阶段:
- 微服务1.0:
仅使用注册发现,基于SpringCloud或者Dubbo进行开发。
- 微服务2.0:
使用了熔断、限流、降级等服务治理策略,并配备完整服务工具和平台。
- 微服务3.0:
Service Mesh将服务治理作为通用组件,下沉到平台层实现,应用层仅仅关注业务逻辑,平台层可以根据业务监控自动调度和参数调整,实现AIOps和智能调度。
微服务架构
先决条件
- 快速的环境提供能力:
依赖于云计算、容器技术,快速交付环境。
- 基本的监控能力:
包括基础的技术监控和业务监控。
- 快速的应用部署能力:
需要部署管道提供快速的部署能力。
- Devops文化:
需要具有良好的持续交付能力,包括全链路追踪、快速环境提供和部署等,还需要快速的反应能力(对问题、故障的快速响应),开发和运维的协同工作。
此外,根据康威定律和逆康威定律(技术架构倒逼组织架构改进),组织架构也是一个很关键的因素。对应于微服务架构,组织架构需要遵循以下原则:
-
一个微服务由一个团队维护,团队成员以三人为宜。
-
单个团队的任务和发展是独立的,不受其他因素影响。
-
团队是功能齐全、全栈、自治的,扁平、自我管理。
基础设施
微服务的推行需要依赖于很多底层基础设施,包括提供微服务的编译、集成、打包、部署、配置等工作,采用PaaS平台解决微服务从开发到运行的全生命周期管理,同时提供异构环境管理、容器资源隔离与互通、服务伸缩漂移、服务升级与回退、服务熔断与降级、服务注册与发现。
- 最基本的基础设施
- 进程间通讯机制:
微服务是独立进程的,需要确定之间的通讯方式。
-
服务发现+服务路由: 提供服务注册中心,服务提供者和消费者通过服务发现获取服务的信息从而调用服务,实现服务的负载均衡等。
-
服务容错:
微服务架构中,由于服务非常多,往往是一个服务挂了,整个请求链路的服务都受到影响,因此需要服务容错,在服务调用失败的时候能够处理错误或者快速失败,包括熔断、fallback、重试、流控和服务隔离等。
- 分布式事务支持:
随着业务拆分为服务,那么有时候不可避免的就是跨服务的事务,即分布式事务的问题。
原则是尽量避免分布式事务,如果无法避免那么可以使用消息系统或者CQRS和Event Sourcing方案来实现最终一致性。
如果需要强一致性,则有两阶段提交、三阶段提交、TCC等分布式事务解决方案。
- 提升外部服务对接效率和内部开发效率
- API网关: 负责外部系统的访问,负责跨横切面的公共层面的工作,包括安全、日志、权限控制、传输加密、请求转发、流量控制等。
典型的网关功能即对外暴露一个域名xx.com,根据第一级目录做反向路由xx.com/user,xx.com/trade。
每一级目录,如user、trade对应一个服务的域名。
此外,API网关也可以有服务编排的功能(不推荐)。
- 接口框架: 规范服务之间通讯使用的数据格式、解析包、自解释文档,便于服务使用方快速上手等。
- 提升测试和运维效率
- 持续集成:
这一部分并非是微服务特定的,对于之前的单体应用,此部分一般来说也是必要的。
主要是指通过自动化手段,持续地对代码进程编译构建、自动化测试,以得到快速有效的质量反馈,从而保证代码的顺利交付。
自动化测试包括代码级别的单元测试、单个系统的集成测试、系统间的接口测试。
- 自动化部署:
微服务架构,节点数动辄上百上千,自动化部署能够提高部署速度和部署频率,从而保证持续交付。
包括版本管理、资源管理、部署操作、回滚操作等功能。
而对于微服务的部署方式,包括蓝绿部署、滚动部署以及金丝雀部署。
- 配置中心: 运行时配置管理能够解决动态修改配置并批量生效的问题。
包括配置版本管理、配置项管理、节点管理、配置同步等。
- 持续交付:
包括持续集成、自动化部署等流程。
目的就是小步迭代,快速交付。
- 进一步提升运维效率
- 服务监控: 微服务架构下节点数目众多,需要监控的机器、网络、进程、接口等的数量大大增加,需要一个强大的监控系统,能够提供实时搜集信息进行分析以及实时分析之上的预警。
包括监控服务的请求次数、响应时间分布、最大/最小响应值、错误码分布等
- 服务跟踪:
跟踪一个请求的完整路径,包括请求发起时间、响应时间、响应码、请求参数、返回结果等信息,也叫做全链路跟踪。
通常的服务监控可以和服务监控做在一起,宏观信息由服务跟踪呈现,微观单个服务/节点的信息由服务监控呈现。
服务跟踪目前的实现理论基本都是Google的Dapper论文。
- 服务安全:
内网之间的微服务调用原则上讲应该是都可以互相访问写,一般并不需要权限控制,但有时候限于业务要求,会对接口、数据等方面有安全控制的要求。
此部分可以以配置的方式存在于服务注册中心中,和服务绑定,在请求时由做为服务提供者的服务节点进行安全策略控制。
配置则可以存储在配置中心以方便动态修改。
在微服务数量很少的情况下,以上基础设施的优先级自上而下降低。否则,仅仅依赖人工操作,则投入产出比会很低。
还需要提到的是Docker容器技术。虽然这个对于微服务并不是必须的,但是容器技术轻量级、灵活、与应用依存、屏蔽环境差异的特性对于持续交付的实现是至关重要的,即使对于传统的单体应用也能够给其带来交付效率的大幅提升。
架构设计模式
在引入微服务之后,传统的单体应用变为了一个一个服务,之前一个应用直接提供接口给客户端访问的架构不再适用。微服务架构下,针对不同设备的接口做为BFF层(Backend For Frontend),也叫做用户体验适配层,负责聚合、编排微服务的数据转换成前端需要的数据。服务之间的调用则在允许的情况下(允许延迟)尽可能使用异步消息传递方式,如此形成面向用户体验的微服务架构设计模式。如下图所示:
Client -> API Gateway -> BFF(Backend For Frontend) -> Downstream Microservices
-
后台采用微服务架构,微服务可以采用不同的编程语言和不同的存储机制。
-
前台采用BFF模式对不同的用户体验(如桌面浏览器,Native App,平板响应式Web)进行适配。
-
BFF、API Orchestration Layer,Edge Service Layer,Device Wrapper Layer是相同的概念。
-
BFF不能过多,过多会造成代码逻辑重复冗余。
-
可以将网关承担的功能,如Geoip、限流、安全认证等跨横切面功能和BFF做在同一层,虽然增加了BFF层的复杂性,但能够得到性能优势。
服务拆分
微服务架构最核心的环节,主要是对服务的横向拆分。服务拆分就是讲一个完整的业务系统解耦为服务,服务需要职责单一,之间没有耦合关系,能够独立开发和维护。
服务拆分不是一蹴而就的,需要在开发过程中不断地理清边界。在完全理清服务之前,尽量推迟对服务的拆分,尤其是对数据库的拆分。
拆分方法如下:
-
基于业务逻辑拆分
-
基于可扩展拆分
-
基于可靠性拆分
-
基于性能拆分
其中,对于无法修改的遗留系统,采用绞杀者模式:在遗留系统外面增加新的功能做成微服务方式,而不是直接修改原有系统,逐步的实现对老系统替换。
拆分过程需要遵守的规范如下:
-
先少后多、先粗后细(粒度)
-
服务纵向拆分最多三层,两次调用:
Controller、组合服务、基础服务
-
仅仅单向调用,禁止循环调用
-
串行调用改为并行调用或者异步化
-
接口应该幂等
-
接口数据定义严禁内嵌,透传
-
规范化工程名
-
先拆分服务,等服务粒度确定后再拆分数据库。
微服务框架
上面讲述了微服务架构的众多基础设施,如果每一个基础设施都需要自己开发的话是非常巨大的开发工作。目前市面上已经有不少开源的微服务框架可以选择。
- Spring Boot
Spring Boot是用来简化新Spring应用的初始搭建以及开发过程的。其虽然不是微服务框架,但其设计的初衷本质就是微应用的底层框架,因此非常适合用于微服务基础设施的开发以及微服务的应用开发。尤其对于Spring技术栈的团队来说,基于Spring Boot开发微服务框架和应用是自然而然的一个选择。
- Dubbo&&Motan
Dubbo阿里开源的服务治理框架。其出现在微服务理念兴起之前,可以看做是SOA框架的集大成之作。但其仅仅包含了微服务基础设施的部分功能,诸如熔断、服务跟踪、网关等都没有实现。
刷面试题
刷题的重要性,不用多说。对于应届生或工作年限不长的人来说,刷面试题一方面能够尽可能地快速自己对某个技术点的理解,另一方面在面试时,有一定几率被问到相同或相似题,另外或多或少也能够为自己面试增加一些自信心,可见适当的刷题是很有必要的。
-
前端字节跳动真题解析
-
【269页】前端大厂面试题宝典
最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
自己的编程能力和抽象思维能力。大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-zx0niDq7-1713225331935)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!