什么是微服务,优点和缺点

2022-04-09
4261

微服务

一、传统的单体
传统的单体常常采用整体式架构,并采取MVC的设计模式

单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,它暴露出来的问题也越来越多,主要有以下几点:

        1、复杂性逐渐变高

            比如有的项目有几十万行代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题
        2、技术债务逐渐上升
            公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多
        3、维护成本大
             当应用程序的功能越来越多、团队越来越大时,沟通成本、管理成本显著增加。当出现 bug 时,可能引起 bug 的原因组合越来越多,导致分析、定位和修复的成本增加;并且在对全局功能缺乏深度理解的情况下,容易在修复bug 时引入新的 bug
        4、持续交付周期长
             构建和部署时间会随着功能的增多而增加,任何细微的修改都会触发部署流水线。新人培养周期长:新成员了解背景、熟悉业务和配置环境的时间越来越长
        5、技术选型成本高
            单块架构倾向于采用统一的技术平台或方案来解决所有问题,如果后续想引入新的技术或框架,成本和风险都很大
        6、可扩展性差
            随着功能的增加,垂直扩展的成本将会越来越大;而对于水平扩展而言,因为所有代码都运行在同一个进程,没办法做到针对应用程序的部分功能做独立的扩展



二、什么是微服务
1、微服务 (Microservices) 是一种软件架构风格,将应用程序构造为围绕业务的小型自治服务的集合
2、微服务以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础。每个服务都是独立的,并实现单个业务功能
3、微服务利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的 API 集相互通信
4、微服务运用了以业务功能为主导的设计概念,应用程序在设计时就能先以业务功能或流程设计先行分割,将各个业务功能都独立实现成一个能自主运行的个体服务,然后再利用相同的协议将所有应用程序需要的服务都组合起来,形成一个应用程序

总结:微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。

三、微服务特点
        1、解耦
            系统中的服务在很大程度上是解耦的。因此,整个应用程序可以轻松构建,更改和扩展
        2、组件化
            微服务被视为独立的组件,可以轻松替换和升级
        3、专注业务功能
            业务功能–微服务非常简单,专注于单一功能
        4、独立自主
            开发人员和团队可以彼此独立地工作,从而提高了速度
        5、持续交付
            通过自动化的构建、测试和部署,允许频繁发布软件
        6、分散治理
            重点是使用正确的工具完成正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题
        7、敏捷开发
            微服务支持敏捷开发。任何新功能都可以快速开发并丢弃




四、微服务的优缺点

1、优点
  1. 服务的独立部署:每个服务都是一个独立的项目,可以独立部署,服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求,不依赖于其他服务,耦合性低。
  2. 服务的快速启动:拆分之后服务启动的速度必然要比拆分之前快很多,因为依赖的库少了,代码量也少了。
  3. 更加适合敏捷开发:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。
  4. 职责专一,由专门的团队负责专门的服务:业务发展迅速时,研发人员也会越来越多,每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。
  5. 服务可以动态按需扩容:当某个服务的访问量较大时,我们只需要将这个服务扩容即可。
  6. 独立性:服务独立测试、部署、升级、发布
  7. 开发简单、开发效率提高:微服务能够被小团队单独开发,一个服务可能就是专一的只干一件事,易于被一个开发人员理解,修改和维护。
  8. 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
  9. 微服务能使用不同的语言开发。
  10. 微服务允许你利用融合最新技术。
  11. 每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。
  12. 提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪
  13. 可以根据市场需求,灵活多变的组合出新的业务场景
  14. 服务实例水平扩展,服务单一职责,功能独立。保证可靠性与性能,提升资源利用




2、缺点
  1. 微服务提高了系统的复杂度
  2. 开发人员要处理分布式系统的复杂性
  3. 服务之间的分布式事务问题
  4. 服务的注册与发现问题
  5. 多服务运维难度,随着服务的增加,运维的压力也在增大
  6. 系统部署依赖
  7. 服务间通信成本
  8. 数据一致性
  9. 系统集成测试


五、服务发现
  1. 单个微服务在上线的时候,会向服务注册中心注册自己的 IP 位置、服务内容
  2. 当服务需要调用另一个服务的时候,会去询问服务探索中心该服务的 IP 位置,得到位置后即可直接向目标服务发起调用
  3. 这么做的用意是可以统一集中所有服务的位置,就不会分散于每个微服务中
  4. 服务发现中心可以每隔一段时间就向微服务进行健康检查(TCP 调用、HTTP 调用、Ping)
  5. 倘若该服务在时间内没有回应,则将其从服务中心移除,避免其他微服务对一个无回应的服务进行调用
  6. 即便微服务重新在其他ip上部署,其他服务也是无感知的
  7. 比较常用的服务发现有:etcd,consul,普遍都采用了raft等分布式算法