前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微服务间的调用和应用内调用的有啥区别

微服务间的调用和应用内调用的有啥区别

作者头像
方丈的寺院
发布于 2019-08-05 09:40:46
发布于 2019-08-05 09:40:46
8920
举报
文章被收录于专栏:方丈的寺院方丈的寺院

摘要

目前大部分的系统架构都是微服务架构,就算没有注册中心、服务管理,也肯定是多个服务,单体服务比较少了。大家平时需要在应用内调用rpc接口也比较多,那么有没有思考过微服务之间的调用和应用内直接调用有什么区别呢?面试时是不是经常被被问到微服务呢,本篇文章针对 微服务间的方法调用和应用内方法调用的有啥区别这个很小的点,谈谈我的经验

微服务调用特点

先从单体应用说起

单体应用单体引用通过一个服务节点直接组装好数据,返回给调用者。所有的方法调用都发生在应用内部。

微服务应用

商品详情服务需要调用商品,营销等多个服务组装好商品详情页的数据

微服务调用和应用内调用不同点在于它是跨进程的,甚至是跨节点的,这意味着什么呢

使用k8s编排微服务时,我们可以让不同的服务放在同一个节点的不同docker container上,但是考虑到网络不可靠,和容灾, 服务之间不可避免会放到不同的节点/机架上,所以下文都以跨节点来讨论

意味着两点

  • 对外部有了依赖
  • 如果是跨节点,就有了网络调用。我们知道网络都是不可靠的

关于网络有几个著名的错误推论

The network is reliable(网络是可靠的) Latency is zero.(延迟可以为0) Bandwidth is infinite(带宽是无限的) The network is secure(网络是安全的) Topology doesn't change(网络拓扑结构不会变) Transport cost is zero(网络传输耗时为0) The network is homogeneous(网络是同类的)

我们需要做什么

存在上述两个问题后,那么我们需要在写微服务间方法调用时注意什么的

对外部有了依赖微服务架构设计中有一条重要的原则叫 严出宽进,严出意思就是说你提供给其他服务的东西要尽可能的进行严格的校验。宽进就是你调用别人的接口要宽容,兼容各种情况。比如说你需要考虑别人的节点down了/api超时/api不可用等等因素。

为了解决这个问题,我们必须要针对具体业务,分析依赖类型,是强依赖还是弱依赖,强依赖包装成自己的服务异常返回码/或者直接告诉前端调用不可用。弱依赖,catch所有异常,无论依赖方发生什么,不能影响我的接口返回。

此外,我依赖的服务某段时间内接口错误率很高,调用方还在不停的发送请求,那么就会一直得到错误的结果,这时候这些请求其实是无效的,所以这时候需要客户端熔断,不再去调用服务方,给服务方恢复的时间,等过段时间再去重试,发现服务方可用时,再去调用。

网络调用

网络调用是耗时的,所以我们需要利用池化技术,复用连接,比如在单体应用中我们需要与数据库连接,会利用到数据库连接池来提高数据操作效率。那么微服务调用也是这么个道理,我们与其他服务建议http/tcp连接,也需要建立连接池。另外一个服务可能会依赖多个微服务,不能因为和某个服务之间的连接出了问题,影响到与其他服务的连接,所以需要做连接池隔离。

服务间调用有可能失败,所以我们需要有重试机制,比如因为网络抖动引发的超时问题,我们可以通过重试提高API的可用性。但是思考一下坏的情况,某段时间网络或者服务端真的有问题了。客户端超时时间设置的很大的话,客户端等待的时间就会很长,然后再加上重试机制,就会将客户端的连接占满,造成客户端相关API不可用。

几个案例

分享几个微服务调用的故障案例,帮助大家进行场景化思考 为啥要分享这些案例呢,因为TMD的这些案例都是血的教训,造成线上故障,不是我的错,却要我背锅

案例1:

新上线了一个产品功能,需要推广,放在另外一个流量比较大的产品模块中,展示一些我们产品功能的数据。

出于某种原因,我们的服务mock了rpc调用数据,返回null。结果其他服务整个前台页面挂了,挂了,挂了。

典型的强弱依赖问题,调用方没有处理好依赖类型,明明是一个弱依赖没有处理,变成了强依赖,造成功能挂了

案例2:

依赖的某个服务需要根据主键 List<id>来批量查询,依赖服务内部做分库分表拆分,升级了sdk 在提供的sdk client中做分表路由,将批量id拆分成N个rpc调用。这么做的原因是防止批量查询把数据库连接池打爆。

忽略了网络调用

案例3

别人调我们的服务的某个接口,这个接口RT(耗时时间)P95 < 30ms。但是客户端调用的超时时间设置成了500ms,在某次不知道是什么原因的情况下,调用方的连接大量block,造成线程阻塞,相关API不可用。看服务方监控,该接口返回时间正常,服务方没有任何异常。

没有正确的设置超时时间

总结

微服务调用和应用内调用有很大的区别,我们不能在进行服务间调用时无感知,需要知道它面临的问题

  • 对外部有了依赖,外部是不可靠的
  • 有了网络调用

解法可以精炼为4条

  • 根据业务需要,判断依赖类型,做好对应的降级
  • 设置合理的超时时间
  • 调用方需要对不同的服务调用设置连接池隔离
  • 调用方需要有熔断机制

这些问题看似都很简单,但是根据我的观察,真的有很多人写了无数的rpc调用,还没有意识到这些问题。

关注【方丈的寺院】,与方丈一起开始技术修行之路

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
再谈微服务
传统方式 VS 微服务 传统开发方式遇到的问题: 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断。 代码部署难:代码功能耦合在一起,新人不知道如何下手。 部署不灵活:构建时间长
春哥大魔王
2018/04/17
6010
再谈微服务
微服务架构
微服务是系统架构上的一种设计风格; 主旨是将一个原本独立的系统拆分成多个小型服务; 这些小型服务都在各自独立的进程中运行; 服务之间通过基于HTTP的RESTful API进行通信协作。
zhangjiqun
2024/12/17
2600
微服务架构
微服务服务间调用组件Feign使用介绍、原理、优化技巧
Feign是一个声明式的Web Service客户端。它让微服务之间的调用变得更简单。Feign具有可插拔式的注解支持,包括Feign 注解和JAX-RS注解。Feign还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注解的支持,并且也支持Spring WebFlux。
青山师
2023/10/17
10.3K0
好技能 | 微服务调用失败时常用处理手段
文章名《Spring Cloud Alibaba + Dubbo 搭建一个微服务架构》 作者:王二蛋
穿过生命散发芬芳
2024/11/28
2570
微服务转型,雪崩效应是绕不过的一道坎
记得在三年前公司因为业务发展需要,就曾经将单体应用迁移到分布式框架上来。当时就遇到了这样一个问题:系统仅有一个控制单元,它会调用多个运算单元,如果某个运算单元(作为服务提供者)不可用,将导致控制单元(作为服务调用者)被阻塞,最终导致控制单元崩溃,进而导致整个系统都面临着瘫痪的风险。 那个时候还不知道这其实就是服务的雪崩效应,雪崩效应好比就是蝴蝶效应,说的都是一个小因素的变化,却往往有着无比强大的力量,以至于最后改变整体结构、产生意想不到的结果。雪崩效应也是我们目前研发的产品直面的一道坎,下面我们来看有哪些场
yuanyi928
2018/04/02
2.5K0
微服务转型,雪崩效应是绕不过的一道坎
跟着小程来学微服务--微服务思想
一直对微服务非常感兴趣,因为公司的架构改造正好有机会能够接触微服务,买来一些书,请教了很多微服务大牛同时自己也做了很多总结,写成了80页ppt,算是我对微服务的一个认识吧,微服务本身不同的人有不同的理解,而我就从我自己的角度来谈谈微服务是什么。
小程故事多
2018/08/22
4390
跟着小程来学微服务--微服务思想
微服务架构下请求调用失败的解决方案
相比单体架构,微服务架构下,服务调用从同一台机器内部的本地调用变成了不同机器间的远程方法调用,这就引入不确定因素:
JavaEdge
2022/11/30
1K0
微服务架构下请求调用失败的解决方案
微服务的风险:分布式固有的复杂性、服务的依赖性及雪崩效应
在微服务架构下,传统的单体应用被拆分为多个服务后,服务的数量变多了,同时之前单体架构下进程内部的方法调用转变为分布式网络环境下的远程调用,因此构建分布式微服务系统带来了额外的开销。
愿天堂没有BUG
2022/10/28
6340
微服务的风险:分布式固有的复杂性、服务的依赖性及雪崩效应
Java面试——微服务
就目前而言,对于微服务业界并没有一个统一的,标准的定义。但通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API),每个服务都围绕着具体的业务进行构建,并且能够被独立的构建在生产环境、类生产环境等。另外,应避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
Java架构师必看
2021/04/25
1.1K0
Java学习笔记-微服务(3)-负载均衡及服务调用
LoadBalancer 是 Spring Cloud 官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在 Spring Cloud Connons 中用于替换之前的 Ribbon 组件。相较于 Ribbon ,LoadBalancer 支持 RestTemplate,也支持 WebClient 等。
咸鱼程序员
2025/03/04
1020
Java学习笔记-微服务(3)-负载均衡及服务调用
日调1000亿,腾讯微服务平台的架构演进
要搭建一套能稳定支持海量调用的微服务系统,需要先看看系统由哪些模块组成。如上图所示,从下往上看,不同的用户 VPC 代表多租户,中间是服务注册发现的模块,顶部是应用管理模块和数据化运营模块,应用管理模块用来进行 CICD,包括了分发、部署以及配置管理等应用生命周期相关的功能。
腾讯云开发者
2020/09/21
5.1K0
构建高可用网关之容错实践
自从微服务概念以来,众多的软件架构在践行着这一优秀的设计理念。各自的系统在这一指导思想下收获了优雅的可维护性,但一方面也给接口调用提出了新的要求。比如众多的API调用急需一个统一的入口来支持客户端的调用。在这种情况下API GATEWAY诞生,我们将接入、路由、限流等功能统一由网关负责,各自的服务提供方专注于业务逻辑的实现,从而给客户端调用提供了一个稳健的服务调用环境。之后,我们在网关大调用量的情况下,还要保证网关的可降级、可限流、可隔离等等一系列容错能力。 一、网关 这里说的网关是指API网关,直面意思是
纯洁的微笑
2018/04/18
1.3K0
构建高可用网关之容错实践
聊一聊微服务架构中的服务发现系统
导语:本文围绕服服务调用模式、一致性取舍、服务提供者的健康检查模式等方面,讨论了服务发现的技术选型和设计的各种优缺点,希望能够帮助大家在选择或者使用服务发现系统的时候更加顺畅。
腾讯云中间件团队
2021/03/24
8120
聊一聊微服务架构中的服务发现系统
什么是微服务
在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。
前朝楚水
2018/07/26
1K0
故障驱动的微服务架构设计
此文背景: 之所以发布此文,是有一个直接的原因,就是我们之前在线上遇到了一个使用timeout来判断是否失败的案例,这是真实的,结果就是效果很不好。看了本文中介绍的各种技术和架构模式,让我忽然对之前的这个案例有了一个新的认识,就是“快速失败”不应该依赖于传统的比如timeout这种超时机制来进行,也许使用本文中介绍到的技术(比如:Circuit Breakers)要更加地可靠和受控。 目录 微服务架构的风险 优雅的服务降级 变更管理 健康检查和负载平衡 自愈(Self-healing) 故障转移缓存
ImportSource
2018/04/03
1.4K0
故障驱动的微服务架构设计
微服务架构下请求调用失败了怎么办!
微服务架构相比单体架构,服务的调用从同一台机器内部的本地调用变成了不同机器之间的远程方法调用,但是这个过程也引入了两个不确定的因素:
JavaEdge
2021/02/23
1.1K0
微服务架构下请求调用失败了怎么办!
程序员都应该懂的微服务容错与隔离:熔断保护、超时与重试原理
断路器(Circuit Breaker)就像保险丝,在电路系统中,一般在所有的家电系统连接外部供电的线路中间都会加一个保险丝,当外部电压过高,达到保险丝的熔点时,保险丝就会被熔断,从而可以切断家电系统与外部电路的联通,进而保障家电系统不会因为电压过高而损坏。
愿天堂没有BUG
2022/10/28
7470
微服务架构组件分析
服务描述:服务调用首先解决的问题就是服务如何对外描述。 常用的服务描述方式包括 RESTful API、XML 配置以及 IDL 文件三种。
Java天坑
2018/10/21
8580
微服务架构如何避免大规模故障?
微服务架构通过一种良好的服务边界划分,能够有效地进行故障隔离。但就像其他分布式系统一样,在网络、硬件或者应用级别上容易出现问题的机率会更高。服务的依赖关系,导致在任何组件暂时不可用的情况下,就它们的消费者而言都是可以接受的。为了能够降低部分服务中断所带来的影响,我们需要构建一个容错服务,来优雅地应对特定类型的服务中断。
lyb-geek
2021/12/10
4460
微服务架构如何避免大规模故障?
SpringCloud简介与微服务架构
微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。
BUG弄潮儿
2021/02/03
6390
SpringCloud简介与微服务架构
相关推荐
再谈微服务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档