本文共 1610 字,大约阅读时间需要 5 分钟。
在当今的系统架构中,微服务架构已经成为主流。尽管没有注册中心和服务管理,单体服务也很少见,多个服务之间的协作是常态化的。开发者在日常工作中经常需要处理跨服务的RPC调用,同时也需要处理应用内部的方法调用。很多人可能没有深入思考这两者之间的区别,更不用说在面试中如何深入回答相关问题了。本文将从微服务调用的特点、问题分析以及解决方案等方面,谈谈我的经验和思考。
在单体应用中,所有的方法调用都发生在应用内部,通过一个服务节点直接组装好数据并返回给调用者。这种方式简单直观,但随着服务数量的增加,单体应用难以应对复杂的业务需求。
而在微服务架构中,一个服务可能需要调用多个其他服务(如商品服务、营销服务等)来组装完整的业务数据。这种跨服务调用的特性意味着:
跨进程甚至跨节点:使用K8s编排微服务时,服务可能部署在不同的节点上。网络连接不可靠,容灾机制也无法保证服务始终可用。
对外部的依赖:服务之间的调用依赖于外部网络,这使得网络传输耗时、不稳定。
网络传输存在一些著名的错误假设,例如:
这些假设在实际应用中往往不成立。网络传输可能会受到延迟、带宽限制、连接中断等因素的影响,这些都会对微服务调用的可靠性产生影响。
在设计和实现微服务间的方法调用时,需要特别注意以下几点:
严出宽进原则:提供给其他服务的数据要经过严格校验,但对外部服务的调用则要宽容处理。需要根据业务需求分析依赖类型,是强依赖还是弱依赖。
熔断机制:如果依赖服务接口错误率很高,调用方应暂停调用,等待服务恢复后再重新尝试。
微服务间的方法调用与应用内的方法调用在架构、调用的特性、网络依赖等方面有显著的不同。我们需要清醒认识到这些差异,并在实际开发中采取相应的优化措施。
这些问题看似简单,但根据我的观察,很多开发者在写RPC调用时还没有意识到这些问题。希望通过本文的分享,能够帮助大家在实际开发中避免类似的痛点。
转载地址:http://hiasz.baihongyu.com/