微服务已经火了很久了,很多人对这个东西感觉很高大上,实际上,有点规模的互联网公已经把微服务用的很顺手了,说实话,这门技术的使用,完全是“被迫”接受的。
大多数开发者都希望能接触到微服务开发,然而并不是每家公司都愿意花这么大的成本去搞这个东西,环境所逼,很多人为了自己的前途,拼命想去大厂,大公司有什么好处呢,我随便列举几点:
很多人会说,学了不能用的技术学了也没用啊,在工作中学习能用到的技术才是最有效的,我以前也是这么听别人讲的,现在想起来,纯粹放屁,互联网这个行业,人员流动性是很高的,大家都想一步步晋级去大厂,很多知识,是大厂需求的,但是在一般的小公司,毫无用武之地。别人跟你说,你别学这个了,我们公司用不到的,你学了也是白学,现在用不到就不学了?搞怪吧,我现在学的东西难道不是为未来的我做准备的,而是单纯为这家公司做准备的?我用一个打工者的角度来思考这个问题(一些领导或者资本家的角度大多是有自我利益性的,都是基于自己利益不被损害的前提下来做事),毕竟大多数人都是打工者,学以致用当然是好,但是大多数人并不是有这样的机会,没有这个机会怎么办,自己去创造啊,我想搞微服务,现在这家不搞,那你以后就去找一家有搞的啊,学习干嘛还要找这么多的借口。对于后端开发来说,我觉得要有追求,还是要对微服务有点了解。我相信努力的你,未来一定会用到它。
定义:微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通讯。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等
博主也去过一些公司,接触到的技术团队也不算少了,有十几人的,也有几十人,几百人的。我发现,微服务这个东西,只有对技术有追求的公司,规模稍微大些的才会弄。这些公司受不住大单体项目的摧残,他们是没办法的,规模到那个程度了,不搞微服务得不偿失,当项目复杂性达到一定的量级,开发人员也到达了一定的人数,微服务拆分便是必然的趋势。
微服务是趋向后端的概念,微服务的核心在于这个“微”字,以前的时候,我们经常把一个项目写在一个仓库中,所有跟这个项目有关的内容全部放在一起。大家开发共用一个仓库,如果没有人强制设立规范的话,代码质量和目录规范什么的都无法达到保证,随着项目的扩大以及开发人员的增加,风险也会随之增大,有可能一人为了开发A功能,导致其他功能都挂了,或者说有人改动了一小段共用代码,导致其他子系统奔溃。当然,这都是有可能的。
慢慢的大家觉得,有些东西可以单独抽离处理作为一个独立的模块(服务),在开发,测试,部署的过程中都可以单独对其操作。模块之间的上线发布互不影响。代码仓库相互隔离。例如,评论模块和点赞模块拆分成两个微服务,点赞服务挂了,评论模块还是正常不受影响的,对用户来说,只是局部性功能失效,用户体验也不会太差。
技术一直是双刃剑,有优势必然也会有劣势,毕竟软件设计没有银弹。
微服务优势:
微服务劣势:
单体架构优势:
单体架构劣势:
单体架构适合项目刚开始需要快速迭代上线,技术人员人员较少的场景,但是随着系统的复杂性逐渐增加,单体所带来的的劣势远比优势更加突出,此时,在公司实力的允许下,单体必将被微服务所重构。
开始干货内容
按业务维度进行拆分,标准是按照业务的关联程度来决定,关联比较密切的业务拆分为一个微服务, 而功能相对比较独立的业务适合单独拆分为一个微服务
按公共且独立功能维度拆分,标准是按照是否有公共的被多个其他服务调用,且依赖的资源独立不与其他业务耦合
一般来说,有以上两种方式的拆分维度,具体的拆分选择需要按照公司业务以及人员规模进行决定
常常有以下三种服务实现方式
基于RPC实现的微服务,常用存在三种角色,分别是
注册中心是整个微服务中较为复杂的部分。一个注册中心往往需要提供一系列 API 供服务调用者和服务提供者使用。一般至少需要以下的接口:
为了避免中介所挂壁,导致两端无法正常通信,往往注册中心会采用集群的部署方式,这就意味着对于节点之间的数据同步有着很大的挑战。
微服务的调用可分为三步曲:
建立连接一般有两种方式,一种是基于应用层的HTTP通信,一种是底层的socket通信。
数据传输方式有基于HTTP和grpc的实现,通过为了高性能以及减少网络带宽,我们会使用pb对象的方式进行传输,而不是使用可视化较好的 json 格式进行传输,比较 pb 是二进制的传输方式。性能相对较好。
服务端处理一般有三种处理机制,分别为
几种处理方式各有好处和劣势,因此一般根据 业务进行决定,但是市面上常用的RPC框架已经帮我们把这个搞好了,不需要我们对其关心。
不同的监控维度往往是业务需要,导致监控的侧重点不同。
基于RPC的调用方式,和本地服务器调用有着很大的不同,涉及不同服务器,不同网络,不同物理区域。因此为了能准确定位调用链路中的问题,需要微服务的追踪。当然作用不当当只有问题定位,还有很多,例如:
一般有三种实现方式:
traceId:用于标识某一次具体的请求 ID。当用户的请求进入系统后,会在 RPC 调用网络的第一层生成一个全局唯一的 traceId,并且会随着每一层的 RPC 调用,不断往后传递,这样的话通过 traceId 就可以把一次用户请求在系统中调用的路径串联起来
spanId:用于标识一次 RPC 调用在分布式请求中的位置。当用户的请求进入系统后,处在 RPC 调用网络的第一层 A 时 spanId 初始值是 0,进入下一层 RPC 调用 B 的时候 spanId 是 0.1,继续进入下一层 RPC 调用 C 时 spanId 是 0.1.1,而与 B 处在同一层的 RPC 调用 E 的 spanId 是 0.2,这样的话通过 spanId 就可以定位某一次 RPC 请求在系统调用中所处的位置,以及它的上下游依赖分别是谁
annotation: 用于业务自定义埋点数据,可以是业务感兴趣的想上传到后端的数据,比如一次请求的用户 UID
数据采集
– CS阶段(client send):客户端发起请求,并生成调用的上下文
– SR阶段(server receive):服务端接受请求,并生成上下文
– SS阶段(server send):服务端返回请求,这个阶段会将服务端上下文数据上报
– CR阶段(client receive):客户端接收返回结果,这个阶段会将客户端上下文数据上报
数据处理
数据处理一般有两种范式,一种是实时数据处理,一种是离线数据处理。通过是两种方式相结合实现。
数据展示
一般以调用链路图和调用拓扑图进行呈现
节点管理
包括注册中心主动摘除机制和服务消费者主动拆除机制
负载均衡
– 随机算法
– 轮训算法
– 最少活跃调用法
– 一致性hash算法
服务路由
可分为静态配置和动态配置,大家可以类比静态路由和静态路由
服务容错
包含四种容错机制
– FailOver:失败自动切换
– FailBack:失败通知
– FailCache:失败缓存
– FailFast:快速失败
以上为微服务所涉及到基本知识点,因为篇幅有限,需要继续学习的同学可以自行去研究学习。另外附上博主学习微服务时做的思维导图笔记供大家参考:
需要高清大图的可以在资源里进行下载。