微服务系统面经

news2024/11/26 0:57:00

微服务架构

秒杀微服务架构图

系统架构图

项目地址可以参考:秒杀系统

1 一个java的微服务系统中有几个网关?

在一个Java的微服务系统中,网关的数量并不固定,这完全取决于系统的设计和需求。网关服务是微服务架构中的重要组件,它通常负责路由、认证、授权、限流、熔断、负载均衡等功能,为微服务提供统一的入口。

以下是几种可能的网关设计策略:

  1. 单一网关:在一些简单的微服务架构中,可能只有一个网关服务,负责处理所有进入系统的请求。

  2. 多网关:在更复杂的微服务架构中,可能会有多个网关,每个网关负责处理特定类型的请求。例如,可以有一个网关专门用于处理内部服务间的通信,另一个网关用于处理外部用户的请求。

  3. 分域网关:在某些大规模或者多租户的微服务架构中,可能会根据业务领域或者租户划分多个网关。

在实际的系统设计中,微服务的网关数量取决于多种因素,包括系统的规模、业务复杂度、性能要求、安全性要求等等。所以,并没有一个固定的答案来确定微服务系统中应该有几个网关。

2 你说的单一网关的情况,流量来自于微服务系统内部吗还是用户呢?

在一个单一网关的微服务架构中,这个网关通常处理来自于两个主要源的流量:

  1. 外部用户:网关负责处理所有从外部用户或者第三方系统发出的请求。这可能包括来自于用户界面的请求、来自于第三方API的请求,或者其他来源的请求。

  2. 内部服务:网关还可能负责处理来自于系统内部的服务间通信。例如,一个服务可能需要通过网关请求另一个服务的资源。

这个单一网关成为了所有请求的统一入口,提供了路由、认证、授权、限流、熔断、负载均衡等功能。然而,这种设计也可能带来一些问题,例如单点故障、性能瓶颈等。因此,在设计微服务系统时,需要根据实际的需求和约束来选择合适的网关策略。

3 微服务系统内部的调用,比如A调用服务B这种需要经过网关吗?

在微服务系统的设计中,服务之间的调用是否需要经过网关取决于具体的设计决策。这主要受到以下两种设计模式的影响:

  1. 直接服务调用:在某些情况下,一个服务(服务A)可能会直接调用另一个服务(服务B)。这种设计模式允许服务之间的通信不需要经过网关,通常可以提高性能并减少延迟。然而,这种模式需要在每个服务中实现鉴权、限流等功能,可能会增加设计和开发的复杂性。

  2. 通过网关调用:在另一些情况下,服务之间的调用可能需要经过网关。这种设计模式允许所有的服务间通信都通过同一点进行,可以在这一点上实现统一的鉴权、限流、熔断等功能。这种模式可以简化服务的设计和开发,但可能会增加延迟并成为系统的单点故障。

以上都是可能的设计决策,实际的选择取决于微服务系统的具体需求和约束。例如,对于一些非常大或者复杂的微服务系统,可能会选择混合的模式,其中一部分服务调用通过网关,而另一部分服务调用则直接进行。

4 哪些大公司的微服务系统使用了网关实现鉴权、限流、熔断等功能?

5 那nginx不也算是一种网关吗? 和 一般我们说的网关有什么区别?

Nginx是一个开源的Web服务器,同时也可以用作反向代理服务器、邮件代理服务器以及通用的TCP/UDP代理服务器。在微服务架构中,Nginx常常被用作一个网关,负责处理来自外部的请求并将其路由到合适的服务。

然而,Nginx本质上是一个反向代理服务器,它的主要职责是接受来自客户端的请求并将其转发到后端的服务器,然后将后端服务器的响应返回给客户端。Nginx可以处理静态内容,提供负载均衡和TLS/SSL处理等功能。

当我们在微服务中谈论网关时,通常指的是API网关。API网关是微服务架构的一部分,它提供了比Nginx更多的功能,包括请求路由、服务发现、负载均衡、身份验证和授权、限流和熔断、API组合和协议转换等。

简单来说,Nginx可以作为一个简单的API网关,但在微服务中,我们通常会使用一些更强大的工具作为API网关,例如Zuul,Spring Cloud Gateway,Kong等。这些工具可以提供更为复杂和强大的功能,以满足微服务架构的需求。

6 所以说nginx不是单独部署,而是类似于tomcat,netty服务器那样存在于每一个微服务的实例中?

不完全是这样。Nginx实际上通常被部署为一个独立的服务,它作为一个反向代理,坐在所有后端微服务前面。它接收从客户端发出的请求,然后将这些请求转发给相应的微服务。

举个例子,假设你有一个微服务架构,其中包含一个用户服务、一个订单服务和一个产品服务。你可以在这些服务前面部署一个Nginx服务,当收到一个请求时,Nginx可以根据请求的URL和其他规则将请求转发给用户服务、订单服务或产品服务。

Nginx和Tomcat、Netty这些应用服务器的关系是不同的。Tomcat和Netty通常被部署在每个微服务的实例中,它们负责接收并处理从Nginx(或其他反向代理)转发过来的请求。

在微服务架构中,你可能会有多个Nginx实例以实现负载均衡和故障转移。例如,你可能会在一个负载均衡器(如Amazon ELB或Google Cloud Load Balancer)后面运行多个Nginx实例。当负载均衡器接收到一个请求时,它可以将请求转发给任何一个可用的Nginx实例。然后,Nginx实例将请求转发给相应的微服务。

所以,Nginx并不是存在于每一个微服务实例中,而是作为反向代理存在于微服务和客户端之间。

7 一个java微服务项目的api-gateway子项目,如何写代码才能让流量走自己这儿

在Java的微服务架构中,API Gateway子项目的主要任务是接收所有来自客户端的请求,并将这些请求路由到相应的服务。如果你正在使用Spring Cloud(一种流行的Java微服务框架),你可以使用Spring Cloud Gateway或者Netflix Zuul作为你的API网关。

以下是一个简单的例子,说明如何使用Spring Cloud Gateway作为API网关:

  1. 首先,你需要在你的项目中加入Spring Cloud Gateway的依赖。在你的pom.xml文件中,添加以下代码:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 然后,你需要在你的application.yml或者application.properties文件中定义路由规则。例如:
spring:
  cloud:
    gateway:
      routes:
      - id: user_service
        uri: lb://user-service
        predicates:
        - Path=/user/**
      - id: order_service
        uri: lb://order-service
        predicates:
        - Path=/order/**

在这个例子中,所有以/user/开头的请求将被路由到用户服务,所有以/order/开头的请求将被路由到订单服务。

  1. 最后,确保你的API网关服务在所有微服务的前面,也就是说,所有来自客户端的请求首先到达API网关服务,然后由API网关服务将请求路由到相应的服务。

需要注意的是,上面的例子假设你已经设置好了服务发现(如Eureka或Consul),并且你的其他微服务已经注册到了服务发现中。lb://user-servicelb://order-service这样的URI表示这些请求将被路由到注册到服务发现中的对应服务。

8 spring cloud是不是一种rpc框架还是什么

Spring Cloud是一种构建和管理微服务的框架,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线等)中常用模式的实现。所以,它并不是一个RPC框架,而是一个用于构建、部署和管理微服务的工具集。

RPC(Remote Procedure Call,远程过程调用)框架是一种通讯协议,它允许在一个网络中的一台计算机(客户端)调用另一台计算机(服务器)上的程序或者服务。常见的Java RPC框架有Dubbo、gRPC等。

Spring Cloud可以和这些RPC框架配合使用,实现微服务之间的通讯。例如,Spring Cloud提供了对gRPC的支持,可以方便地在Spring Cloud应用中使用gRPC。

另外,Spring Cloud主要基于HTTP/REST进行通信,但也支持其他通讯方式。例如,Spring Cloud Stream支持使用消息中间件(如RabbitMQ、Kafka)进行异步通讯,Spring Cloud OpenFeign提供了声明式的REST客户端等。

所以,Spring Cloud和RPC框架在微服务架构中扮演的角色是不同的,但他们可以一起使用,实现微服务的分布式通讯。

9 spring cloud的各大功能模块应该是解耦合的吧

是的,Spring Cloud的设计理念是微服务架构中各种通用模式的解耦合实现。它包含一系列的子项目(模块),这些模块大多都是可插拔的,并且可以根据具体的需求和场景来选择使用。每个模块都关注于微服务架构中的一个特定领域。以下是一些主要的Spring Cloud模块:

  1. Spring Cloud Netflix:提供了一系列Netflix OSS组件的集成,包括Eureka(服务发现)、Hystrix(断路器)、Zuul(API网关)、Ribbon(客户端负载均衡)等。

  2. Spring Cloud Gateway:作为Spring Cloud Netflix Zuul的替代品,提供了一种构建API网关的简单方式。

  3. Spring Cloud Config:用于集中式配置管理,支持从远程服务器(如Git)读取配置。

  4. Spring Cloud Sleuth:用于分布式追踪,兼容Zipkin。

  5. Spring Cloud OpenFeign:提供了一种声明式的REST客户端。

  6. Spring Cloud Stream:用于构建消息驱动的微服务,支持多种消息中间件。

  7. Spring Cloud Bus:用于传播集群中的状态变化或事件,以实现服务之间的通信。

  8. Spring Cloud Security:在微服务下提供安全机制,如OAuth2。

每个Spring Cloud模块都有自己的依赖,可以单独引入到项目中。因此,可以根据项目需求选择使用哪些模块,从而在微服务的开发中实现功能的解耦。

10 URL和URI的区别,为什么api网关进行路由时使用了URI?

URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)都是用于识别资源的字符串,它们的设计目的是为了在网络上定位和获取资源。然而,它们之间有一些重要的区别。

  • URI:是一个字符串,用来唯一标识抽象或物理资源的标准。它的目的是为了在网络上识别某一实体或者说是资源。它包括两个部分,URL和URN(Uniform Resource Name)。

  • URL:是URI的一个子集,也是一个字符串,表示某一互联网上可达的资源。它表示的是资源的地点(在互联网上的位置)。它的语法包括协议、域名、端口、路径等部分。

简单来说,每个URL都是URI,但并非每个URI都是URL。因为URI还包括URN,URN只命名资源而不指定如何定位资源。

在进行路由时,通常使用URI而不是URL,原因如下:

  • 使用URI可以提供更大的灵活性。比如在你的配置中的“lb://user-service”,这个URI并没有提供具体的位置信息(如IP地址和端口),而是提供了一个逻辑名。这个逻辑名在运行时会被解析成实际的位置,这样就可以在不改变配置的情况下动态地改变服务的位置。

  • 使用URI可以更好地抽象服务。在微服务架构中,我们通常不关心服务的具体位置,而是关心服务的功能。通过使用URI,我们可以将服务当作一个黑盒,不关心服务的内部实现和位置,只关心服务的接口和行为。这是微服务架构的一种重要理念。

11 一个微服务系统应该有鉴权中心,什么时候请求会经过它呢?

一个微服务系统的鉴权中心(通常被称为认证中心或授权中心)主要负责系统的用户认证(确定用户是谁)和授权(确定用户可以做什么)。

以下是几种常见的情况,请求可能会经过鉴权中心:

  1. 用户登录: 用户在进行登录操作时,请求会发送到鉴权中心。鉴权中心会验证用户的凭据(如用户名和密码),如果凭据有效,它将发放一个token给用户,以标记用户的会话状态。

  2. 服务间调用: 在微服务架构中,服务之间可能会互相调用。为了保证服务间调用的安全性,通常也会经过鉴权中心进行鉴权和授权。例如,服务A调用服务B之前,可能需要先向鉴权中心请求一个授权令牌。

  3. 访问受保护资源: 当用户尝试访问受保护的资源时(比如某个需要特定权限才能访问的API),请求需要经过鉴权中心。鉴权中心会检查用户的token,然后决定用户是否有足够的权限来访问这个资源。

在实际的设计中,为了提高性能和可用性,鉴权中心的部分功能可能会通过其他组件实现,比如使用API网关来进行token的检查,使用分布式缓存来保存token等。但无论怎样,鉴权中心都是整个系统中负责处理安全问题的核心组件。

12 如果使用jwt,是不是就可以让API网关进行token检查

是的,你的理解是正确的。使用JWT(JSON Web Token)可以让API网关来进行Token检查,而不需要每次请求都去鉴权中心(例如一个OAuth2服务器)验证。这种方法可以大大提高系统的性能,因为API网关通常会比鉴权中心更接近服务的调用者。

JWT是一种开放标准(RFC 7519),它定义了一种简洁的,自包含的方法用于通信双方之间安全地传输信息。JWT可以通过数字签名(例如使用HMAC算法或者RSA)来验证这个信息,并且可以被加密。

在微服务架构中,一种常见的使用JWT的场景是:鉴权中心在用户登录成功后,生成一个JWT,然后将这个JWT作为令牌发放给用户。当用户向API网关发送请求时,会在请求的头部(通常是Authorization头部)携带这个令牌。API网关收到请求后,可以使用预先共享的秘钥来验证JWT的签名,然后解析JWT中的payload部分,从而获取到用户的身份信息和权限信息。

使用JWT的好处是:一旦JWT被生成,就可以独立验证和解析,无需再去查询数据库或者鉴权中心,这样可以大大减轻鉴权中心的负载,并且提高系统的响应速度。

12.1 jwt的校验机制

13 一个ip地址为什么可以对应多个这样的域名呢

在这里插入图片描述

13.1 我可以增加一个这样的映射吗?比如 127.0.0.1 secondkill-user.xxx

可以的。你可以在你的hosts文件中添加任何你需要的域名到IP地址的映射,包括子域名。例如,你可以添加127.0.0.1 secondkill-user.xxx到你的hosts文件。

这样,当你的应用或者你的浏览器试图连接到secondkill-user.xxx时,系统将会把它解析为127.0.0.1。但是请记住,这个配置只在你的本地机器上有效。对于其他机器或者在互联网上,secondkill-user.xxx的解析需要一个真实的DNS服务器来处理。

同样要注意的是,如果你正在使用的域名(在这个例子中是.xxx)是一个真实的顶级域名,那么在真实的网络环境中这可能会导致冲突。因此,当你在开发环境中使用hosts文件映射时,通常会使用不存在的顶级域名,例如.local.test等。

14 springboot中的tomcat

在这里插入图片描述

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

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

相关文章

架构训练营学习笔记:4-4如何设计存储架构?

存储架构设计的三个步骤 分为&#xff1a;1 估算性能需求 2、选择存储系统 3 设计存储方案 性能估算步骤 一 用户量预估 2B的业务&#xff0c;数据量需要预估&#xff0c;2C的需要决策。 方法&#xff1a; 规划&#xff1a;根据成本、预算、目标等确定 推算&#xff1a;基于…

SRA数据下载的一个坑

前两天协助处理GEO数据上的一个单细胞数据&#xff0c;发现了一个巨坑&#xff0c;这里分享下&#xff0c;希望大家能避开。 需要下载的数据集是&#xff0c;GSE119562&#xff0c;查询SRA Run Selector&#xff0c;找到它对应的SRR编号。 于是&#xff0c;我非常熟练的用pref…

【接口自动化测试】HTTP协议详解

协议 简单理解&#xff0c;计算机与计算机之间的通讯语言就叫做协议&#xff0c;不同的计算机之间只有使用相同的协议才能通信。所以网络协议就是为计算机网络中进行数据交换而建立的规则&#xff0c;标准或约定的集合。 OSI模型 1978年国际化标准组织提出了“开放系统互联网…

java实现敏感词过滤,简单实例,dfa算法

java实现敏感词过滤&#xff0c;简单实例&#xff0c;dfa算法 最近在看黑马的视频学习的时候&#xff0c;看到了&#xff0c;自定义敏感词过滤的&#xff0c;感觉蛮有意思的&#xff0c;记录一下。 直接上实例 第一步初始化敏感词&#xff08;可以写死&#xff0c;当然在开发…

Ceres Solver简介及使用

Ceres Solver是一个开源的C库&#xff0c;用于建模和解决大型、复杂的优化问题。它是一个成熟、功能丰富且高性能的库&#xff0c;自2010年以来一直在Google生产中使用。最新发布版本为2.1.0,license为BSD,它支持在Windows、Linux、Mac、Android、iOS上编译&#xff0c;源码地址…

D. Black Cells

Problem - 1821D - Codeforces 思路&#xff1a;我们能够发现题意的区间是不重叠的&#xff0c;并且任意两个区间之间的间隔至少是2&#xff0c;我们会发现一个性质&#xff0c;它一定是从前缀中进行选择的&#xff0c;但是前缀中长度为1的区间可以不选择&#xff0c;因为如果长…

STM32单片机示例:使用定时器触发DMA

文章目录 前言基础说明关键配置与代码示例链接 前言 单片机中使用定时器触发DMA是比较好用的一种操作&#xff0c;这里将对此做个示例说明。 基础说明 ST官方的例程中有一个 TIM_DMA 的例程&#xff0c;其功能是启用一个定时器&#xff0c;设置其中一路通道输出PWM&#xff…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)

360全方位渗透和探究Spring的核心注解开发和实现指南 Spring的注解介绍核心基础注解核心注解分析xml文件的配置configuration的配置 Lazy && ScopeComponentScan添加Controller、Service、Repository注入到spring容器ComponentScan多包扫描的属性排除某些包或者类的扫描…

SpringBoot读取配置的6种方式

1. 概述 通过了解springboot加载配置&#xff0c;可以更方便地封装自定义Starter。 在SpringBoot中&#xff0c;可以使用以下6种方式读取 yml、properties配置&#xff1a; 使用Value注解&#xff1a;读取springboot全局配置文件单个配置。使用Environment接口&#xff1a;通过…

详解c++---异常

目录标题 c语言传统处理错误的方式c异常的使用异常的规则服务器常用的异常继承体系异常安全异常的规范异常的优缺点&#xff1a; c语言传统处理错误的方式 第一种&#xff1a; 程序在运行过程中终止了程序&#xff0c;比如说assert int main() {int i 0;scanf("%d"…

5.5 python函数式编程之--返回函数、匿名函数、偏函数(暂时稍微了解即可)

1、 先回归历史&#xff1a;什么是函数函数就是通过将局部【目标】实现并封装起来&#xff0c; 后续可直接拿来用2、 函数式编程&#xff1a; 是把运算过程尽量写成一系列嵌套的函数调用一、返回函数 返回函数&#xff1a; 函数作为返回值闭包&#xff1a; 函数内部定义函…

OJ练习第138题——树中距离之和

树中距离之和 力扣链接&#xff1a;834. 树中距离之和 题目描述 给定一个无向、连通的树。树中有 n 个标记为 0…n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges &#xff0c; edges[i] [ai, bi]表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answe…

Vue项目搭建过程

Vue项目搭建过程 1、安装NodeJs 1.1 下载安装包 在 http://nodejs.cn/download/ 上下载64位安装包&#xff0c;然后进行安装&#xff0c;和普通软件的安装一样。 C:\Users\Administrator>node -v v16.13.1C:\Users\Administrator>npm -v 8.5.51.2 安装cnpm # 安装cn…

什么是「推荐系统」,有哪些主要的推荐方法?

1 什么是推荐系统 什么是推荐系统&#xff1f;根据维基百科的定义&#xff0c; 它是一种信息过滤系统&#xff0c;主要功能是预测用户对物品 的评分和偏好。这一定义回答了推荐系统的功能是过滤信息、连接用户和推送信息。将这一定义扩 展一下&#xff0c; 推荐系统就是自动联…

文献阅读:MathPrompter: Mathematical Reasoning using Large Language Models

文献阅读&#xff1a;MathPrompter: Mathematical Reasoning using Large Language Models 1. 内容简介2. 方法细节3. 实验内容4. 结论&思考 文献链接&#xff1a;https://arxiv.org/abs/2303.05398 1. 内容简介 这篇文章是今年3月份的时候微软提出的一篇工作&#xff0…

SpringBoot中间件—ORM(Mybatis)框架实现

目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 定义&#xff1a; ORM&#xff1a;Object Relational Mapping --> 对象关系映射&#xff0c;是一种程序设计技术&#xff0c;用于实现面向对象编程语言里面不同类型系统的数据之间的转换 需求背…

前端|CSS(一)| pink老师

参考视频&#xff1a;黑马程序员前端CSS3基础教程&#xff0c;前端必备基础 目录 &#x1f4da;CSS引入 &#x1f407;引入CSS样式表 &#x1f4da;CSS基础选择器 &#x1f407;标签选择器 &#x1f407;类选择器&#xff08;最常用&#xff09; &#x1f407;id选择器 …

VIM文本如何复制到系统剪切板?

今天从vim上用鼠标复制代码&#xff0c;发现把VIM当中的行号也复制进去了&#xff0c;就很麻烦&#xff0c;于是简单研究了下&#xff0c;如果vim支持clipboard的话就比较好办&#xff0c;具体支持与否&#xff0c;使用命令查看&#xff1a; vim --version | grep "clipb…

C语言指针面试题

C语言指针面试题 一.指针和数组1.一维数组2.字符数组3.二维数组 二.指针 一.指针和数组 1.一维数组 int a[] {1,2,3,4};(1)printf("%d\n",sizeof(a));// 16(2)printf("%d\n",sizeof(a0));// 4/8(3)printf("%d\n",sizeof(*a));// 4(4)printf(&…