什么是微服务,优点和缺点
微服务
一、传统的单体
传统的单体常常采用整体式架构,并采取MVC的设计模式
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、优点
2、缺点
五、服务发现
传统的单体常常采用整体式架构,并采取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、优点
- 服务的独立部署:每个服务都是一个独立的项目,可以独立部署,服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求,不依赖于其他服务,耦合性低。
- 服务的快速启动:拆分之后服务启动的速度必然要比拆分之前快很多,因为依赖的库少了,代码量也少了。
- 更加适合敏捷开发:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。
- 职责专一,由专门的团队负责专门的服务:业务发展迅速时,研发人员也会越来越多,每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。
- 服务可以动态按需扩容:当某个服务的访问量较大时,我们只需要将这个服务扩容即可。
- 独立性:服务独立测试、部署、升级、发布
- 开发简单、开发效率提高:微服务能够被小团队单独开发,一个服务可能就是专一的只干一件事,易于被一个开发人员理解,修改和维护。
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
- 微服务能使用不同的语言开发。
- 微服务允许你利用融合最新技术。
- 每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。
- 提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪
- 可以根据市场需求,灵活多变的组合出新的业务场景
- 服务实例水平扩展,服务单一职责,功能独立。保证可靠性与性能,提升资源利用
2、缺点
- 微服务提高了系统的复杂度
- 开发人员要处理分布式系统的复杂性
- 服务之间的分布式事务问题
- 服务的注册与发现问题
- 多服务运维难度,随着服务的增加,运维的压力也在增大
- 系统部署依赖
- 服务间通信成本
- 数据一致性
- 系统集成测试
五、服务发现
- 单个微服务在上线的时候,会向服务注册中心注册自己的 IP 位置、服务内容
- 当服务需要调用另一个服务的时候,会去询问服务探索中心该服务的 IP 位置,得到位置后即可直接向目标服务发起调用
- 这么做的用意是可以统一集中所有服务的位置,就不会分散于每个微服务中
- 服务发现中心可以每隔一段时间就向微服务进行健康检查(TCP 调用、HTTP 调用、Ping)
- 倘若该服务在时间内没有回应,则将其从服务中心移除,避免其他微服务对一个无回应的服务进行调用
- 即便微服务重新在其他ip上部署,其他服务也是无感知的
- 比较常用的服务发现有:etcd,consul,普遍都采用了raft等分布式算法