当前位置:网站首页>【从 0 开始学微服务】【01】什么是微服务
【从 0 开始学微服务】【01】什么是微服务
2022-07-07 10:33:00 【lpruoyu】
持续学习&持续更新中…
守破离
微服务:
- 以业务功能为主的一种软件架构风格
- 每一个模块独立开发、测试、部署,拥有自己的进程;与语言无关;对外开放API接口(RPC/HTTP)
单体应用
在开聊微服务之前,我先要你和介绍下单体应用。如果你不知道单体应用的痛,那也不会深刻理解微服务的价值。
早些年,各大互联网公司的应用技术栈大致可分为 LAMP(Linux + Apache + MySQL + PHP)和 MVC(Spring + iBatis/Hibernate + Tomcat)两大流派。无论是 LAMP 还是 MVC,都是为单体应用架构设计的,其优点是学习成本低,开发上手快,测试、部署、运维也比较方便,甚至一个人就可以完成一个网站的开发与部署。
随着业务规模的不断扩大,团队开发人员的不断扩张,单体应用架构就会开始出现问题。大概会有以下几个方面的问题:
部署效率低下。以我实际参与的项目为例,当单体应用的代码越来越多,依赖的资源越来越多时,应用编译打包、部署测试一次,甚至需要 10 分钟以上。这也经常被新加入的同学吐槽说,部署测试一次的时间,都可以去楼下喝杯咖啡了。
团队协作开发成本高。以我的经验,早期在团队开发人员只有两三个人的时候,协作修改代码,最后合并到同一个 master 分支,然后打包部署,尚且可控。但是一旦团队人员扩张,超过 5 人修改代码,然后一起打包部署,测试阶段只要有一块功能有问题,就得重新编译打包部署,然后重新预览测试,所有相关的开发人员又都得参与其中,效率低下,开发成本极高。
系统高可用性差。因为所有的功能开发最后都部署到同一个 WAR 包里,运行在同一个 Tomcat 进程之中,一旦某一功能涉及的代码或者资源有问题,那就会影响整个 WAR 包中部署的功能。比如我经常遇到的一个问题:某段代码不断在内存中创建大对象,并且没有回收,部署到线上运行一段时间后,就会造成 JVM 内存泄露,异常退出,那么部署在同一个 JVM 进程中的所有服务都不可用,后果十分严重。
线上发布变慢。特别是对于 Java 应用来说,一旦代码膨胀,服务启动的时间就会变长,有些甚至超过 10 分钟以上,如果机器规模超过 100 台以上,假设每次发布的步长为 10%,单次发布需要就需要 100 分钟之久。因此,急需一种方法能够将应用的不同模块的解耦,降低开发和部署成本。
微服务好处:
- 模块化部署,避免一个模块宕机,导致整个系统不可用
- 可以单独针对高并发的场景(秒杀、订单、…)扩容,添加机器
- 方便开发人员独立开发、互不干扰
服务化
用通俗的话来讲,服务化就是把传统的单机应用中通过 JAR 包依赖产生的本地方法调用,改造成通过 RPC 接口产生的远程方法调用。
一般在编写业务代码时,对于一些通用的业务逻辑,我会尽力把它抽象并独立成为专门的模块,因为这对于代码复用和业务理解都大有裨益。
以微博系统为例,微博既包含了内容模块,也包含了消息模块和用户模块等。其中消息模块依赖内容模块,消息模块和内容模块又都依赖用户模块。当这三个模块的代码耦合在一起,应用启动时,需要同时去加载每个模块的代码并连接对应的资源。一旦任何模块的代码出现 bug,或者依赖的资源出现问题,整个单体应用都会受到影响。
为此,首先可以把用户模块从单体应用中拆分出来,独立成一个服务部署,以 RPC 接口的形式对外提供服务。内容和消息模块调用用户接口,就从进程内的调用变成远程 RPC 调用。
这样,用户模块就可以独立开发、测试、上线和运维,可以交由专门的团队来做,与其它模块不耦合。进一步的可以再把消息模块也拆分出来作为独立的模块,交由专门的团队来开发和维护。
可见通过服务化,可以解决单体应用膨胀、团队开发耦合度高、协作效率低下的问题。
什么是微服务
从 2014 年开始,得益于以 Docker 为代表的容器化技术的成熟以及 DevOps 文化的兴起,服务化的思想进一步演化,演变为今天我们所熟知的微服务。
那么微服务相比于服务化又有什么不同呢?
在我看来,可以总结为以下四点:
服务拆分粒度更细。微服务可以说是更细维度的服务化,小到一个子模块,只要该模块依赖的资源与其他模块都没有关系,那么就可以拆分为一个微服务。
服务独立部署。每个微服务都严格遵循独立打包部署的准则,互不影响。比如一台物理机上可以部署多个 Docker 实例,每个 Docker 实例可以部署一个微服务的代码。
服务独立维护。每个微服务都可以交由一个小团队甚至个人来开发、测试、发布和运维,并对整个生命周期负责。
服务治理能力要求高。因为拆分为微服务之后,服务的数量变多,因此需要有统一的服务治理平台,来对各个服务进行管理。
继续以前面举的微博系统为例,可以进一步对内容模块的功能进行拆分,比如内容模块又包含了 feed 模块、评论模块和个人页模块。通过微服务化,将这三个模块变成三个独立的服务,每个服务依赖各自的资源,并独立部署在不同的服务池中,可以由不同的开发人员进行维护。当评论服务需求变更时,只需要修改评论业务相关的代码,并独立上线发布;而 feed 服务和个人页服务不需要变更,也不会受到发布可能带来的变更影响。
由此可见,微服务化给服务的发布和部署,以及服务的保障带来了诸多好处。
总结
微服务的发展由来,它是由单体应用进化到服务化拆分部署,后期随着移动互联网规模的不断扩大,敏捷开发、持续交付、DevOps 理论的发展和实践,以及基于 Docker 容器化技术的成熟,微服务架构开始流行,逐渐成为应用架构的未来演进方向。
总结来说,微服务架构是将复杂臃肿的单体应用进行细粒度的服务化拆分,每个拆分出来的服务各自独立打包部署,并交由小团队进行开发和运维,从而极大地提高了应用交付的效率,并被各大互联网公司所普遍采用。
注意
实践出真知
服务化拆分最好不要涉及跨数据库表交互
课外拓展:什么是微服务(维基百科)
https://zh.wikipedia.org/wiki/%E5%BE%AE%E6%9C%8D%E5%8B%99
微服务(Microservices)是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块为基础,以模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的API接口集合相互通信。
2014年,Martin Fowler 与 James Lewis 共同提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通信。同时服务会使用最小规模的集中管理 (例如 Docker) 能力,服务可以用不同的编程语言与数据库等组件实现。
微服务是一种以业务功能为主的服务设计概念,每一个服务都具有自主运行的业务功能,对外开放不受语言限制的 API (最常用的是 HTTP),应用程序则是由一个或多个微服务组成。
微服务的另一个对比是单体式应用程序。单体式应用表示一个应用程序内包含了所有需要的业务功能,并且使用像主从式架构(Client/Server)或是多层次架构(N-tier)实现,虽然它也是能以分布式应用程序来实现,但是在单体式应用内,每一个业务功能是不可分割的。若要对单体式应用进行扩展则必须将整个应用程序都放到新的运算资源(如:虚拟机) 内,但事实上应用程序中最吃耗费资源、需要运算资源的仅有某个业务部分(例如跑分析报表或是数学算法分析),但因为单体式应用无法分割该部分,因此无形中会有大量的资源浪费的现象。
微服务运用了以业务功能为主的设计概念,应用程序在设计时就能先以业务功能或流程设计先行分割,将各个业务功能都独立实现成一个能自主执行的个体服务,然后再利用相同的协议将所有应用程序需要的服务都组合起来,形成一个应用程序。若需要针对特定业务功能进行扩展时,只要对该业务功能的服务进行扩展就好,不需要整个应用程序都扩展,同时,由于微服务是以业务功能导向的实现,因此不会受到应用程序的干扰,微服务的管理员可以视运算资源的需要来配置微服务到不同的运算资源内,或是布建新的运算资源并将它配置进去。
虽然使用一般的服务器虚拟化技术就能应用于微服务的管理,但容器技术 (Container Technology) 如 Docker 会更加地适合发展微服务的运算资源管理技术。
参考
维基百科:微服务
极客时间: 从 0 开始学微服务-- 微博服务化专家的一线实战经验
本文完,感谢您的关注支持!
边栏推荐
- Upgrade from a tool to a solution, and the new site with praise points to new value
- Idea 2021 Chinese garbled code
- Sign up now | oar hacker marathon phase III midsummer debut, waiting for you to challenge
- Cenos openssh upgrade to version 8.4
- Unity map auto match material tool map auto add to shader tool shader match map tool map made by substance painter auto match shader tool
- leetcode刷题:二叉树27(删除二叉搜索树中的节点)
- Visual studio 2019 (localdb) \mssqllocaldb SQL Server 2014 database version is 852 and cannot be opened. This server supports version 782 and earlier
- SQL injection -- Audit of PHP source code (take SQL lab 1~15 as an example) (super detailed)
- Charles: four ways to modify the input parameters or return results of the interface
- The left-hand side of an assignment expression may not be an optional property access. ts(2779)
猜你喜欢
金融数据获取(三)当爬虫遇上要鼠标滚轮滚动才会刷新数据的网页(保姆级教程)
ENSP MPLS layer 3 dedicated line
The IDM server response shows that you do not have permission to download the solution tutorial
[statistical learning method] learning notes - support vector machine (I)
【统计学习方法】学习笔记——支持向量机(上)
Session
Baidu digital person Du Xiaoxiao responded to netizens' shouts online to meet the Shanghai college entrance examination English composition
The left-hand side of an assignment expression may not be an optional property access.ts(2779)
Tutorial on principles and applications of database system (010) -- exercises of conceptual model and data model
数据库安全的重要性
随机推荐
2022广东省安全员A证第三批(主要负责人)考试练习题及模拟考试
H3C HCl MPLS layer 2 dedicated line experiment
Routing strategy of multi-point republication [Huawei]
【统计学习方法】学习笔记——支持向量机(上)
SQL head injection -- injection principle and essence
SQL Lab (32~35) contains the principle understanding and precautions of wide byte injection (continuously updated later)
跨域问题解决方案
The road to success in R & D efficiency of 1000 person Internet companies
Multi row and multi column flex layout
Utiliser la pile pour convertir le binaire en décimal
通讯协议设计与实现
Preorder, inorder and postorder traversal of binary tree
爱可可AI前沿推介(7.7)
Sign up now | oar hacker marathon phase III midsummer debut, waiting for you to challenge
【统计学习方法】学习笔记——逻辑斯谛回归和最大熵模型
Epp+dis learning road (2) -- blink! twinkle!
2022聚合工艺考试题模拟考试题库及在线模拟考试
Static routing assignment of network reachable and telent connections
NGUI-UILabel
金融数据获取(三)当爬虫遇上要鼠标滚轮滚动才会刷新数据的网页(保姆级教程)