题目:论微服务架构及其应用 #
微服务架构(Microservices Architecture)是一种架构风格,它将一个复杂的应用拆分成多个独立自治的服务,服务与服务间通过松耦合的形式交互,在微服务架构中,服务是细粒度的,协议是轻量级的。这些服务通常按业务能力组织,有自身的技术堆栈。
请围绕“微服务架构及其应用”论题,依次从以下三个方面进行论述。
1. 概要叙述你参与管理和开发的、采用微服务架构的软件项目以及你在其中所承担的 主要工作。
2.请简要描述微服务架构的优点。
3.具体阐述你参与管理和开发的项目是如何基于微服务架构进行件设计实现的。
摘要 #
2021年4月,我所在的国内某头部互联网公司决定搭建全新的移动设备指纹分析处理平台,旨在为集团各业务线提供高效、可靠的移动设备指纹分析、存储及唯一标识移动设备的能力,我有幸地担任本次系统开发的架构师,负责整个系统的架构设计,对项目的技术活动进行指导和协调。本文将以该项目为背景,介绍微服务架构相比于单体架构的优点,同时详细探讨了微服务架构如何在日活设备2.6亿、峰值QPS达7万的项目中的实际应用。实践证明:恰当地使用微服务技术,使得系统的开发取得了巨大的成功,目前系统已稳定运行1年多,赢得了亿级用户的一致好评。这不仅为集团的业务安全提供了坚实的基础,也展示了微服务架构在大规模项目中的卓越表现。
正文 #
随着移动互联网的迅猛发展,手机等移动设备已经成为人们生活中不可或缺的一部分,为我们带来了更便捷的沟通交流方式。在此背景下,我就职的国内最大的社交媒体平台之一的公司,于2021年4月决定建设一套全新的移动设备指纹分析处理系统,旨在给集团提供全面的移动设备指纹分析、存储和唯一标识移动设备的能力,为公司的多元化的业务提供坚实的底层支持。移动设备的广泛应用使得此类系统的需求变得尤为迫切,我们面临着如何高效处理日活2.6亿的移动设备指纹的读写、以及峰值QPS达7万的高并发场景的问题。
作为这一重要项目的核心,我有幸被委以重任,担任本次系统开发的架构师,负责系统整体的架构设计,以及对项目中的技术活动进行指导和协调等。调研发现该系统需要快速迭代开发、高效地处理海量数据、同时还要在高峰时段高达7万的每秒查询数(QPS)的高并发场景下保持卓越的可用性。我们意识到,传统的单体式架构集群在面对如此复杂的业务且海量数据的情况下,常常会面临性能瓶颈、扩展困难以及难以应对高并发和快速迭代。面对这一挑战,我决定采用微服务架构技术,为该项目提供更卓越的性能、更强大的灵活性和可伸缩性。
本文将深入探讨这一技术方案的实际应用。特别是,介绍了微服务架构相比于传统单体式架构的优点,同时详细探讨了微服务架构在日活设备约2.6亿、峰值QPS达7万的项目中的实际应用。
一般而言,单体架构的代码异常复杂,模块与模块之间耦合度通常很高,这会导致开发和部署周期延长,增加了部署的复杂性。由于所有模块运行在同一个进程中,一旦单个组件发生故障,可能会对整个应用的稳定性产生严重的负面影响。为解决这些问题,我决定采用微服务架构技术,其优势如下:
服务独立性。它是微服务架构的核心思想,它将整个应用程序拆分为多个小型服务,每个服务专注于一个特定的业务场景。这些服务独立运行在不同的进程中,即使某个服务组件发生故障,也不会对整个应用造成严重的不可逆影响。
技术异构性。指的是不同的微服务可以使用不同的技术栈来实现,这样做的好处在于,它能够充分发挥各种技术的原生优势,使开发团队能够根据不同的业务场景,更加灵活地选择适合自己的工具和框架。
易于开发和部署。服务拆分带来了模块化开发,使得开发团队成员能够更加专注于自己负责的模块,减少开发的复杂度和模块间的依赖关系,同时每个服务可以被独立部署,这意味着当某个服务需要进行更新或者修复时,只需对该服务进行部署,减少部署的风险和影响范围。
可扩展性。就像木桶效应一样,一个应用程序的性能瓶颈通常集中在某个服务上,此时对于出现性能短板的服务,只需要对其进行单独的扩容,就能以最低的软硬件成本达到最好的效果。
由于实际项目需要快速迭代、单个服务需要方便扩缩容、需要高效地处理日活约2.6亿的移动设备指纹、以及在峰值QPS达7万的高并发场景下保持系统的高可用性,我决定采用微服务框架来作为项目的底层架构支持,最大化保证了微服务架构的技术优势。
鉴于Java语法过于臃肿、软硬件性价比问题以及敢于拥抱变化的心态,我们决定选择Golang作为后端语言,以提高系统的性价比和开发效率,为了构建高效的微服务架构,我们采用了Consul+Gin作为底层技术支持,在微服务之间的通讯方面,我们遵循统一的Restful风格的Api设计规范,并采用轻量级的Rpc和主流的Http通信协议相结合的方式,以确保服务之间的通信不会成为系统的瓶颈。在通讯的数据格式上,统一采用Json格式,原因在于,Golang对Json的序列化和反序列化做了特别的优化,且Json本身更轻量级、更便于开发人员理解和分析。
从本项目服务的各职能部门的角度进行拆分,将系统抽象成与各个职能部门对应的服务,包括:273项设备指纹上行服务,设备指纹落库落表落日志服务,与华为、小米等手机厂商合作的负一屏XX服务,与阿里巴巴、京东等合作的设备ID转换服务,商业化广告服务,鉴别真假设备的试金石服务、监控报警服务等共计42个接口。服务拆分本身是一把双刃剑,需要综合考虑服务的大小、服务的逻辑合理性等,避免为了“微服务”而“微服务”;合理的服务拆分极大地降低了各个模块之间的耦合度,也使得具体的开发人员能明确自己的开发任务,降低了开发人员之间的沟通交流成本。同时,由于微服务的独立性,我们通常把负一屏XX服务作为新技术的试验场,如令牌桶限流、降级等,除了能够及时得到上线效果的反馈外,即使该服务出现问题,也不会影响其他服务的正常运行。这样的架构设计提高了系统的可靠性和稳定性。
在部署服务方面,我们采用了Docker容器技术。微服务化后的系统明显解决了单体架构的重度耦合,难以扩展的问题,但拆分出来服务都是独立部署,在一定程度上增加了系统部署的复杂性,为应对这个问题,我们采用Docker容器技术,可以将每个服务打包成一个独立的容器,包括所需的配置文件、环境变量以及Golang编译的可执行二进制文件等;开发人员在公司内部云提供的基础镜像上,定义自动化部署脚本,该脚本可以自动构建镜像并创建该服务的容器,在经过测试人员严格测试通过之后,再将该服务一键灰度到某些机器或全量到上百台分布式的生产环境中。在微服务容器化实践中,我们使用Consul进行健康检查和负载均衡。通过在每个容器中运行Consul代理,可以每隔5秒自动检查服务的健康状态,即使某台服务器发生宕机,也可将当前请求自动路由到别的可用的实例上,从而保证了服务的高可用性和质量。此外,我们还配置了Grafana仪表盘来监控服务的性能和运行状态。通过设置报警规则,我们可以及时收到邮件或即时通讯软件的通知,以便运维人员能够快速响应和解决问题。采用Docker容器技术的好处是,它提供了一致的运行环境,使得服务的部署、迁移和扩缩容变得更加简单和可靠。
经历了一年半的开发,该项目于2022年10月成功上线,并且在过去的一年多时间里,系统架构稳定运行,实现了既定目标,赢得了过亿用户一致好评。虽然我们取得了这些成就,但也意识到了一些不足之处,特别是在自动化运维方面。这些挑战带给我们宝贵的经验和教训,为未来的工作提供了重要的参考,这正是我最大的收获。