Java微服务面试题及答案2022,微服务面试题2022
目录
一、什么微服务?
二、微服务优缺点
三、场景启动器的工作原理是什么?
四、Spring Boot 的自动配置是如何实现的?
五、Eureka的工作原理
六、Ribbon的负载均衡原理
七、Ribbon的负载均衡算法
八、Hystrix断路器工作原理
九、Hystrix的核心功能
一、什么微服务?
微服务是一种将单个应用程序开发为一组小服务的方法,每个服务都在自己的进程中运行,并通过轻量级机制(通常是HTTP资源API)进行服务之间交互。这些服务基于业务能力构建的,可以通过全自动部署机制独立部署。通常情况下我们很少去集中化去管理这些服务,而且这些服务可以用不同的编程语言编写,并使用不同的数据存储技术。
二、微服务优缺点
优点:
1.每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求;
2.微服务能够被小团队单独开发;
3.微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;
4.微服务能使用不同的语言开发;
5.微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;
6.微服务只是业务逻辑的代码,不会和HTML,CSS 或其他界面组件混合;
缺点:
1.运维要求较高;
2.分布式的复杂性;
3.接口调整成本高;
三、场景启动器的工作原理是什么?
其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。
四、Spring Boot 的自动配置是如何实现的?
主要是通过@SpringBootApplication下面的@EnableAutoConfiguration注解实现的,该注解通过 @Import 注解导入了AutoConfigurationImportSelector,然后在该类中加载 META-INF/spring.factories 的配置信息,最后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能!
五、Eureka的工作原理
Eureka包含两个组件:Eureka Server和Eureka Client。在Eureka Client启动的时候,将自身的服务的信息发送到Eureka Server,同时也会从Eureka Server下载服务注册信息保存到Eureka Client缓存中。当服务间相互调用其它服务时,在Eureka Client中获取服务信息(如服务地址,端口等)后,实现服务之间的交互。
六、Ribbon的负载均衡原理
简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法,将请求平摊的分配到多个服务上,从而达到系统的高可用。
七、Ribbon的负载均衡算法
1.RoundRobinRule(轮询算法)
2.RandomRule(随机算法)
3.AvailabilityFilteringRule():会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
4.WeightedResponseTimeRule():根据平均响应的时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够会切换到WeightedResponseTimeRule;
5.RetryRule():先按照RoundRobinRule的策略获取服务,如果获取失败则在制定时间内进行重试,获取可用的服务;
6.BestAviableRule():会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
7.ZoneAvoidanceRule():默认规则,符合判断server所在区域的性能和server的可用性选择服务器;
八、Hystrix断路器工作原理
1、 当满足一定的阀值时候 (默认 10 秒内 超过 20 个请求 次数 )
2、 当失败率达到一定的时候( 默认 10 秒内超过 秒内超过 50%的请求失败 )
3、 到达以上阀值 ,断路器将会开启
4、 当开启的时候 ,所有请求都不会进行转发
5、 一段时间之后( 默认是 5秒),这个时候断路器是半开状态, 会让其中一请求进行转发。如果成功断路器会关闭,若失败继续开启。重复 4和 5。
九、Hystrix的核心功能 请求熔断:
当Hystrix Command请求后端服务失败数量超过一定比例(默认50%),断路器会切换到开路状态(Open)。这时所有请求会直接失败而不会发送到后端服务,断路器保持在开路状态一段时间后(默认5秒),自动切换到半开路状态(HALF-OPEN),这时会判断下一次请求的返回情况,如果请求成功,断路器切回闭路状态(CLOSED),否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链,避免发送大量无效请求影响系统吞吐量,并且断路器有自我检测并恢复的能力。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
服务降级:
Fallback相当于是降级操作。对于查询操作,我们可以实现一个fallback方法,当请求后端服务出现异常的时候,可以使用fallback方法返回的值。fallback方法的返回值一般是设置的默认值或者来自缓存,告知后面的请求服务不可用了不要再来了。依赖隔离(采用舱壁模式,Docker就是舱壁模式的一种):
在Hystrix中主要通过线程池来实现资源隔离。通常在使用的时候我们会根据调用的远程服务划分出多个线程池。比如说,一个服务调用另外两个服务,你如果调用的两个服务都用一个线程池,那么如果一个服务卡在哪里,资源没被释放后面的请求又来了,导致后面的请求都卡在哪里等待,导致你依赖的A服务把你卡在那里,耗尽了资源,也导致了你另外一个B服务也不可用了。这时如果依赖隔离,某一个服务调用A B两个服务,如果这时我有100个线程可用,我给A服务分配50个,给B服务分配50个,这样就算A服务挂了,我的B服务依然可以用。
请求缓存:
比如一个请求过来请求我userId=1的数据,你后面的请求也过来请求同样的数据,这时我不会继续走原来的那条请求链路了,而是把第一次请求缓存过了,把第一次的请求结果返回给后面的请求。请求合并:
比如说查数据库的时候,我发了N条请求发了N条SQL然后拿到一堆结果,这时候我们可以把多个请求合并成一个请求,发送一个查询多条数据的SQL的请求,这样我们只需查询一次数据库,提升了效率。
- 点赞
- 收藏
- 关注作者
评论(0)