Spring Cloud面试题万字解析
SpringCloud面试题 - 图1

1、Eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别?

Zookeeper保证了CP(C:一致性,P:分区容错性),Eureka保证了AP(A:高可用)
(1)当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接down掉不可用。也就是说,服务注册功能对高可用性要求比较高,但zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新选leader。问题在于,选取leader时间过长,30 ~120s,且选取期间zk集群都不可用,这样就会导致选取期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够恢复,但是漫长的选取时间导致的注册长期不可用是不能容忍的。
(2)Eureka保证 用性,Eureka各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点仍然可以提供注册和查询服务。而Eureka的客户端向某个Eureka注册或发现时发生连接失败,则会自动切换到其他节点,只要有一台Eureka还在,就能保证注册服务可用,只是查到的信息可能不是最新的。除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%的节点没有正常的心跳,那么Eureka就认为客户端与注册中心发生了网络故障,此时会出现以下几种情况:
①、Eureka不在从注册列表中移除因为长时间没有收到心跳而应该过期的服务。
②、Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点仍然可用)
③、当网络稳定时,当前实例新的注册信息会被同步到其他节点。因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个微服务瘫痪

2、说说 RPC 的实现原理

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

3、微服务的优点缺点?说下开发项目中遇到的坑?

优点:
(1)每个服务直接足够内聚,代码容易理解
(2)开发效率高,一个服务只做一件事,适合小团队开发
(3)松耦合,有功能意义的服务。
(4)可以用不同语言开发,面向接口编程。
(5)易于第三方集成
(6)微服务只是业务逻辑的代码,不会和HTML,CSS或其他界
(7)可以灵活搭配,连接公共库/连接独立库
缺点:
(1)分布式系统的责任性
(2)多服务运维难度加大。
(3)系统部署依赖,服务间通信成本,数据一致 ,系统集成测试,性能监控。

4、spring cloud 和dubbo区别?

(1)服务调用方式 dubbo是RPC spring cloud Rest Api
(2)注册中心,dubbo 是zookeep r springcloud是eureka,也可以是zookeeper
(3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文 的更新与服务自动装配等等一系列的微服务架构要素。17、REST 和RPC对比
(1)RPC主要的缺陷是服务提供方和调用方式之间的依赖太强,需要对每一个微服务进行接口的定义,并通过持续继承发布,严格版本控制才不会出现冲突。
(2)REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合,只需要一个约定进行规范。

5、eureka自我保护机制是什么?

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

6、什么是Ribbon?

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

7、什么是feigin?它的优点是什么?

(1)feign采用的是基于接口的注解
(2)feign整合了ribbon,具有负载均衡的能力
(3)整合了Hystrix,具有熔断的能力
使用:
(1)添加pom依赖。
(2)启动类添加@EnableFeignClients
(3)定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务

8、Ribbon和Feign的区别?

(1)Ribbon都是调用其他服务的,但方式不同。
(2)启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
(3)服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
(4)调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。

9、什么是Spring Cloud Bus?

spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。
如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件。
使用:
(1)添加依赖
(2)配置rabbimq

10、Spring Cloud Gateway?

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。
使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。