【第四阶段面试题】微服务(Nacos,Sentinel,Gateway)

文章目录

  • Day01 微服务简介
      • 1.核心知识点
      • 2.常见问题分析
  • Day02 Nacos注册中心入门
      • 1.核心知识点
      • 2.常见问题分析
      • 3.面试题
  • Day03 基于nacos实现服务的发现与调用
      • 1.核心知识点
      • 2.常见问题分析
  • Day04 基于Feign方式的服务调用实践
      • 1.常见问题分析
  • Day05 Nacos配置中心应用实践
      • 1.常见问题分析
      • 2.面试题
  • Day06 Sentinel 限流应用实践
      • 1.核心知识点
      • 2.常见问题分析
      • 3.面试题
  • Day07 Gateway 入门应用实践
      • 1.核心知识点
      • 2.常见问题分析
  • Day08 Gateway 进阶应用实践
      • 1.常见问题分析
      • 2.面试题

Day01 微服务简介

1.核心知识点

  • 微服务架构诞生的背景(软件即服务,将一个大型的软件,拆成若干个小系统,分而治之)
  • 微服务架构解决方案(大厂基本自研,自己研发各种组件,Spring Cloud Netflix,Alibaba)
  • 微服务架构下Maven聚合项目的创建方式(Maven聚合项目 资源复用:extends,import,简化编译,打包,部署方式)
  • 微服务架构中聚合工程之间的引用设计(将一个工程作为依赖添加到其他的工程)

2.常见问题分析

  • 为什么需要微服务?(对系统分而治之,解决因为并发访问过大带来的系统复杂性(例如:业务,开发,测试,升级,可靠性)
  • 微服务设计的特点(单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,但是会带来一定的维护成本)
  • 微服务解决方案有哪些(大厂自研,中小型企业采用开源Spring Cloud Alibaba,Spring Cloud Netfix等)
  • 微服务设计中需要哪些关键组件(服务的注册与发现,配置,限流降级,访问入口管理,分布式事务管理等等)
  • 创建聚合工程的目的(实现工程之间资源的共享,简化工程管理)
  • maven工程中build元素的作用(定义项目的编译方式,打包方式)
  • maven父工程的packing元素内的值是什么(父工程默认打包方式为pom方式)
  • maven父工程中dependencyManagement元素的作用是什么(项目依赖的版本,当前工程或子工程不需要再指定版本)
  • maven父工程中如何统一定义JDK编译和运行的版本(配置maven编译插件:maven-compiler-plugin)

Day02 Nacos注册中心入门

1.核心知识点

  • 服务中心诞生的背景(服务多了,需要统一的管理)
  • 服务注册中心的选型(社区活跃度,稳定性,功能,性能,学习成本)
  • 基于nacos实现服务的注册(添加依赖,服务配置,启动服务并检查)
  • 基于RestTemplate实现服务的简易调用(服务消费方调用服务提供方)

2.常见问题分析

  • 如何理解服务注册中心(存储服务信息的一个服务)
  • 服务注册中心诞生的背景(服务多了,需要对服务进行更好的管理)
  • 市场上常用的配置中心(Zookeeper,Eureka,Nacos,Consul)
  • 如何对注册中心进行选型(社区活跃度,稳定性,功能,性能,学习成本)
  • nacos是什么(是Alibaba公司基于SpringBoot技术实现的一个注册中心,本质上也是一个web服务)
  • nacos的基本架构(Client/Server架构)
  • nacos主要提供了什么核心功能(服务的注册,发现,配置)
  • nacos服务单机模式,window平台下启动时的指令是什么(startup.cmd -m standalone)
  • 实现nacos服务注册需要添加什么依赖(两个:web,discovery)
  • 实现nacos服务注册时,必须做哪些配置(服务名,假如是本机服务注册刻意省略服务地址)
  • nacos如何检查服务的状态(通过心跳包实现,服务启动时会定时向nacos发送心跳包-BeatInfo)
  • 服务之间进行服务调用时,使用什么API(RestTemplate,用此对象之前要先创建这个对象并交给Spring去管理)

3.面试题

  • 为什么要将服务注册到nacos(为了更好地查找这些服务)
  • 在nacos中服务的提供者是如何向nacos注册中心续约的(5秒心跳)
  • 对于nacos服务来讲他是如何判定服务实例的状态(检测心跳包,15,30)
  • 服务的消费方是如何调用服务提供方的服务的(RestTemplate)
  • @Bean注解的作用(一般用于配置类的内部,描述相关的方法,用于告诉spring此方法的返回值要交给spring去管理,bean的名字默认为方法名,加入需要指定名字可以@Bean("bean"的名字),最多的应用场景是整合第三方的资源-对象)
  • @Autowired注解的作用(此注解用于描述属性,构造方法,set方法等,用于告诉spring框架,按照一定的规则为属性进行DI操作,默认是按照属性,方法参数类型查找对应的对象,加入只找到一个,则直接注入,类型多个时还会按照属性名或者方法参数名进行值的注入,加入名字也不同,就会出现报错)
  • nacos中的负载均衡层是如何实现的(通过ribbon实现,ribbon中定义了一些负载均衡的算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
  • ribbon是什么(Netflix公司提供的负载均衡客户端,一般应用与服务的消费方法)
  • ribbon可以解决什么问题(基于负载均衡策略进行服务的调用,所有策略都会实现IRule接口)
  • ribbon内置的负载均衡策略都有哪些(8种,可以通过查看Irule接口的实现类进行分析)
  • @LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉spring框架,在使用RestTemplate进行服务的调用时,这个调用过程会被一个拦截器进行拦截,然后再拦截器的内部,启动负载均衡策略)
  • 我们可以自己定义负载均衡策略吗(可以,基于IRule接口进行策略的定义,也可以参考NacosRule进行实现)
  • 为什么使用feign(基于feign可以更加友好的实现服务调用,简化服务消费方对服务提供方的调用)
  • @FeignClient注解的作用是什么(告诉Feign Starter,在项目启动时,为此注解描述的接口实现类–代理类)
  • Feign方式的调用,负载均衡是如何实现的(Ribbon)
  • @EnableFeignClient注解的作用是什么(描述配置类,例如启动类)

Day03 基于nacos实现服务的发现与调用

1.核心知识点

  • 负载均衡诞生的背景(网络中有一组可以提供相同服务的计算机)
  • 客户端负载均衡&服务端负载均衡的不同?(browser->nginx->…;sca-consumer->sca-provider)
  • 基于LoadBalancerClient对象从注册中心获取服务列表(服务发现)
  • 基于Ribbon(一个负载均衡的组件,这个组件中提供一套负载均衡算法)实现负载均衡
  • @LoadBalanced注解的应用(描述RestTemplate对象,为此对象的远程调用进行赋能)
  • 基于Feign方式(声明式)的远程服务调用实战(底层封装了Okhttp,HttpClient等API调用,实现了进一步的抽象)

2.常见问题分析

  • 为什么负载均衡(通过多个服务实例均衡处理客户端的请求)
  • 如何理解服务的发现?(服务发现就是从注册中心获取服务信息)
  • LoadBalancerClient的作用(从nacos注册中心获取服务实例列表,然后本地基于负载均衡算法获得具体的服务实例)
  • @Loadbalancerd注解的作用(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)
  • 有哪些负载均衡策略(基于Irule接口去查看)
  • 如何修改负载均衡策略(配置文件,配置类)
  • Feign是什么(Spring cloud微服务规范中的一组远程调用API)
  • 为什么使用feign(优化服务调用结构)
  • 如何使用feign实现服务调用(依赖,@EnableFeignClient,@FeignClient)
  • feign方式的服务调用原理(底层基于代理对象实现)

Day04 基于Feign方式的服务调用实践

1.常见问题分析

  • 为什么使用feign方式的服务调用(优化结构,简化服务调用过程代码的编写)
  • 如何基于feign方式实现远程服务调用(依赖,配置,feign接口的定义)
  • @EnableFeignClient注解的作用是什么(描述配置类,例如启动类,用于告诉底层要启动feign start组件)
  • @FeignClient注解的作用是什么(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类–代理类)
  • 如何理解基于Feign方式的远程服务调用(声明式远程服务调用–告诉底层做什么,底层封装了服务调用过程)
  • Feign方式如何实现负载均衡(feign默认继承ribbon组件实现负载均衡,底层基于ribbon组件实现)
  • feign接口指向的对象是谁(实现了接口的一个代理对象)

Day05 Nacos配置中心应用实践

1.常见问题分析

  • 什么是配置中心(存储项目配置信息的一个服务,这个服务可以实现配置的动态发布与更新)
  • 为什么要使用配置中心(集中管理配置信息,动态发布配置信息)
  • 市场上有哪些主流的配置中心(Apollo,nacos)
  • 配置中心一般都会配置什么内容(可能经常会变化的配置信息,例如连接池,日志,线程池,限流熔断规则)
  • 什么信息一般不会写在配置中心(服务端口,服务名,服务的注册地址,配置中心的地址)
  • 项目中为什么要定义bootstrap.yml文件(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)
  • nacos配置中心宕机了,我们的服务还可以读取到配置信息吗(可以从服务的本地内存读取)
  • 微服务应用中客户端如何感知配置中心的数据变化(1.4x版本的nacos客户端会基于长轮询机制从nacos获取配置信息)
  • 服务启动后没有从配置中心获取我们的配置数据是什么原因(依赖,bootstrap.yml,配置单词,格式,配置模型)
  • 你项目中使用的日志规范是什么(SLF4J 门面模式)
  • nacos配置管理模型的背景(环境不同配置不同)
  • Nacos配置中的管理模型是怎样的?(namespace>group>service/data-id)
  • nacos客户端(微服务)是否可以读取共享配置

2.面试题

  • 什么是配置中心(存储项目配置信息的一个服务)
  • 为什么要使用配置中心(集中管理配置信息,动态发布配置信息)
  • 市场上有哪些主流的配置中心(Appollo,nacos)
  • 配置中心一般都会配置什么内容(可能会经常变化的信息,例如连接池,日志,线程池,限流熔断规则)
  • 什么信息一般不会写到配置中心(服务端口,服务名,服务的注册地址,配置中心)
  • nacos配置中心宕机了,我们的服务还可以读取到配置信息吗(可以从内存,客户端获取了配置中心的配置信息以后,会将配置信息在本地内存中存储一份)
  • 微服务应用中我们的客户端如何获取配置中心的信息(我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向那次是配置中心请求拉取pull更新的配置信息)
  • 微服务应用中客户端如何感知配置中心的数据变化(nacos客户端会基于长轮询机制从nacos获取配置信息,所谓的长轮询就是在没有配置更新时,会在nacos服务端队列进行等待)
  • 服务启动后没有从配置中心获取我们配置的数据原因是什么(依赖,配置文件bootstrap.yml,配置中心的dataId名字不正确,分组是否正确,缩进关系,假如是动态发布,类上是否有@RefreshScope注解)
  • 项目中的日志级别(debug,info,error…可以基于日志级别控制日志的输出)
  • nacos配置管理模型的背景(环境不同配置不同)
  • nacos配置中的管理模型是什么(namespace,group,service/data-id)
  • nacos客户端(微服务)是否可以读取共享配置(可以)

Day06 Sentinel 限流应用实践

1.核心知识点

  • 服务限流,降级的背景(服务的治理)
  • Sentinel常用的限流模式(直接,关联->保证核心业务,链路->红绿灯)
  • Sentinel降级(熔断)入门实现(出现不稳当的服务系统时,暂停对此服务的访问)
  • Sentinel实现热点参数的限流(热点视频,文章…),系统规则配置(CPU的使用率),权限配置(黑白名单)

2.常见问题分析

  • 为什么要进行限流,降级(系统的处理能力有限,可以通过限流的方式,保证系统的可靠运行)
  • 有哪些Sentinel限流的算法(计数器,令牌桶,漏桶,滑动窗口算法【此为Sentinel的默认算法】)
  • @SentinelResource注解的作用,你用过哪些属性(在链路限流中描述资源结点)
  • Sentinel中常用的限流效果有哪些(快速失败,预热,排队)
  • Sentinel中限流,降级操作时被触发的类型是什么(都是BlockException类型的子类)
  • 如何对限流结果进行处理(有默认的处理方案,我们也可以自己定义处理规则—实现BlockExceptionHandler接口)
  • Sentinel限流基本管理(底层对服务请求进行拦截,然后通过流控规则限定对资源的访问)

3.面试题

  • sentinel是什么(阿里推出的一个流量控制平台,防卫兵)
  • 类似sentinel还有什么(hystrix)
  • sentinel是如何对请求进行限流的(基于sentinel提供的拦截器)
  • 限流算法(计数器,漏桶,令牌桶,滑动窗口)
  • sentinel默认的算法是什么(滑动窗口算法)
  • sentinel中的阈值应用类型(QPS,线程数)
  • sentinel的限流规则中默认有哪些限流的模式(直连,关联,链路)
  • sentinel限流的效果有哪些(快速失败,预热,排队)
  • 什么是降级熔断(让外部应用停止对服务的访问)
  • 为什么要进行熔断(平均响应速度越来越慢或者经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)
  • Sentinel中限流,降级的异常父类是什么(BlockException)
  • Sentinel出现降级熔断时,系统底层出现的异常是什么(DegradeException)
  • Sentinel中异常处理的接口是什么(BlockExceptionHandler)
  • Sentinel中异常处理接口下默认的实现类为(DefaultBlockExceptionHandler)
  • 我们如何定义Sentinel中的异常处理呢(直接或间接实现BlockExceptionHandler)
  • Sentinel熔断降级策略有什么(慢调用比例,异常比例,异常数)
  • 如何理解热点数据(访问频数比较高的数据,某些商品,文章,视频)
  • 热点数据的限流规则是什么样子的(主要针对参数进行限流设计)
  • 热点数据中的特殊参数如何理解(热点限流中的摸个参数值的阈值设计)
  • 对于热点数据的访问出现限流以后底层的异常是什么(ParamFlowException)
  • 如何理解sentinel中的系统规则(是对所有链路的控制,是一种系统保护策略)
  • sentinel的常用系统的规则有哪些(RT,QPS,CPU,线程,Load-linux,unix)
  • Sentinel系统保护规则被触发以后底层抛出什么异常(SystemBlockException)
  • 如何理解Sentinel中的授权规则(对指定资源的访问各出的一种简易的授权策略)
  • sentinel的授权规则是如何设计的(白名单与黑名单)
  • 如何理解白名单(允许访问的资源名单)
  • 如何理解黑名单(不允许访问的资源名单)
  • Sentinel如何识别白名单与黑名单(在拦截器中通过调用RequestOriginParser对象的方法检测具体的规则)
  • 授权规则中RequestOriginParse类的作用是什么(对流控应用值进行解析,检查服务访问时传入的值是否与RequestOriginParse的parseOrigin方法的返回值是否相同)

Day07 Gateway 入门应用实践

1.核心知识点

  • API网关(Gateway)诞生背景
  • 市场上主流的微服务网关(spring cloud gateway,zuul)

2.常见问题分析

  • 为什么要使用API网关(服务保护,统一url访问,统一身份认证,统一跨域设计)
  • 网关入门实践步骤(依赖,配置,启动,服务访问)
  • 网关项目中的负载均衡是如何实现的(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)

Day08 Gateway 进阶应用实践

1.常见问题分析

  • 网关中的谓词对象类型(GatewayPredicate)
  • 网关中的谓词对象时如何创建的(谓词工厂)
  • 你在网关中配置过哪些常用的谓词(Path,Method,Before,Query,Header)
  • 网关中的过滤器是如何分类的(GlobalFilter,GatewayFilter)
  • 我们是否可以自定义谓词,过滤器对象(可以)
  • 网关层面如何基于sentinel实现限流(有关sentinel的两个依赖,配置,JVM参数)
  • 网关层面的限流类型有哪些(路由id,API分组)
  • 网关中做跨域如何设计(java代码方式配置)
  • 如何将路由,跨域,负载等写到配置中心(注意层级关系)

2.面试题

  • 什么是网关?(服务访问(流量)的一个入口)
  • 为什么使用网关(服务安全,统一服务入口管理,负载均衡,限流,鉴权)
  • Spring Cloud Gateway 应用的初始构建过程(添加依赖,配置)
  • Gateway服务的启动底层是通过谁去实现的(Netty网络编程框架-ServerSocket)
  • Gateway服务做请求转发时一定要在注册中心去注册吗(不一定,可以直接通过远端url进行访问)
  • 网关层面是如何实现负载均衡的(通过服务名去查找具体的服务实例)
  • 网关层面是如何通过服务名查找服务实例的(Ribbon)
  • Ribbon中有哪些负载均衡算法(轮询,权重,hash…可以通过IRule接口进行查看分析)
  • 网关进行请求转发的流程怎样,有哪些关键的对象(XxxHandlerMapping,Handler…)
  • 网关层面服务的映射方式怎样(谓词-path,…服务名、服务实例)
  • 网关层如何记录服务的映射(通过map,并要考虑读写锁的应用)
  • 何为谓词(网关中封装了判断逻辑的一个对象)
  • 谓词逻辑的设计是什么样的(谓词判断逻辑返回值为true则进行请求转发)
  • 有哪些谓词逻辑(path,请求参数,请求方式,请求头)
  • 网关过滤器的作用是什么(对请求和响应数据做一个预处理)
  • 网关过滤器的类型有哪些(局部过滤器,全局过滤器)
  • 如何理解局部过滤器(针对具体链路的应用过滤器,需要进行配置)
  • 如何理解全局过滤器(作用于所有的请求链路)
  • 如何自己定义全局过滤器(直接或间接实现GlobalFillter接口)
  • 网关层面结合sentinel实现限流,类型有几种(两种—route id,api)
  • sentinel底层限流的算法有哪些(滑动窗口,令牌桶,漏斗)

你可能感兴趣的:(面试题,第四阶段,微服务,java,架构)