面试题_SpringCloud

spring cloud核心组件及其作用?

一、Eureka:服务注册与发现
二、Zuul(或Gateway):服务网关
三、Feign:服务调用
四、 Ribbon:负载均衡
五:Hystrix:服务熔断/降级

关于Eureka(服务中心)

Eureka的服务注册和发现是什么意思?Spring Cloud 如何实现?

1、注册:每个服务都向Eureka登记自己提供服务的元数据(包括服务的ip地址、端口号、版本号、通信协议等)。Eureka将各个服务维护在一个服务清单(双层Map,第一层key是服务名,第二层key是实例名,value是服务地址加端口)中。同时对服务维持心跳,剔除不可用的服务,Eureka集群各个节点相互注册(注册不了也不影响Eureka的使用,保证高可用)每个实例中都有一样的服务清单。
2、发现:Eureka注册的服务之间调用不需要指定服务地址,而是通过服务名在注册中心找,并获取所有服务实例清单(缓存到本地),然后实现服务的请求访问。

Eureka怎么实现高可用?

集群,注册多台Eureka,然后把Spring Cloud服务互相注册,客户端从Eureka获取信息时,按照Eureka的顺序来访问。

什么是Eureka的自我保护模式?

默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会
进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的
数据,当网络故障恢复后,Eureka Service 节点会自动退出自我保护模式

关于Zuul(网关)

什么是Zuul(服务网关)?

根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,他对外隐蔽了微服务的真正接口地址。
三个重要概念:动态路由表,路由定位,反向代理:

Zuul的应用场景?

1、对外暴露:如果前端、移动端要调用后端系统,统一从Zuul网关转发请求给相应的服务,通过与Eureka进行整合,将自身注册为Eureka下的应用,从Eureka下获取所有的服务实例,来进行服务的路由。
2、权限校验:Zuul还提供了一套过滤机制,开发者可以自己指定哪些规则的请求需要执行校验逻辑,只有通过校验逻辑的请求才会被路由到具体服务实例上,否则返回错误提示。

网关与过滤器有什么区别?

网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。

常用网关框架有那些?

Nginx、Zuul、Gateway

Zuul与Nginx有什么区别?

1、Zuul是java语言实现的,主要为java服务提供网关服务,尤其对于Spring Cloud架构可以更加灵活的对网关进行操作。
2、Nginx是使用C语言实现,性能高于Zuul。

如何设计一套API接口?

1、内网API接口:用于局域网,为内部服务器提供服务。
2、开放API接口:用于对外部提供接口调用,需要遵循Oauth2.0权限认证协议。

ZuulFilter常用有那些方法?

Run():过滤器的具体业务逻辑。
shouldFilter():判断过滤器是否有效。
filterOrder():过滤器执行顺序。
filterType():过滤器拦截位置。

如何实现动态Zuul网关路由转发?

通过path配置拦截请求,通过ServiceId到配置中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。

Zuul网关如何搭建集群?

使用Nginx的upstream设置Zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对Zuul集群发送请求。

关于Ribbon(负载均衡)

Nginx与Ribbon的区别?

Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发。
Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。

什么是Ribbon?

服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台(被调用方的服务地址有多个),Ribbon也是通过发起http请求,来进行的调用,只不过是通过调用服务名的地址来实现的。虽然说Ribbon不用去具体请求服务实例的ip地址或域名了,但是每调用一个接口都还要手动去发起Http请求。

@RestController
public class ConsumerController{
	@AutoWired
	RestTemplate restTemplate ;
	@GetMapping("/ribbon-consumer")
	public String helloConsumer(){
		// 调用服务名的地址
		return restTemplate.getForEntity("http://exampleservice/index",String.class).getBody();
	}
}

@LoadBalanced注解的作用?

开启客户端负载均衡。

关于Hystrix

什么是 Hystrix?

Hystrix是防雪崩工具,它具有服务降级,服务熔断,服务隔离,监控等一些防止雪崩的技术。

断路器有三种状态?

打开状态:一段时间内,达到一定的次数无法调用,并且多次监测没有恢复的迹象,断路器完全打开那么下次请求就不会请求到该服务。
半开状态:短时间内,有恢复迹象,断路器会将部分请求发给该服务,正常调用时,断路器关闭。
关闭状态:当服务一直处于正常状态,能正常调用。

Hystrix有四种防雪崩方式?

1、服务降级:当客户端请求到服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
2、服务熔断:在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量达设定值或当前的请求错误率达到设定的错误率阈值时开启断路,之后的请求直接走fallback方法,在设定时间后尝试恢复。
3、服务隔离:就是Hystrix为隔离的服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。
4、服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。

谈谈服务雪崩效应?

当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,因为微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃。
发生雪崩效应的原因有以下几点:
1、单个服务的代码存在bug。
2、请求访问量激增导致服务发生崩溃(如大型商城的枪红包,秒杀功能)。
3、服务器的硬件故障也会导致部分服务不可用。

关于Feign

什么是Feign?

Feign 是一个声明web服务客户端,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。调用远程就像调用本地一样。

@RestController
public class UserController {
   @GetMapping("/getUser")
   public String getUser(){
       List<String> list = new ArrayList<>();
       list.add("张三");
       return list.toString();
   }
}

@FeignClient(name = "user")
public interface UserClient{
   @GetMapping("/getUser")
   String getUser();
}

@RestController
public class TestController{
   @Resource
   UserClient userClient;
   @RequestMapping("test")
   public String test(){
       return userClient.getUser();
   }
}

SpringCloud有几种调用接口方式?

Feign和RestTemplate

Ribbon和Feign的区别?

调用方式不同:
1、Ribbon需要我们自己构建Http请求,模拟Http请求然后通过RestTemplate发给其他服务,步骤相当繁琐。
2、Feign则是在Ribbon的基础上进行了一次改进,采用接口的形式,将我们需要调用的服务方法定义成抽象方法保存在本地直接调用接口可以了,不过要注意,调用方法要和本地抽象方法的签名完全一致。

分布式配置中心有那些框架?他们的作用?

Apollo、zookeeper、spring cloud config。
作用:动态变更项目配置信息而不必重新部署项目。

你可能感兴趣的:(面试,spring,cloud)