[TOC]

微服务

什么是微服务?

微服务就是将单体的应用程序,拆分为了多个独立、自治的应用程序,不同的应用程序称为不同的微服务。每个服务都专注于解决特定的业务需求,可以独立部署、扩展和维护。这些微服务通过不同的技术手段达到互相协作,提高了系统的维护性和扩展性

微服务的问题及解决?

服务注册与发现

不同的微服务在不同的服务器,他们的IP地址,端口等信息可能不一样,在没有服务注册与发现组件时,确实需要将每个微服务的 IP 地址和端口信息写死在配置文件中或者代码中,每次新增或者移除服务时,需要手动修改相关联的服务的配置文件或代码。基于这个问题,有了服务注册发现组件(Eureka、Consul、ZooKeeper等)

  • 服务注册:每个微服务在启动时向注册中心注册自己的网络地址和元数据信息。注册中心会维护一个动态的服务实例列表。
  • 服务发现:服务实例从服务注册中心查询可用的服务实例列表,并根据需要选择合适的服务实例进行服务调用

配置中心

在传统的架构中,配置信息通常以硬编码的方式嵌入到应用程序的代码或配置文件中,这样一旦需要修改配置信息,就需要重新编译和部署整个应用程序。而配置中心则提供了一个集中管理和动态更新配置的机制,使得微服务的配置可以独立于应用程序进行管理。

服务间通信

不同的微服务在不同的服务器,如果一个微服务需要使用另一个微服务就需要进行通信调用,有两种方法

  • 远程过程调用:请求参数封装成消息,通过网络传输到远程节点上,远程节点接收到消息后执行相应的方法并返回结果
  • 异步消息队列:生产者将消息发布到队列中,消费者从队列中订阅并消费消息

负载均衡

负载均衡是指在分布式系统中,将请求平均地分配到多个服务器上,以实现资源的合理利用和提高系统的性能和可靠性。

服务熔断

当一个微服务发生故障或性能下降时,传统的做法是持续发送请求,等待响应。这可能导致连锁反应,使整个系统崩溃。为了防止这种情况,引入了熔断机制。

熔断器充当了保护屏障,当底层服务出现故障或超过设定的阈值时,熔断器会打开并停止发送请求,而是快速返回一个预先设定好的默认值或错误响应。这样可以防止故障服务继续拖累整个系统,并提供了服务降级的能力。

服务降级

微服务架构中的某个服务可能无法正常工作,为了保证整个系统的稳定性,可以实施降级策略。降级意味着在某些情况下,暂时放弃或替换某个服务的功能,转而使用一个简化的功能或缓存数据来响应请求。

网关

微服务架构中存在多个微服务实例,每个实例都有自己的网络地址和接口,直接访问会增加客户端的复杂性。通过引入网关,客户端只需要与网关进行交互,网关将请求转发给相应的微服务。

SpringCloud常用的组件有哪些?

服务注册发现:Eureka

负载均衡:Ribbon

远程调用:Feign

配置中心:Config

网关:Gateway

熔断限流:Hystrix

SpringCloud Aalibaba常用的组件有哪些?

Nacos:服务注册与发现、配置中心

Sentinel:熔断降级、限流保护

网关的作用和应用场景?

路由的转发:将请求转发到对应微服务

校验JWT令牌:验证JWT的合法性,对用户拦截

维护网站白名单:针对不用认证的URL全部放行,例如统一认证微服务需要放行

微服务之间是如何通讯的?

远程过程调用:请求参数封装成消息,通过网络传输到远程节点上,远程节点接收到消息后执行相应的方法并返回结果

异步消息队列:生产者将消息发布到队列中,消费者从队列中订阅并消费消息

服务熔断是什么?

当下游服务异常时,断开与上游服务的交互

服务降级是什么?

当下游服务异常触发熔断后,上游服务就不再去调用异常的服务,而是执行降级处理逻辑

常见的负载均衡策略?

常见的负载均衡策略包括以下几种:

  1. 轮询(Round Robin):将每个请求依次顺序发送到不同的微服务实例上,实现简单且均衡的负载分发。
  2. 随机(Random):随机选择一个微服务实例来处理请求,适用于负载相对均衡的场景。
  3. 最小连接数(Least Connections):根据当前各个微服务实例的连接数选择最少连接的实例进行请求处理,以达到资源更加合理利用的目的。
  4. 源IP哈希(Source IP Hash):通过哈希算法根据请求的源IP地址将相同客户端的请求始终分发到同一个微服务实例上,以保证相关联的请求始终被同一实例处理,适用于需要维持会话状态的场景。
  5. 动态权重(Dynamic Weighting):根据每个微服务实例的负载情况动态调整其权重,使负载更均衡,适用于负载不均匀的场景。

RabbitMQ

RabbitMQ如何确保消息不丢失?

持久化机制:在消息发送之前,可以将消息、队列、交换机标记为持久化,会写入磁盘,这样即使在RabbitMQ服务器故障后也能恢复。

事务机制:将一系列发送消息的操作包装在一个事务中,并且只有在事务提交成功后,这些消息才会被真正发送到目标队列。如果事务失败则可以回滚操作,从而确保消息的一致性。

消息确认机制:在生产者发送消息之后,可以等待 RabbitMQ 的确认回执。通过确认回执,生产者可以知道消息是否成功发送到 RabbitMQ。如果没有收到确认回执,生产者可以选择重新发送消息。

镜像队列机制:镜像队列是一种将队列的副本分布在多个节点上的机制。即使一个节点发生故障,其他节点上的副本仍然可以处理消息,确保消息的可靠性和高可用性。

备份交换器机制:当消息无法被路由到目标队列时,RabbitMQ会将这些消息发送到备份交换器中,从而避免消息丢失。

如何避免消息重复投递或重复消费?

  1. 消息确认机制:RabbitMQ提供了消息确认机制,包括消息确认模式和事务机制。通过消息确认机制,消费者在处理完一条消息后,可以向Broker发送确认信号,告知Broker该消息已经被正确处理,然后Broker将该消息标记为已消费,避免重复消费。
  2. 去重缓存:消费者可以在处理消息前检查一个去重缓存,用于记录已经处理过的消息标识符。如果消息的标识符已经存在于缓存中,消费者可以选择忽略该消息。
  3. 唯一标识符:生产者可以为每个消息附加一个唯一的标识符。消费者可以使用该标识符来检查是否已经处理过该消息,从而避免重复消费。

ElasticSearch

正排索引与倒排索引

正排索引是从文档到关键字的映射(已知文档求关键字)

倒排索引是从关键字到文档的映射(已知关键字求文档)

SpringSecurity

SpringSecurity怎么使用?

添加依赖:在项目的构建文件(如 Maven 或 Gradle)中添加 Spring Security 的依赖项

配置 Spring Security:创建一个配置类来配置 Spring Security。

自定义用户认证:实现UserDetailsService接口,重写loadUserByUsername方法,查询数据库校验用户,将用户信息存入Redis,方法返回值是UserDetails接口类型(用户信息和权限信息列表)

自定义认证过滤器:拦截请求,获取Token,解析Token,从Redis验证Token。失败则响应失败信息,成功则将获取的用户信息和权限信息,封装到Authentication中

其他自定义的功能:登录成功处理器、登录失败处理器、认证失败处理器、授权失败处理器