当前位置:首页 > 问答 > 正文

聊聊云上跑微服务,别忘了这几个关键点和移植难题

聊聊云上跑微服务,别忘了这几个关键点和移植难题

(引用来源:InfoQ、阿里云技术社区、多位一线工程师的实践经验分享)

现在很多公司都在谈数字化转型,把原来的大块头应用拆成一个一个小的微服务,然后放到云上去运行,这听起来很美,感觉像是给系统做了一次精装修,每个房间(服务)功能独立,出了问题也好维修,但真要把微服务在云上跑得稳、跑得好,可不是简单地把代码搬上去就完事了,这里面有几个非常关键的点,以及从传统系统移植过来时躲不开的难题,咱们今天就来聊聊这些实在话。

云上跑微服务必须盯紧的几个关键点:

第一个关键点是服务发现和网络通信,在微服务架构里,服务动不动就有几十上百个,它们的位置(比如在哪个服务器上、IP地址是什么)还可能因为扩容、缩容或者故障而频繁变动,想象一下,你叫外卖,但送餐小哥手里的地址时刻在变,那这饭肯定送不到,服务发现就是解决这个问题的“调度中心”,让服务之间能准确地找到彼此,在云上,通常会有现成的工具(比如Consul、Nacos,或者云厂商自带的负载均衡器)来干这个活,但你得把它配好、用好,确保服务上线、下线时信息能及时同步,不然就会出现一部分服务能通、一部分服务“失联”的怪现象,服务之间的调用网络也要稳定、延迟要低,云环境内部的虚拟网络配置不当,很可能就成了性能瓶颈。

第二个关键点是配置管理不能乱,每个微服务都有自己的配置,比如数据库连接地址、第三方API的密钥、一些功能开关等,如果还像以前那样,把配置写在每个服务的文件里,管理起来会是一场噩梦,一旦需要修改某个公共配置(比如换一个数据库),你得去改所有相关服务的配置文件,然后重新部署,非常容易出错,必须有一个统一的配置中心,所有服务都从这里拉取配置,这样改一处,所有服务都能生效,但这也引入了新的复杂度:如何保证配置中心本身的高可用?如何安全地管理敏感配置?版本回滚时配置怎么同步?这些都是要提前考虑清楚的。

第三个关键点是数据的持久化问题,微服务强调每个服务拥有自己的数据库,这叫数据库隔离,目的是避免服务之间通过数据库直接耦合,但这就带来了数据一致性的挑战,比如一个用户下单的操作,可能需要扣减库存服务、生成订单服务、计算积分服务等多个服务协同工作,在云上,你不能再简单地用一个数据库事务来保证所有操作同时成功或失败了,必须引入更复杂的机制,最终一致性”方案(通过消息队列异步处理)或者Saga模式(通过一系列补偿操作来应对失败),选择哪种方案,取决于你的业务对一致性的要求有多高,这里面需要做很多权衡。

第四个关键点是可观测性比监控更重要,在云上,服务实例那么多,出问题是常态,光知道服务器CPU高了没用,你得能快速定位到是哪个服务、哪个接口、甚至哪行代码出了问题,可观测性通常包括三个支柱:日志、指标和链路追踪,日志要集中收集和检索,让你能像百度一样搜索错误信息;指标(比如QPS、延迟、错误率)要能实时展示和告警;链路追踪则能还原一个请求经过了哪些服务,在每个服务里耗时多久,像破案一样找出瓶颈所在,在云上搭建一套好用的可观测性体系,是运维团队的“眼睛”,没有它,系统就等于在摸黑运行。

说说从传统应用移植到云原生微服务的难题:

第一个大难题是拆分的艺术与陷阱,很多现有系统是一个庞大的“单体”,所有功能模块紧紧耦合在一起,怎么把它合理地拆分成微服务?拆得太粗,和单体没区别;拆得太细,服务间调用网络开销巨大,复杂度飙升,拆分的原则通常是“高内聚、低耦合”,即经常一起变化的功能放在一个服务里,但说起来容易做起来难,这需要对原有业务和代码有非常深的理解,很多时候是在“啃硬骨头”,可能会触动原有的代码结构和团队分工。

第二个难题是代码和依赖的改造,传统应用可能用了很多老旧的框架、库,甚至有一些对服务器环境的强依赖(比如假设本地总有某个文件),搬到云上,尤其是容器化之后,环境是标准化、无状态的,这些假设都不成立了,代码需要大量改造,比如去除本地状态(改为存入Redis等外部缓存)、适配新的服务发现机制、重构数据库访问层等,这个过程工作量巨大,且测试必须非常充分,否则一个隐藏的依赖就可能导致线上故障。

第三个难题是团队文化和技能的转变,以前运维团队管服务器,开发团队写代码,界限分明,现在搞云上微服务,提倡“DevOps”,即开发也要关心运维,甚至需要自己负责服务的部署和监控,这对团队的传统分工是个挑战,需要学习和掌握容器技术(如Docker)、编排工具(如Kubernetes)、CI/CD(持续集成/持续部署)等一系列新技能,如果团队意识和技能跟不上,再好的技术架构也发挥不出威力。

把微服务搬到云上,是一次架构和组织的双重升级,它确实能带来弹性伸缩、快速迭代等巨大好处,但前提是必须正视这些关键点和移植难题,做好充分的技术储备和心理准备,一步一个脚印地去实践和优化,切忌为了“上云”而“上云”,否则很可能陷入更大的麻烦之中。

聊聊云上跑微服务,别忘了这几个关键点和移植难题