【微服务】面试题(一)

news2024/11/15 9:18:56

 

最近进行了一些面试,这几个问题分享给大家

一、分别介绍一下微服务、分布式以及两者的区别

微服务(Microservices)和分布式系统(Distributed Systems)是两种不同的软件架构风格,虽然它们之间有些重叠,但是它们解决的问题和关注的重点有所不同。

1.1 微服务(Microservices):

1. 架构风格: 微服务是一种架构风格,其核心理念是将单个应用程序拆分成一组小型服务,每个服务都是独立的、可独立部署的单元。每个服务都有自己的进程和数据存储,通常通过轻量级通信协议进行通信,如HTTP或消息队列。

2. 强调的特点: 微服务架构强调服务之间的松耦合和独立部署,每个微服务都应该专注于解决特定领域的问题,而不是试图包含整个应用程序的所有功能。

3. 技术选型: 微服务架构通常采用多种技术栈来实现各个服务,因为每个服务都可以选择最适合自己需求的技术栈,例如使用Java的Spring Boot、Node.js、Python等。

4. 部署与扩展: 微服务可以独立部署和扩展,这意味着可以根据需要对某个服务进行水平扩展,而不会影响其他服务。

5. 适用场景: 微服务适用于大型复杂应用,特别是需要频繁变更和快速迭代的场景,因为微服务的独立部署使得团队可以更快速地发布新功能和修复bug。

1.2 分布式系统(Distributed Systems):

1. 系统范式: 分布式系统是由多个独立的计算机节点组成的系统,这些节点通过网络进行通信和协作,共同完成某个任务。分布式系统可以是一个完整的应用程序,也可以是一个底层基础设施,用于支持其他应用程序。

2. 强调的特点: 分布式系统强调将系统的不同部分分布到不同的计算机上,以提高系统的性能、可用性和可扩展性。它通常关注于解决分布式计算、数据共享、一致性和容错性等问题。

3. 技术选型: 分布式系统涉及到网络通信、数据存储、并发控制等多个领域,因此需要综合考虑多种技术选型,如消息队列、分布式数据库、一致性协议等。

4. 部署与扩展: 分布式系统的部署和扩展通常涉及到多个节点,需要考虑节点之间的通信、数据同步和负载均衡等问题。

5. 适用场景: 分布式系统适用于需要处理大量数据和高并发请求的场景,例如大型互联网应用、电子商务平台、社交网络等。

  1. 1.3 区别总结:

1. 关注点不同: 微服务更注重将应用程序拆分成独立的服务单元,强调服务之间的松耦合和独立部署;而分布式系统更关注将系统的不同部分分布到不同的计算机上,以提高系统的性能、可用性和可扩展性。

2. 粒度不同: 微服务通常更细粒度,每个服务都解决一个特定领域的问题;而分布式系统的粒度可以更大,涉及到系统中的多个组件和模块。

3. 解决的问题不同: 微服务主要解决的是大型复杂应用的开发和部署问题;分布式系统主要解决的是数据管理、并发控制和系统可扩展性等问题。

综上所述,微服务和分布式系统虽然有一定的重叠,但是它们的关注点和解决的问题有所不同,理解它们之间的区别对于设计和开发分布式应用程序至关重要。

1.4 代码示例

下面我演示了一个简单的微服务架构和一个分布式系统架构中的不同:

微服务示例:

在这个微服务示例中,用户服务、商品服务和订单服务被定义为独立的类,每个服务都有自己的功能。订单服务在创建订单时会调用用户服务和商品服务来获取所需的信息。

# 用户服务
class UserService:
    def get_user(self, user_id):
        # 模拟从数据库中获取用户信息
        return {'id': user_id, 'name': 'John Doe', 'email': 'john@example.com'}

# 商品服务
class ProductService:
    def get_product(self, product_id):
        # 模拟从数据库中获取商品信息
        return {'id': product_id, 'name': 'Laptop', 'price': 999.99}

# 订单服务
class OrderService:
    def create_order(self, user_id, product_id):
        user_info = UserService().get_user(user_id)
        product_info = ProductService().get_product(product_id)
        # 创建订单逻辑
        return {'user': user_info, 'product': product_info}

# 使用示例
order = OrderService().create_order(1, 1001)
print("Order:", order)

分布式系统示例:

在这个分布式系统示例中,用户服务、商品服务和订单服务都是简单的函数,而不是类。订单服务在创建订单时调用了远程的用户服务和商品服务来获取所需的信息。

# 分布式系统示例

# 用户服务
def user_service_get_user(user_id):
    # 模拟从远程用户服务获取用户信息
    # 在真实环境中可能会使用 RPC 或 RESTful API 等方式进行通信
    return {'id': user_id, 'name': 'John Doe', 'email': 'john@example.com'}

# 商品服务
def product_service_get_product(product_id):
    # 模拟从远程商品服务获取商品信息
    # 在真实环境中可能会使用 RPC 或 RESTful API 等方式进行通信
    return {'id': product_id, 'name': 'Laptop', 'price': 999.99}

# 订单服务
def order_service_create_order(user_id, product_id):
    user_info = user_service_get_user(user_id)
    product_info = product_service_get_product(product_id)
    # 创建订单逻辑
    return {'user': user_info, 'product': product_info}

# 使用示例
order = order_service_create_order(1, 1001)
print("Order:", order)

这两个示例的区别在于微服务示例中的服务被设计为独立的类,而分布式系统示例中的服务是简单的函数,并且通过远程调用来实现分布式通信。

二、详细介绍一下RPC与restful以及两者的区别

RPC(Remote Procedure Call)和RESTful(Representational State Transfer)是两种不同的远程通信机制,它们在设计理念、实现方式和使用场景上有很大的差异。

RPC(远程过程调用):

1. 架构风格: RPC是一种远程通信协议,它允许一个计算机程序调用另一个地址空间(通常是另一台机器上)的子程序,而不需要显式编码这个远程调用的细节。RPC的目标是让分布式应用程序的通信过程尽可能地像本地调用一样简单。

2. 通信协议: RPC通常基于二进制协议(如Google的Protocol Buffers、Apache的Thrift等)或者基于文本的协议(如JSON-RPC、XML-RPC等),它们可以在不同的编程语言和平台之间进行通信。

3. 强调方法调用: RPC强调远程方法调用的概念,客户端像调用本地方法一样调用远程服务的方法,并等待返回结果。

4. 状态管理: RPC在通信过程中通常不考虑状态管理,即请求与响应之间没有关联,每次请求都是独立的。

RESTful(表征状态转移):

1. 架构风格: RESTful是一种软件架构风格,其核心理念是使用标准的HTTP协议,并遵循一组约束条件,如统一接口、无状态性、资源标识、按需响应等。RESTful不是一种协议,而是一种设计风格,它通常基于HTTP方法(GET、POST、PUT、DELETE等)对资源进行操作。

2. 资源导向: RESTful强调对资源的操作,每个资源都有一个唯一的URI来标识,并且可以使用HTTP方法对资源进行增删改查操作。

3. 状态管理: RESTful强调无状态性,即每个请求都应该包含足够的信息来完成操作,服务器不应该保存客户端的状态信息。

4. 数据传输: RESTful通常使用JSON或者XML等标准数据格式来传输数据,使得数据在不同的系统之间能够轻松地解析和交换。

区别总结:

1. 通信方式不同: RPC强调远程方法调用,客户端像调用本地方法一样调用远程服务的方法;而RESTful则是基于HTTP协议对资源进行操作,使用HTTP方法对资源进行增删改查操作。

2. 传输数据格式不同: RPC通常基于二进制协议或者文本协议进行通信,而RESTful通常使用JSON或者XML等标准数据格式来传输数据。

3. 状态管理不同: RPC在通信过程中通常不考虑状态管理,每次请求都是独立的;而RESTful强调无状态性,服务器不保存客户端的状态信息。

4. 约束条件不同: RPC并没有明确的约束条件,可以根据具体的实现选择合适的协议和序列化方式;而RESTful则是基于一组约束条件来设计的,如统一接口、无状态性、资源标识、按需响应等。

综上所述,RPC和RESTful是两种不同的远程通信机制,它们在设计理念、实现方式和使用场景上有很大的差异,开发人员在选择时需要根据具体的需求和情况进行权衡和选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SV学习笔记(五)

文章目录 线程的使用程序和模块什么是线程线程的概念澄清 线程的控制fork并行线程语句块fork…joinfork…join_any等待所有衍生线程停止单个线程停止多个线程停止被多次调用的任务 线程的通信写在前面event事件通知的需求semaphore旗语mailbox信箱三种通信的比较和应用 参考资料…

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

[羊城杯 2020]Easyphp2 ---不会编程的崽

摆烂一周了,继续更!!题目还是简单哦。 提示明显要我们修改数据包,第一反应是修改referer。试了一下不太对。url很可能存在文件包含 使用伪协议读取一下源码吧。它过滤了base64关键字。尝试url编码绕过,这里可以使用二…

实景三维技术在推进城市全域数字化转型的作用

4月2日,国家数据局发布《深化智慧城市发展推进城市全域数字化转型的指导意见(征求意见稿)》(下称:《指导意见》),向社会公开征求意见。 《指导意见》作为推进城市数字化转型的重要文件&#xf…

11、子串-滑动窗口最大值

题解: 双端队列是一种特殊的队列,允许你在队列的两端进行插入和删除操作。在滑动窗口问题中,我们使用它来存储可能是当前窗口最大值的元素的索引。 维护队列的顺序: 当新元素进入窗口时,我们将它与队列尾部的元素进…

echarts 毕节区县地图 包含百管委、高新区 (手扣)

百度网盘 链接:https://pan.baidu.com/s/14yiReP8HT_bNCGMOBajexg 提取码:isqi

MQ简介和面试题

一,什么是MQ MQ全称是Mwessage Queue(消息队列),是在消息传输过程中保存消息的容器,多用于分布式系统之间进行通信,解耦和低耦合性 二,常见的MQ产品 RebbitMQ,RocketMQ, ActiveMQ, Kafka, ZeroMQ, MetaMQ 其中我们…

(学习日记)2024.04.06:UCOSIII第三十四节:互斥量函数接口讲解

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

一、前言 目前有一个关于通过STM32F411CEUx的I2S总线接口控制SSS1700芯片进行音频输入输出的研究。 SSS1700 是具有片上振荡器的 3S 高度集成的USB音频控制器芯片 。 SSS1700 功能支持96 KHz 24 位采样率,带外部音频编解码器(24 位/96KHz I2S 输入和输出…

工具推荐-针对Nacos利器-NacosExploitGUI_v4.0

Nacos是由阿里所开发的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 工具简介 集成Nacos的各种poc Nacos控制台默认口令漏洞(nacos,nacos)Nacostoken.secret.key默认配置(QVD-2023-6271)Nacos-clientYaml反序列化漏洞Nacos Jraft Hessian反序列化漏洞…

【Hadoop技术框架-MapReduce和Yarn的详细描述和部署】

前言: 💞💞大家好,我是书生♡,今天的内容主要是Hadoop的后两个组件:MapReduce和yarn的相关内容。同时还有Hadoop的完整流程。希望对大家有所帮助。感谢大家关注点赞。 💞💞前路漫漫&…

使用GDAL进行简单的坐标系转换

使用GDAL进行简单的坐标系转换 使用python GDAL进行简单的坐标系转换,暂时不考虑不同基准坐标系转换的精度问题。 安装环境 使用UbuntuAnaconda python 环境 conda install gdal 定义坐标系 from osgeo import gdal from osgeo import osrsrs_wgs84 osr.Spati…

ICP配准算法

配准算法 问题定义ICP(point to point)算法思想步骤分解point to point和point to plane的区别ICP配准算法的标准流程NDT 本篇将介绍配准算法,将介绍ICP(point to point)、ICP(point to plane)和NDT算法。其中ICP有两种,point to point表示通过构建点与点…

力扣347. 前 K 个高频元素

思路:记录元素出现的次数用map; 要维护前k个元素,不至于把所有元素都排序再取前k个,而是新建一个堆,用小根堆存放前k个最大的数。 为什么是小根堆?因为堆每次出数据时只出堆顶,每次把当前最小的…

文旅元宇宙|“元宇宙+”全面赋能智慧文旅场景建设

元宇宙作为下一代互联网入口,正在潜移默化的改变着人生的生活方式,不断催生新业态,带给人们前所未有的体验。元宇宙概念的崛起,正以其独特的魅力,引领着一场全新的智慧文旅革命。元宇宙,这个融合了虚拟现实…

物联网实战--入门篇之(九)安卓QT--开发框架

目录 一、QT简介 二、开发环境 三、编码风格 四、设计框架 五、总结 一、QT简介 QT是一款以C为基础的开发工具,已经包含了很多常用的库,除了基本的GUI以外,还有网络、数据库、多媒体、进程通信、串口、蓝牙等常用库,开发起来…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔:这年头工作不好找咯,大家有学历提升的赶快了,还有外出人多注意身体,没错我在深圳这边阳了,真的绝啊,最尴尬的还给朋友传染了!!! 之前三种的监听情况,监听…

Godot 4 教程《勇者传说》依赖注入 学习笔记(0):环境配置

文章目录 前言相关地址环境配置初始化环境配置文件夹结构代码结构代码运行 资源文件导入像素风格窗口环境设置背景设置,Tileap使用自动TileMap 人物场景动画节点添加站立节点添加移动动画添加 通过依赖注入获取Godot的全局属性项目声明 当前项目逻辑讲解角色下降添加代码位置问…

ssm028蜀都天香酒楼的网站设计与实现+jsp

基于JSP的蜀都天香酒楼管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定蜀都…

C语言数据结构(11)——归并排序

欢迎来到博主的专栏C语言数据结构 博主ID:代码小豪 文章目录 归并排序两个有序数组的合并归并归并排序 归并排序的代码 归并排序 两个有序数组的合并 当前有两个有序数组arr1和arr2,我们创建一个可以容纳arr1和arr2同等元素个数的新数组arr。 让一个…