微服务面试题

一.计算机软件架构发展

  1. 单体架构你觉得存在什么缺陷?(容量、计算、故障)
  2. 为什么要使用分布式架构?(增加容量、高并发、高性能、高可用)
  3. 分布式架构有什么劣势?(设计的难度、维护成本)
  4. 为什么要使用缓存?(减少数据库访问压力、提高性能)
  5. 使用缓存时要注意什么问题?(一致性、淘汰算法、击穿、雪崩)
  6. 如何理解反向代理?(服务端代理,是服务端服务器的一种代理机制,请求转发)
  7. 反向代理如何实现负载均衡?(轮询,轮询+权重,哈希IP)
  8. 什么是读写分离、读写分离的目的是什么?(单机数据库有瓶颈、读写频次,并发能力)
  9. 读写分离后可能会带来什么问题?(数据同步)
  10. 当我们向写库写数据时还要做什么?(写缓存、数据同步到读库)
  11. 为什么要进行分库、分表,有哪些分表策略?(业务数据可靠性、查询性能)
  12. 何为服务,有什么是微服务?(服务-软件要解决的问题,可以提供的功能。微服务-服务中的共性再抽象,以实现更好的重用)
  13. 哪种互联网架构设计最好?(没有最好,只有更好,脱离业务谈就够就是耍流氓)

二.SpringCloud Alibaba微服务解决方案

Spring Cloud Alibaba 默认提供了如下核心功能(先了解):

  • 服务限流降级:
  • 默认支持 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:
  • 基于Spring Cloud 服务注册与发现标准,借助Nacos进行实现,默认还集成了 Ribbon 的支持。
  • 分布式配置管理:
  • 基于Nacos支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:
  • 基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:
  • 使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 分布式任务调度:
  • 提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker上执行。
  • *总结
  • 总之,微服务是一个架构设计方式,此架构中的每个服务(service)都是针对一组功能而设计的,并专注于解决特定的问题。如果开发人员逐渐将更多代码增加到一项服务中并且这项服务变得复杂,那么可以将其拆分成多项更小的服务(软件即服务,所有软件对外的表现形式就诗提供一种或多种业务服务)。接下来进行独立的开发、测试、部署、运行、维护。进而更好,更灵活的处理客户端的请求并提高系统的可靠性,可扩展性。
     

三.注册中心简介

微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。

Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下:https://nacos.io/zh-cn/docs/quick-start.html

  1. 为什么要将服务注册到nacos?(为了更好的查找这些服务)
  2. 在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)
  3. 对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)
  4. 服务消费方是如何调用服务提供方的服务的?(RestTemplate)

服务负载均衡设计及实现(重点)LoadBalancerClient应用
业务描述
一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?

                                                                        详情请看雷神!

  1. @Bean注解的作用?(一般用于配置类内部,描述相关方法,用于告诉spring此方法的返回值要交给spring管理,bean的名字默认为方法名,假如需要指定名字可以@Bean(“bean的名字”),最多的应用场景是整合第三方的资源-对象)
  2. @Autowired注解的作用?(此注解用于描述属性,构造方法,set方法等,用于告诉spring框架,按找一定的规则为属性进行DI操作,默认按属性,方法参数类型查找对应的对象,假如只找到一个,则直接注入,类型多个时还会按照属性名或方法参数名进行值的注入,假如名字也不同,就出报错.)
  3. Nacos中的负责均衡底层是如何实现的?(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
  4. Ribbon 是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)
  5. Ribbon 可以解决什么问题? (基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口)
  6. Ribbon 内置的负载策略都有哪些?(8种,可以通过查看IRule接口的实现类进行分析)
  7. @LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。)
  8. 我们可以自己定义负载均衡策略吗?(可以,基于IRule接口进行策略定义,也可以参考NacosRule进行实现)
     

     基于Feign的远程服务调用(重点)

 

 Feign应用过程分析(底层逻辑先了解):“”不好看的东西“
1)通过 @EnableFeignCleints 注解告诉springcloud,启动 Feign Starter 组件。
2) Feign Starter 会在项目启动过程中注册全局配置,扫描包下所由@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
3) Feign接口被调用时,底层代理对象会将接口中的请求信息通过编码器创建 Request对象,基于此对象进行远程过程调用。
4) Feign客户端请求对象会经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
5) Feign客户端会携带 Request 调用远端服务并返回一个响应。
6) Feign客户端对象对Response信息进行解析然后返回客户端。
 

  1. 为什么使用feign?(基于Feign可以更加友好的实现服务调用,简化服务消费方对服务提供方方法的调用)。
  2. @FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
  3. Feign方式的调用,底层负载均衡是如何实现的?(Ribbon)
  4. @EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)
  5. 何为注册中心?(用于记录服务信息的一个web服务,例如淘宝平台,滴滴平台,美团外卖平台,……)
  6. 注册中心的核心对象?(服务提供方,服务消费方,注册中心-Registry)
  7. 市面上常用注册中心?(Google-Consul,Alibaba-Nacos,…)
  8. Nacos是什么,提供了什么特性(服务的注册、发现、配置)?
    你为什么会选择Nacos?(活跃度、稳定、性能、学习成本)
  9. 分析
    Nacos的官网?(nacos.io)
    Nacos在github的源码?(github.com/alibaba/nacos)
    Nacos在windows环境下安装?(解压即可使用)
    Nacos在windows中的的初步配置?(application.properties访问数据库的数据源)
    Nacos服务注册的基本过程?(服务启动时发送web请求)
    Nacos服务消费的基本过程?(服务启动时获取服务实例,然后调用服务)
    Nacos服务负载均衡逻辑及设计实现?(Ribbon)
    注册中心的核心数据是什么?(服务的名字和它对应的网络地址)
    注册中心中心核心数据的存取为什么会采用读写锁?(底层安全和性能)
    Nacos健康检查的方式?(基于心跳包机制进行实现)
    Nacos是如何保证高可用的?(重试,本地缓存、集群)
    RestTemplate的基本作用是什么?
    Feign是什么,它的应用是怎样的,feign应用过程中的代理对象是如何创建的(JDK)?
    Feign方式的调用过程,其负载均衡是如何实现?(Ribbon)

四.配置中心简介

配置中心最基础的功能就是存储一个键值对,用户发布一个配置(configKey),然后客户端获取这个配置项(configValue);

  • 什么是配置中心?(存储项目配置信息的一个服务)
  • 为什么要使用配置中心?(集中管理配置信息,动态发布配置信息)
  • 市场上有哪些主流的配置中心?(Apollo,nacos,……)
  1. 配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)
  2. 什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心)
  3. 项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)
  4. Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?(可以从内存,客户端获取了配置中心的配置信息以后,会将配置信息在本地内存中存储一份.)
  5. 微服务应用中我们的客户端如何获取配置中心的信息?(我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向nacos配置中心发请求拉取(pull)更新的配置信息)
  6. 微服务应用中客户端如何感知配置中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息,所谓的长轮询就是没有配置更新时,会在nacos服务端的队列进行等待.)
  7. 服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,配置文件名字bootstrap.yml,配置中心的dataId名字是否正确,分组是否正确,配置的名字是否正确,缩进关系是否正确,假如是动态发布,类上是否有@RefreshScope注解)
  8. 你项目中使用的日志规范是什么?(SLF4J)
  9. 你了解项目中的日志级别吗?(debug,info,error,…,可以基于日志级别控制日志的输出)
  10. Nacos配置管理模型的背景?(环境不同配置不同)
  11. Nacos配置中的管理模型是怎样的?(namespace,group,service/data-id)
  12. Nacos客户端(微服务)是否可以读取共享配置?(可以)
  13. 配置中心的选型。(市场活跃度、稳定性、性能、易用)
  14. Nacos配置中心基本应用。(新建,修改、删除配置以后,在Nacos客户端应用配置)
  15. 配置管理模型应用。(namespace,group,service/dataId)
  16. Nacos配置变更的动态感知。(底层原理分析)
  17. 为什么需要配置中心?(动态管理发布配置,无需重启服务,更好保证服务的可用)
    配置中一般要配置什么内容?(经常变化的配置数据-日志级别,线程池、连接池、…)
    市面上有哪些主流配置中心?(Nacos,….)
    配置中心选型时要重点考虑哪些因素?(市场活跃度、稳定性、性能、易用)
    Nacos客户端(微服务业务)如何动态感知配置中心数据变化的?(nacos2.0之前nacos客户端采用长轮询机制每隔30秒拉取nacos配置信息.)
    Nacos配置管理模型是怎样的?(命名空间-namespace,分组-group,服务实例-dataId)
     

 五.Sentinel简介

Sentinel核心分为两个部分:

  • 核心库(Java 客户端):能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行
  • 安装Sentinel服务

    Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能,其控制台安装步骤如下:
    第一步:打开sentinel下载网址,(这个网址很难打开)

    https://github.com/alibaba/Sentinel/releases

在sentinel对应目录,打开命令行(cmd),启动运行sentinel :java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

  1. Sentinel是什么?(阿里推出一个流量控制平台,防卫兵)
  2. 类似Sentinel的产品你知道有什么?(hystrix-一代微服务产品)
  3. Sentinel是如何对请求进行限流的?(基于sentinel依赖提供的拦截器)
  4. 你了解哪些限流算法?(计数器、令牌桶、漏斗算法,滑动窗口算法,…)
  5. Sentinel 默认的限流算法是什么?(滑动窗口算法)
     

1.关联模式:

 

2.链路模式

 

 

 

 

  1. 你了解sentinel中的阈值应用类型吗?(两种-QPS,线程数)
  2. Sentinel的限流规则中默认有哪些限流模式?(直连,关联,链路)
  3. Sentinel的限流效果有哪些?(快速失败,预热,排队)

  1. 何为降级熔断?(让外部应用停止对服务的访问,生活中跳闸,路障设置-此路不通)
  2. 为什么要进行熔断呢?(平均响应速度越来越慢或经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)
  3. Sentinel中限流,降级的异常父类是谁?(BlockException)
  4. Sentinel 出现降级熔断时,系统底层抛出的异常是谁?(DegradeException)
  5. Sentinel中异常处理接口是谁?(BlockExceptionHandler)
  6. Sentinel中异常处理接口下默认的实现类为? (DefaultBlockExceptionHandler)
  7. 假如Sentinel中默认的异常处理规则不满足我们的需求怎么办?(自己定义)
  8. 我们如何自己定义Sentinel中异常处理呢?(直接或间接实现BlockExceptionHandler )
  9. Sentinel熔断降级策略有哪些?(慢调用比例、异常比例、异常数)
     

  1. 如何理解热点数据?(访问频度比较高的数据,某些商品、谋篇文章、某个视频)
  2. 热点数据的限流规则是怎样的?(主要是针对参数进行限流设计)
  3. 热点数据中的特殊参数如何理解?(热点限流中的某个参数值的阈值设计)
  4. 对于热点数据的访问出现限流以后底层异常是什么?(ParamFlowException)

  1. 如何理解sentinel中的系统规则?(是对所有链路的控制规则,是一种系统保护策略)
  2. Sentinel的常用系统规则有哪些?(RT,QPS,CPU,线程,Load-linux,unix)
  3. Sentinel系统保护规则被触发以后底层会抛出什么异常?(SystemBlockException)
     

 

  1. 如何理解Sentinel中的授权规则?(对指定资源的访问给出的一种简易的授权策略)
  2. Sentinel的授权规则是如何设计的?(白名单和黑名单)
  3. 如何理解Sentinel中的白名单?(允许访问的资源名单)
  4. 如何理解Sentinel中的黑名单?(不允许访问的资源名单)、
  5. Sentinel如何识别白名单和黑名单?(在拦截器中通过调用RequestOriginParser对象的方法检测具体的规则)
  6. 授权规则中RequestOriginParser类的做用是什么?(对流控应用值进行解析,检查服务访问时传入的值是否与RequestOriginParser的parseOrigin方法返回值是否相同。)

总结(Summary)

总之,Sentinel可为秒杀、抢购、抢票、拉票等高并发应用,提供API接口层面的流量限制,让突然暴涨而来的流量用户访问受到统一的管控,使用合理的流量放行规则使得用户都能正常得到服务。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值