- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
大家好,我是汤师爷~ 。
应用交互是指不同应用结构之间的数据交换和通信方式.
在一个复杂的系统中,各个应用并不是孤立存在的,它们往往需要相互协作,才能完成更复杂的业务流程.
应用交互的设计就是为了确保这些系统和组件能够顺畅地“对话”,实现系统整体目标.
应用交互的形式有多种,包括同步调用、异步消息通信等。每种交互方式都有其特定的应用场景和优缺点.
通过合理的交互设计,系统中的各个部分能够高效协同,减少耦合度,增加系统的灵活性.
同时,良好的交互设计还能显著提升系统的性能和容错能力,即使在大流量访问、业务需求复杂的情况下,也依然保持稳定运行.
应用服务是系统对外提供的核心业务功能.
应用服务也是如此,应用服务可以独立演化和实现,但它们并非完全独立,必须相互交互,才能实现整体系统目标.
如何设计应用服务之间的交互?首先需要了解清楚服务上下游的概念.
1、服务上下游的概念 。
服务的上下游关系可以通过DDD(领域驱动设计)的建模方法来定义,主要使用限界上下文(bounded context)和上下文映射(context mapping)这两个概念.
上下游表示上下文之间的依赖方向,下游需要了解上游的领域知识来实现业务,而上游不需要了解下游.
换句话说,上游服务不需要关心下游服务的存在,但下游服务的实现却依赖于上游服务提供的能力.
这个概念听起来有些抽象,确实让许多人犯迷糊。让我们通过线上商城的几个应用服务来具体说明:
如图所示,我们可以看出各个服务的上下游关系.
商品服务和用户服务是上游服务,它们提供基础数据,其他服务依赖于这些数据.
交易服务位于中间位置。对用户服务和商品服务而言,交易服务是下游,因为它依赖于这两个服务的基础数据.
对库存服务来说,交易服务也是下游,因为交易下单过程中,需要库存服务来预占、扣减库存.
对履约服务而言,交易服务是上游,因为它提供订单数据,驱动后续的订单履约流程.
2、为什么要区分上下游?
区分上下游关系的核心目标是为了解耦.
"解耦"这个词相信大家都不陌生,但它的含义往往过于抽象和模糊。在这里,我们探讨一下解耦到底指什么.
耦合是指两个或多个结构之间的相互作用和影响。在软件开发中,这可以理解为不同模块、系统或团队之间的相互依赖和影响.
随着软件需要解决的业务问题越来越复杂,单个系统或团队很难独立实现业务目标。因此,解耦的目的并非完全消除耦合,而是减少不必要的依赖关系.
在上文中我们提到,上游服务不需要关心下游服务的存在,但下游服务的实现却依赖于上游服务提供的能力.
因此,当下游服务的团队迭代新功能时,无需评估是否影响上游服务,因为基于明确的上下游关系,能快速判断出不会影响上游服务。只需评估是否影响自己的下游服务.
例如,交易服务的功能发生变更时,只需通知履约服务的团队,评估是否会影响到他们,上游服务团队则无需知晓.
这种方式能大大减少影响面的评估工作,提高团队协作效率.
相反,如果上下游关系混乱,存在各种循环依赖,那么任何一个服务的改动都难以准确评估影响面。此时就需要召集所有服务的团队,逐一评估是否有影响.
实际场景中,每次项目会议都需要一屋子人才能评估出影响面,这样的协作效率极低.
3、上下游关系的核心使用场景 。
在软件研发过程中,上下游关系在许多关键场景中发挥着重要作用.
应用服务的交互方式多种多样,其中最主要的两种是同步调用和异步消息.
1、同步调用 。
同步调用是一种通信方式,其中调用方(客户端)向被调用方(服务端)发送请求,并等待服务端处理完成后返回结果。在此期间,调用方会阻塞,直到收到服务端的响应。这种方式要求调用方和被调用方同时在线,且调用方在等待响应期间无法执行其他操作.
在微服务架构中,同步调用的典型技术实现协议包括HTTP、REST API、Dubbo、Thrift、gRPC和SOAP等.
同步调用适用于下游服务需要立即获取上游服务的数据或功能的场景。这种通信方式简单直接,但需要处理服务之间的可用性问题.
例如,用户下单时,订单服务需要同步调用商品服务,获取商品的最新价格和库存信息,以确保订单有效.
通常来说,上游服务不应同步调用下游服务。如果上游服务同步调用下游服务,会导致上游需要了解下游的领域知识,违背DDD上下游的设计原则,加深系统耦合,并增加团队协作复杂性.
此外,这种做法还可能引发级联故障,降低系统可靠性。如果上下游直接互相调用,那下游服务发生故障也将直接影响上游服务的可用性,可能导致整个系统都不可用.
2、异步消息 。
异步消息是另一种通信方式,其中消息的发送者(生产者)和接收者(消费者)通过消息队列或消息中间件进行通信.
发送者无需等待接收者处理完成即可继续其他操作。消息被发送到消息队列后,接收者从队列中异步获取并处理。这种方式将发送者和接收者的时间依赖解除,让两者能够独立运作,提高了系统的灵活性和可扩展性.
在微服务架构中,异步消息通常通过消息中间件实现,如RabbitMQ、Kafka和RocketMQ等.
异步消息适用于上游服务向下游服务发布事件或通知的场景,能有效解耦服务,提高系统的弹性和可靠性。下游服务也可通过异步消息向上游服务反馈信息,实现双向通信.
例如,当用户提交订单后,订单服务调用支付服务发起支付。用户完成支付后,支付服务发布"支付成功"消息,订单服务接收该消息后,更新订单状态并发送通知.
3、其他交互方式 。
1)共享数据库方式 。
多个服务访问同一个数据库,直接读取或写入数据.
在微服务架构中,通常不建议采用共享数据库的方式,因为它违反了服务自治原则,增加了服务间的耦合度.
2)文件传输 。
服务之间通过共享文件系统或FTP等方式交换数据文件。这种交互方式通常是批处理的,实时性较差.
3)服务总线(ESB) 。
使用统一的通信总线来连接不同的服务和系统。服务之间不直接通信,而是通过总线中介,适用于需要集成多种异构系统和服务的大型企业级系统.
然而,这种方式引入了额外的架构层,增加了系统复杂性。所有服务都耦合到总线上,存在单点故障风险.
本文已收录于,我的技术网站:tangshiye.cn 里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享.
最后此篇关于吊打面试官!应用间交互如何设计?的文章就讲到这里了,如果你想了解更多关于吊打面试官!应用间交互如何设计?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
写在开头 面试官:“小伙子,线程池使用过吗,来聊一聊它吧!” 我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问...” 面试官满意的点了点头,紧接着问道:“那你知道如何优雅
本文摘录自笔者开源的 Java 学习&面试指南(Github 收获146k star):JavaGuide 。 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的
在 MySQL 中,GROUP BY 和 DISTINCT 都是用来处理查询结果中的重复数据,并且在官方的描述文档中也可以看出:在大多数情况下 DISTINCT 是特殊的 GROUP BY,如下图所示
首先,这个问题考察的是你对线程池 execute 方法和 submit 方法的理解,在 Java 线程池的使用中,我们可以通过 execute 方法或 submit 方法给线程池添加任务,但如果线程池
对于我们使用的线程池 ThreadPoolExecutor 来说,停止线程池的方法有以下两个: shutdown():优雅的关闭线程池,即不再接受新任务,但会等待已提交任务(包括正在执行的任务
任务编排(Task Orchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行。 1.为什么需要任务编排? 在复杂的业务场景中,任务间通常存在依赖关系,也就是某个
设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK 中
大家好,我是三友~~ 今天继续探秘系列,扒一扒一次RPC请求在Dubbo中经历的核心流程。 本文是基于Dubbo3.x版本进行讲解 一个简单的Demo 这里还
MySQL 作为关系型数据库的典型代表,其流行程度超越于任何数据库,因此在 Java 面试中,MySQL 是一定会被问到的重要知识点。而在 MySQL 中有一道极其常见的面试题,我们这里系统的来看一下
Spring AI 已经发布了好长时间了,目前已经更新到 1.0 版本了,所以身为 Java 程序员的你,如果还对 Spring AI 一点都不了解的话,那就有点太落伍了。 言归正传,那什么是 Sp
一、写在开头 在计算机领域中百分之九十以上的程序拥有着和外部设备交互的功能,这就是我们常说的IO(Input/Output:输入/输出),所谓输入就是外部数据导入计算机内存中的过程,输出则是将内存或
前言 前几天面试遇到的,感觉比较有趣。第一次面试遇到考架构设计相关的题目,挺新奇的,开始向国外大厂靠拢了,比天天问八股文好太多了,工作5年左右的,问八股文,纯纯的不负责任偷懒行为。 感觉此问题比较
一、写在开头 在上一篇学习序列化的文章中我们提出了这样的一个问题: “如果在我的对象中,有些变量并不想被序列化应该怎么办呢?” 当时给的回答是:不想被序列化的变量我们可以使用transient或
面试连环call Java类是如何被加载到内存中的? Java类的生命周期都有哪些阶段? JVM加载的class文件都有哪些来源? JVM在加载class文件时,何时判断class
面试连环call 双亲委派机制是什么?如何打破双亲委派机制? JVM都有哪些类加载器? 如何构造一个自定义类加载器? Tomcat的类加载机制?Spring的类加载机制 Cla
哈喽,大家好🎉,我是世杰。 ⏩本次给大家介绍一下操作系统线程和Java的线程以及二者的关联 1. 面试连环call Java线程可以无限创建吗? Java线程和操作系
Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。 Netty 核心组件包含以下内容:
Netty 作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。 1.什么是对象池技术? 对象池技术是一种
前言 我们的API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。 我们每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具fd看到请求的URL链接,然后c
延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。 延迟任务的常见使用场景有以下几个:
我是一名优秀的程序员,十分优秀!