写点什么

Java 架构师面试问些什么?微服务之 springcloud 面试题(共 22 题

用户头像
极客good
关注
发布于: 刚刚

7、微服务之间是如何独立通讯的 1) 远程过程调用(Remote Procedure Invocation) 也就是我们常说的服务的注册与发现,直接通过远程过程调用来访问别的 service。 优点: 简单,常见,因为没有中间件代理,系统更简单 缺点: a. 只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应; b. 降低了可用性,因为客户端和服务端在请求过程中必须都是可用的 2) 消息 使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。 优点: a. 把客户端和服务端解耦,更松耦合 b. 提高可用性,因为消息中间件缓存了消息,直到消费者可以消费 c. 支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应 缺点: 消息中间件有额外的复杂性


8、springcloud 如何实现服务的注册和发现 服务在发布时 指定对应的服务名(服务名包括了 IP 地址和端口) 将服务注册到注册中心(eureka 或者 zookeeper) 这一过程是 springcloud 自动实现 只需要在 main 方法添加 @EnableDisscoveryClient 同一个服务修改端口就可以启动多个实例 调用方法:传递服务名称通过注册中心获取所有的可用实例 通过负载均衡策略调用(ribbon 和 feign)对应的服务


9、Eureka 和 ZooKeeper 都可以提供服务注册与发现的功能,请说说两个的区别。 1) Eureka 取 CAP 中的 AP,注重可用性。Zookepper 取 CAP 理论中的 CP 强调高的一致性。 ZooKeeper 在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka 各个节点是平等关系,只要有一台 Eureka 就可以保证服务可用,而查询到的数据并不是最新的自我保护机制会导致 Eureka 不再从注册列表移除因长时间没收到心跳而应该过期的服务 Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用) 当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性) Eureka 可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像 ZooKeeper 一样使得整个注册系统瘫痪 2) ZooKeeper 有 Leader 和 Follower 角色,Eureka 各个节点平等 3) ZooKeeper 采用过半数存活原则,Eureka 采用自我保护机制解决分区问题 4) Eureka 本质上是一个工程,而 ZooKeeper 只是一个进程


10、eureka 自我保护机制 当 Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁的启动关闭客户端),那么这个节点就会进入自我保护模式,一旦进入到该模式,Eureka server 就会保护服务注册表中的信息,不再删除服务注册表中的数据(即不会注销任何微服务),当网络故障恢复后,该 Ereaka Server 节点就会自动退出自我保护模式(我的 Eureka Server 已经几个月了,至今未自动退出该模式)


11、什么是服务熔断?什么是服务降级 在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调用关系是同步的,会对整个微服务系统造成服务雪崩 为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。 所谓的服务熔断指的是某个服务故障或异常一起类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。 服务熔断就是相当于我们电闸的保险丝,一旦发生服务雪崩的,就会熔断整个服务,通过维护一个自己的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回 fallback 的默认值


12、如何使用 Eureka 1) 添加 pom 依赖 2) 配置文件添加相关配置 3) 启动类添加注解 @EnableDiscoveryClient


13、什么是 Ribbon? ribbon 是一个负载均衡客户端,可以很好的控制 htt 和 tcp 的一些行为。Feign 默认集成了 ribbon。 使用: 1) 添加 pom 依赖 2) 配置文件添加相关配置 3) 启动类添加注解 @EnableEurekaServer 4) 向程序的 ioc 注入一个 bean: restTemplate;并通过 @LoadBalanced 注解表明这个 restRemplate 开启负载均衡的功能 5) 写一个测试类 HelloService,通过之前注入 ioc 容器的 restTemplate 来消费 service-hi 服务的“/hi”接口 源码: Ribbon 的负载均衡,主要通过 LoadBalancerClient 来实现的,而 LoadBalancerClient 具体交给了 ILoadBalancer 来处理,ILoadBalancer 通过配置 IRule、IPing 等信息,并向 EurekaClient 获取注册列表的信息,并默认 10 秒一次向 EurekaClient 发送“ping”,进而检查是否更新服务列表,最后,得到注册列表后,ILoadBalancer 根据 IRule 的策略进行负载均衡。 而 RestTemplate 被 @LoadBalance 注解后,能过用负载均衡,主要是维护了一个被 @LoadBalance 注解的 RestTemplate 列表,并给列表中的 RestTemplate 添加拦截器,进而交给负载均衡器去处理。


14、什么是 Feign?它的优点是什么? Feign 是一个声明式的伪 Http 客户端,它使得写 Http 客户端变得更简单。使用 Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用 Feign 注解和 JAX-RS 注解。Feign 支持可插拔的编码器和解码器。Feign 默认集成了 Ribbon,并和 Eureka 结合,默认实现了负载均衡的效果。 简而言之: Feign 采用的是基于接口的注解 Feign 整合了 ribbon,具有负载均衡的能力 整合了 Hystrix,具有熔断的能力 使用: 1) 添加 pom 依赖 2) 配置文件添加相关配置 3) 启动类添加注解 @EnableFeignClients 4) 定义一个接口,使用注解 @ FeignClient(“服务名”),来指定调用哪个服务


源码实现过程:


首先通过 @EnableFeignCleints 注解开启 FeignCleint


根据 Feign 的规则实现接口,并加 @FeignCleint 注解


程序启动后,会进行包扫描,扫描所有的 @ FeignCleint 的注解的类,并将这些信息注入到 ioc 容器中。


当接口的方法被调用,通过 jdk 的代理,来生成具体的 RequesTemplate


RequesTemplate 在生成 Request


Request 交给 Client 去处理,其中 Client 可以是 HttpUrlConnection、HttpClient 也可以是 Okhttp


最后 Client 被封装到 LoadBalanceClient 类,这个类结合类 Ribbon 做到了负载均衡。


15、Ribbon 和 Feign 的区别: Ribbon 和 Feign 都是用于调用其他服务的,不过方式不同。 1.启动类使用的注解不同,Ribbon 用的是 @RibbonClient,Feign 用的是 @EnableFeignClients。 2.服务的指定位置不同,Ribbon 是在 @RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口中使用 @FeignClient 声明。 3.调用方式不同,Ribbon 需要自己构建 http 请求,模拟 http 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐。 Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可, 不需要自己构建 http 请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。


16、什么是 Spring Cloud Bus? Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。 如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件 使用: 1、添加依赖 2、配置 rabbitmq


17、什么是 zuul? Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user 转发到到 user 服务,/api/shop 转发到到 shop 服务。zuul 默认和 Ribbon 结合实现了负载均衡的功能。 使用: 1、添加 pom 依赖 2、配置文件添加相关配置 3、启动类添加注解 @EnableZuulProxy


在 zuul 中, 整个请求的过程是这样的,首先将请求给 zuulservlet 处理,zuulservlet 中有一个 zuulRunner 对象,该对象中初始化了 RequestContext:作为存储整个请求的一些数据,并被所有的 zuulfilter 共享。zuulRunner 中还有 FilterProcessor,FilterProcessor 作为执行所有的 zuulfilter 的管理器。FilterProcessor 从 filterloader 中获取 zuulfilter,而 zuulfilter 是被 filterFileManager 所加载,并支持 groovy 热加载,采用了轮询的方式热加载。有了这些 fi


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


lter 之后,zuulservelet 首先执行的 Pre 类型的过滤器,再执行 route 类型的过滤器,最后执行的是 post 类型的过滤器,如果在执行这些过滤器有错误的时候则会执行 error 类型的过滤器。执行完这些过滤器,最终将请求的结果返回给客户端。


18、什么是 Hystrix?它如何实现容错? Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。 通常对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。 使用: 1、添加 pom 依赖 2、启动类使用注解 @EnableHystrix 3、在 Service 方法上加上 @HystrixCommand 注解。该注解对该方法创建了熔断器的功能,并指定了 fallbackMethod 熔断方法

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Java架构师面试问些什么?微服务之springcloud面试题(共22题