架构与思维:一定需要微服务么?
1 微服务发展
微服务架构的发展伴随着互联网行业的飞速增长和技术的日新月异。起初,企业为了提升应用的灵活性和可维护性,开始尝试将单体应用拆分为多个服务,这便是面向服务的架构(SOA)的兴起。然而,此时的拆分粒度仍然相对较大,并没有完全实现服务的细粒度划分。
随着Docker和容器技术的兴起,微服务架构真正得到了发展的助力。容器技术为微服务提供了轻量级的隔离环境,使得微服务更容易部署和管理。 每个微服务都可以独立运行、扩展和更新,大大提高了系统的灵活性和可维护性。
进入云原生时代,伴随着Kubernetes等技术的兴起,微服务架构得到了更为完善的支撑。云原生技术为微服务提供了自动化部署、管理和监控的能力,进一步推动了微服务架构的广泛应用
2 微服务有哪些特点
微服务提倡将 单一应用程序划分成一组松散耦合的细粒度小型服务,辅助轻量级的协议,互相协调、互相配合,为用户提供最终价值。
所以,微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。这些服务通常包含如下特点:
2.1 单一职责
微服务架构中的每个节点高度服务化,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,包括数据库和数据模型;不同的服务通过“管道”的方式灵活组合,从而构建出庞大的系统。
原来的单体系统逐渐演变成具有单一职责的细粒度服务。
2.2 轻量级通信
通过REST API模式或者RPC框架,实现服务间互相协作的轻量级通信机制。参考作者这一篇《微服务通信之RPC》
- 性能佳
- 稳定性高
- 安全性好
2.3 独立性
在微服务架构中,每个服务都是独立的业务单元,与其他服务高度解耦,只需要改变当前服务本身,就可以完成独立的开发、测试、部署、运维。
2.4 进程隔离
在微服务架构中,应用程序由多个服务组成,每个服务都是高度自治的独立业务实体,可以运行在独立的进程中,不同的服务能非常容易地部署到不同的主机上,实现高度自治和高度隔离。
进程的隔离,还能保证服务达到动态扩缩容的能力,业务高峰期自动增加服务资源以提升并发能力,业务低谷期则可自动释放服务资源以节省开销。
2.5 混合技术栈和混合部署方式
团队可以为不同的服务组件使用不同的技术栈和不同的部署方式(公有云、私有云、混合云)。
2.6 简化治理
组件可以彼此独立地进行扩缩容和治理,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。
2.7 安全可靠,可维护。
从架构上对运维提供友好的支撑,在安全、可维护的基础上规范化发布流程,支持数据存储容灾、业务模块隔离、访问权限控制、编码安全检测等。
3 微服务架构适用的场景
微服务架构的适用场景广泛,尤其在以下情况下表现尤为突出:
1. 业务复杂,模块多且相对独立:当业务复杂到单体应用难以维护时,将应用拆分为多个微服务是一个明智的选择。每个微服务专注于一个业务领域,实现业务的高度解耦和快速迭代。
2. 团队多,管理隔离:随着公司规模的扩大,团队数量也在不断增加。每个团队都有自己的管理方式和负责的业务领域。微服务架构可以实现团队自治,提高开发效率。
3. 应用规模大,并发用户多:微服务架构可以横向分布式扩展,轻松应对应用规模的不断扩大和海量用户增长。
4. 快速迭代、持续交付:在业务需求快速变化的情况下,微服务架构可以实现快速的开发、测试和部署,支持持续交付和持续集成。
4 微服务架构的优势和挑战
4.1 微服务架构的优势
4.1.1 易于开发和维护
由于每个微服务都是独立的,开发团队可以专注于自己的服务,从而更容易进行开发和维护。
4.1.2 启动速度快
与单体应用相比,微服务的启动速度更快,因为只需要启动所需的服务,而不是整个应用。
4.1.3 局部修改容易部署
当某个服务出现问题或需要更新时,只需要针对该服务进行修改和部署,而不需要重新部署整个应用。
4.1.4 技术栈灵活
每个微服务都可以使用最适合的技术栈进行开发,从而可以充分利用最新的技术和工具。
4.1.5 易于扩展
每个微服务都可以独立进行扩展,从而可以根据需要灵活地调整系统的性能和资源使用。
4.1.6 独立运行和扩展
每个微服务都可以独立地运行和扩展,使得系统能够很容易地水平扩展以处理更多的负载。
4.1.7 提高可用性
通过将应用程序分解为多个小而自治的服务,可以降低单点故障的风险,提高整个系统的可用性。
4.2 微服务架构面临的挑战
4.2.1 分布式系统的固有复杂性
微服务架构是基于分布式的系统,而构建分布式系统必然会带来额外的开销。
- 性能: 分布式系统是跨进程、跨网络的调用, 受网络延迟和带宽的影响。
- 可靠性: 由于高度依赖于网络状况, 任何一次的远程调用都有可能失败,随着服务的增多还会出现更多的潜在故障点。此,如何提高系统的可靠性、降低因网络引起的故障率,是系统构建的一大挑战。
- 分布式通信: 分布式通信大大增加了功能实现的复杂度,并且 伴随着定位难、调试难等问题
- 数据一致性: 需要保证分布式系统的数据强一致性,即 在 C(一致性)A(可用性)P(分区容错性) 三者之间做出权衡。块可以参考我的这篇《分布式事务》。
- 安全性问题:微服务架构涉及多个服务之间的网络通信,存在数据泄露、劫持等安全风险,需要实施适当的安全措施。
4.2.2 服务的依赖管理和测试
在单体应用中,通常使用集成测试来验证依赖是否正常。而在微服务架构中,服务数量众多,每个服务都是独立的业务单元,服务主要通过接口进行交互,如何保证它的正常,是测试面临的主要挑战。
所以单元测试和单个服务链路的可用性非常重要。
4.2.3 有效的配置版本管理
在单体系统中,配置可以写在yaml文件,分布式系统中需要统一进行配置管理,同一个服务在不同的场景下对配置的值要求还可能不一样,所以需要引入配置的版本管理、环境管理。
4.2.4 自动化的部署流程
在微服务架构中,每个服务都独立部署,交付周期短且频率高,人工部署已经无法适应业务的快速变化。有效地构建自动化部署体系,配合服务网格、容器技术,是微服务面临的另一个挑战。
4.2.5 对于DevOps更高的要求
在微服务架构的实施过程中,开发人员和运维人员的角色发生了变化,开发者也将承担起整个服务的生命周期的责任,包括部署、链路追踪、监控;因此,按需调整组织架构、构建全功能的团队,也是一个不小的挑战。
1.2.6 运维成本
运维主要包括配置、部署、监控与告警和日志收集四大方面。微服务架构中,每个服务都需要独立地配置、部署、监控和收集日志,成本呈指数级增长。服务化粒度越细,运维成本越高。
怎样去解决这些问题,是微服务架构必须面临的挑战。
5 什么时候需要微服务化?
作为一线大厂架构师,我们也承担着很多旧系统改造的工作,在判断是否使用微服务架构时,以下是一些可能的参考:
1. 流量和并发量
当系统的流量或并发量达到一定的阈值,比如日活跃用户数量超过百万,或者每秒请求数(QPS)达到数千甚至更高时,传统的单体架构可能难以支撑如此高的负载。此时,将系统拆分为微服务可以提高系统的吞吐量和响应速度。
2. 迭代频率
如果业务需求变更非常频繁,例如每周两次以上甚至每天都有新的功能需要上线,那么微服务架构的灵活性将更加适合这种快速迭代的需求。每个微服务可以独立进行开发、测试和部署,这将大大缩短新功能上线的周期。
3. 系统扩展需求
当系统需要快速扩展以满足业务增长时,微服务架构可以更容易地实现水平扩展。通过增加更多的服务实例或部署到更多的服务器上,可以线性地提高系统的处理能力。如果预计未来几年内系统需要大幅度扩展,那么使用微服务架构可能是一个明智的选择。
4. 耦合度和依赖关系
如果旧系统中的模块之间存在高度的耦合和复杂的依赖关系,这可能导致维护和升级变得困难。通过微服务架构,可以将这些模块拆分为独立的服务,降低耦合度,减少依赖关系,从而提高系统的可维护性和可扩展性。
5. 故障隔离和容错能力
如果系统中的某个模块出现故障,是否会影响到整个系统的正常运行?如果答案是肯定的,那么使用微服务架构可以提高系统的容错能力。每个微服务都可以独立运行和故障隔离,一个服务的故障不会影响到其他服务的正常运行。
需要注意的是, 贸然拆分成为服务架构,反而可能导致服务间访问效率变低、服务间调用的可靠性变低、故障问题定位慢、更高的数据一致性保障、很高的机器资源(物力)和运维(人力)成本。所以,适合的才是对的,需要平衡各方面利弊再做决定。