SpringCloud常见面试题

【1】什么是微服务?

微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、相互配合,为用户提供最终价值。服务之间采用轻量级的通信机制相互沟通(通常是基于HTTP的Restful API),每个服务都围绕着具体的业务进行构建,并且能够被独立的构建在生产环境、类生产环境等。另外,应避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。

【2】什么是SpringCloud?

SpringCloud是一个服务治理平台,是一系列框架的有序集合,提供了全套的分布式系统解决方案。微服务技术氛围SpringCloud Netfix公司研发的一代产品,和SpringCloudAlibaba研发的二代产品。一代产品用过eureka服务生产者与消费者技术,Feign远程调用技术,SpringCloudConfig配置中心配置那些经常改变的动态配置,网关Gateway,服务容错处理Hystix技术;二代产品用过Nacos注册中心,配置中心,远程调用Feign技术,网关Gateway技术,服务容错Sentinel技术

【3】SpringBoot和SpringCloud的区别?

SpringCloud专注于快速方便的开发单个个体微服务。SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等继承服务。

SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系,SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

SpringCloud常见的组件有:nacos、openfeign、gateway、sentinel、seate等

【4】说说RPC的实现原理

RPC指的是服务之间的远程调用。

首先需要有处理网络连接通讯的模块,负责连接建立、管理和消息的传输。其次需要有编 解码的模块,因为网络通讯都是传输的字节码,需要将我们使用的对象序列化和反序列化。剩下的就是客户端和服务器端的部分,服务器端暴露要开放的服务接口,客户调用服务接口的一个代理实现,这个代理实现负责收集数据、编码并传输给服务器然后等待结果返回。

RestTemplate模版、feign、OpenFeign都是RPC的实现

【5】CAP定理

CAP定理:指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),三折不可同时获得

一致性(C):所有节点都可以访问到最新的数据

可用性(A):每个请求都是可以得到响应的,不管请求是成功还是失败

分区容错性(P):除了全部整体网络故障,其他故障都不能导致整个系统不可用

CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡。

【6】说一下Eureka工作原理?

不管是服务消费者和服务提供者都是Eureka的客户端,注册中心是Eureka的服务端。

1)Eureka客户端和Eureka服务端的通讯过程如下:

  1. 服务提供者将服务注册到注册中心
  2. 注册中心显示服务提供者的所有列表
  3. 注册中心每隔30秒检测服务提供者的心跳状态,如果异常就从列表中删除
  4. 服务消费者从注册中心列表中获得健康的服务提供者地址
  5. 服务消费者通过地址远程调用服务提供者

2)搭建步骤:

  1. 创建子模块
  2. 引入eureka服务端启动器——>spring-cloud-starter-netflix-eureka-server
  3. 编写启动类,添加注解@EnableEurekaServer,开启Eureka注册中心服务
  4. 编写配置文件eureka服务本身也要注册到注册中心

3)服务注册和服务发现

  • 服务注册:将其他服务注册到注册中心时需要引入eureka客户端启动器——>spring-cloud-starter-netflix-eureka-client 并在配置文件中进行配置。
  • 服务发现:在服务注册的基础上,将service层硬编码ip地址换成服务名即可。

【7】介绍nacos?

Nacos是Alibaba出品的服务注册中心与配置中心技术,结合OpenFeign能实现微服务之间的同步调用。

实现过程:

  1. 引入spring-cloud-alibaba依赖
  2. 引入nacos-discovery依赖——>spring-cloud-starter-alibaba-nacos-discovery
  3. 引入OpenFeign依赖

【8】Nacos与Eureka对比

  1. Nacos与eureka的共同点
    1. 都支持服务注册和服务拉取
    2. 都支持服务提供者心跳方式做健康检测
  2. Nacos与Eureka的区别
    1. Nacos支持服务端主动监测提供者状态:临时实例采用心跳模式,非临时实例采用主动监测模式
    2. 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    3. Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    4. Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式。

【9】eureka自我保护机制是什么?

当Eureka Server节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。

【10】Nacos的服务注册表结构是怎样的?

Nacos采用了数据的分级存储模型,最外层是NameSpace,用来隔离环境。然后是Group,用来对服务分组。接下来就是服务(Service)了,一个服务包含多个实例,但是可能处于不同机房,因此Service下有多个集群(Cluster),Cluster下是不同的实例(Instance)。

对应到Java代码中,Nacos采用了一个多层的Map来表示。结构为Map<String, Map<String, Service>>,其中最外层Map的key就是namespaceId,值是一个Map。内层Map的key是group拼接serviceName,值是Service对象。Service对象内部又是一个Map,key是集群名称,值是Cluster对象。而Cluster对象内部维护了Instance的集合。

 

【11】Nacos如何支撑阿里内部数十万服务注册压力?

Nacos内部接收到注册的请求时,不会立即写数据,而是将服务注册的任务放入一个阻塞队列就立即响应给客户端。然后利用线程池读取阻塞队列中的任务,异步来完成实例更新,从而提高并发写能力。

【12】Nacos如何避免并发读写冲突问题?

Nacos在更新实例列表时,会采用CopyOnWrite技术,首先将旧的实例列表拷贝一份,然后更新拷贝的实例列表,再用更新后的实例列表来覆盖旧的实例列表。这样在更新的过程中,就不会对读实例列表的请求产生影响,也不会出现脏读问题了。

【13】什么是Ribbon?

ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。feign默认集成了ribbon。

【14】负载平衡的意义什么?

在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多 种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免 任何单一资源 的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

【15】什么是 feigin ?它的优点是什么?

  1. feign采用的是基于接口的注解

  2. feign整合了ribbon,具有负载均衡的能力

  3. 整合了Hystrix,具有熔断的能力

使用:

  1. 添加pom依赖。

  2. 启动类添加@EnableFeignClients

  3. 定义一个接口 @FeignClient(name=“xxx”)指定调用哪个服务

【16】Ribbon和Feign的区别?

  1. 都是调用其他服务的,但方式不同。

  2. 启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients

  3. 服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。

  4. 调用方式不同,Ribbon需要自己构建http请求,模拟http请求

【17】Ribbon有哪几种负载均衡策略,默认策略是什么?

  1. RoundRobinRule:轮询策略 按照一定的顺序依次调用服务实例。比如一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务3,依次类推

  2. WeightedResponseTimeRule :权重策略,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。

  3. RandomRule:随机策略 从服务提供者的列表中随机选择一个服务实例

  4. RetryRule:重试策略 按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。

  5. BestAvailableRule:最⼩连接数策略 也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。

  6. AvailabilityFilteringRule:可⽤过滤策略 先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。

  7. ZoneAvoidanceRule:区域权衡策略(默认策略) 根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。

Ribbon 是 Spring Cloud 技术栈中非常重要的基础框架,它为 Spring Cloud 提供了负载均衡的能力,比如 Fegin 和 OpenFegin 都是基于 Ribbon 实现的,就连 Nacos 中的负载均衡也使用了 Ribbon 框架。

【18】 什么是服务熔断?什么是服务降级?

熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时, 会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微 服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Sentinel实现。

服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用, 比直接挂掉强。

熔断:

@RestController
public class ExampleController {
 
    @Autowired
    private RestTemplate restTemplate;
 
    @GetMapping("consumer")
    @SentinelResource(value = "example-consumer",
            fallback = "handleFallback", // 定义 fallback 函数
            blockHandler = "handleBlock") // 定义 blockHandler 函数
    public String consumer() {
        return restTemplate.getForObject("http://example-provider/provider", String.class);
    }
 
    // fallback 函数要求:
    // 1. 返回类型跟原函数相同;
    // 2. 参数列表只需要加一个 Throwable 类型的参数,用于接收原函数的异常信息
    public String handleFallback(Throwable ex) {
        System.out.println("Fallback:" + ex.getMessage());
        return "Fallback:" + ex.getMessage();
    }
 
    // blockHandler 要求:
    // 1. 方法签名需要和原方法相同;
    // 2. 参数列表需要增加一个 BlockException 类型参数,用于接收对应的异常信息
    public String handleBlock(BlockException ex) {
        System.out.println("BlockHandler:" + ex.getMessage());
        return "BlockHandler:" + ex.getMessage();
    }
 
}

降级:

@FeignClient(name = "example-provider", fallback = ExampleFeignFallback.class) 
public interface ExampleFeignClient {

    @GetMapping("/provider")
    String provider();
}


@Component
public class ExampleFeignFallback implements ExampleFeignClient {

    @Override
    public String provider() {
        return "fallback";
    }
}

【19】Spring Cloud Gateway是如何工作的 答:请求到达Spring Cloud Gateway,如果Gateway Handler Mapping能根据配置条件找到对应的服务,便会交由Gateway Web Handler进行处理,Gateway Web Handler会先执行“pre” filter逻辑,然后执行服务接口业务逻辑,最后执行“post” filter逻辑

【20】Spring Cloud Gateway主要有什么作用 答:Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1

  • 路由转发:这是网关最主要的功能,通过配置统一将请求转发至相应的服务,否则客户端需多次请求不同的微服务,增加客户端代码或配置编写的复杂性,目前官网给出的配置条件有:After(某个时间后的请求转发至该服务)、Before(某个时间前的请求转发至该服务)、Between(某个时间范围的请求转发至该服务)、Cookie(匹配到对应的Cookie值)、Header(匹配到对应的Header值)、Host(匹配到对应的域名)、Method(匹配到对应的get/post请求)、Path(匹配到对应的url)、Query(匹配到对应的参数)、RemoteAddr(匹配到对应的RemoteAddr)、Weight(设定分流的权重)

  • 熔断:在服务出现宕机时,网关会进行熔断,转发至熔断接口进行请求,通过配置FallbackHeaders GatewayFilter Factory从而引入Hystrix进行熔断

  • 限流:当请求数过大时,我们需要对请求数进行限制,避免服务因此宕机,通过配置RequestRateLimiter GatewayFilter Factory对请求进行限流

  • 鉴权:网关层可以对请求进行统一鉴权,比如客户的登录的登录状态,通过实现Global Filters可完成全局的鉴权,实现Gateway Filter可完成单个路由的鉴权

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值