前言: spring cloud微服务项目,应该也算是比较热门成熟的架构了,在此讲讲spring cloud的一些基础面试题,以供大家更深入的了解它,如有错漏,欢迎指正...
spring cloud全家桶各大组件
Eureka:服务注册于发现
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务
ribbon:实现负载均衡,从一个服务的多台机器中选择一台
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求,feign默认集成了ribbon
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Sleuth:分布式系统中提供追踪解决方案,并且兼容支持了 zipkin
zipkin:分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。
Spring Cloud Bus:事件消息总线
Spring Cloud Stream:数据流操作开发包(封装与 Redis, Rabbit、 Kafka等发送接收消息)
Docker:服务部罟
Spring Cloud Config:服务配置中心管理
SpringBoot Admin:服务监控
springcloud如何实现服务的注册?
1、服务发布时,指定对应的服务名,将服务注册到注册中心(eureka zookeeper)。
2、注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然后用ribbon或feign进行服务直接的调用发现。
什么是服务熔断?什么是服务降级?
在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调用关系是同步的,会对整个微服务系统造成服务雪崩。为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。
服务熔断: 指的是某个服务故障或异常一起类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。
服务熔断就是相当于我们电闸的保险丝,一旦发生服务雪崩的,就会熔断整个服务,通过维护一个自己的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回fallback的默认值。
Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别
1、ZooKeeper保证的是CP,Eureka保证的是AP
ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的
Eureka各个节点是平等关系,只要有一台Eureka就可以保证服务可用,而查询到的数据并不是最新的
自我保护机制会导致:
Eureka不再从注册列表移除因长时间没收到心跳而应该过期的服务
Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用)
当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性)
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper一样使得整个注册系统瘫痪
2、ZooKeeper有Leader和Follower角色,Eureka各个节点平等
3、ZooKeeper采用过半数存活原则,Eureka采用自我保护机制解决分区问题
4、Eureka本质上是一个工程,而ZooKeeper只是一个进程
eureka自我保护机制是什么?
当Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。
什么是Ribbon?
ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。feign默认集成了ribbon。
yml里面的配置:
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
Ribbon提供了多钟负载均衡策略:
1 WeightedResponseTimeRule:根据响应时间分配一个weight(权重,大小的概念),响应时间和weight成反比
2.RoundRobinRule:轮询选择服务节点(默认的负载均衡策略)
3.RandomRule:随机选择一个服务节点
4.ZoneAvoidanceRule:综合考虑服务节点所在区域的性能和服务节点的可用性来选择服务节点
5.RetryRule:重试机制.在一个配置时间段内,当选择服节点不成功时会一直尝试重新选择
6.BestAvailableRule:选择一个并发请求最小的服务器节点.
7.AvailabilityFilteringRule:过滤掉因为一直连接失败而被标记为circuit tripped的服务节点和那些高并发的服务节点(active connections超过配置值)
什么是feigin?它的优点是什么?
1.feign采用的是基于接口的注解
2.feign整合了ribbon,具有负载均衡的能力
3.整合了Hystrix,具有熔断的能力
使用:
1.添加pom依赖。
2.启动类添加@EnableFeignClients
3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务
Ribbon和Feign的区别?
1、Ribbon都是调用其他服务的,但方式不同。
2、启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
3、服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
4、调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。
什么是Spring Cloud Bus?
spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。
如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件。
使用:
1.添加依赖
2.配置rabbimq
通过/bus/refresh端点实现配置更改的广播,从而让相应的微服务重新加载配置数据

什么是Hystrix?
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)
服务降级:
双十一 提示 哎哟喂,被挤爆了。 app秒杀 网络开小差了,请稍后再试。
优先核心服务,非核心服务不可用或弱可用。通过HystrixCommand注解指定。
fallbackMethod(回退函数)中具体实现降级逻辑。
spring cloud断路器作用?
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)。
断路器有:
完全打开状态: 一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开状态: 短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
关闭状态: 当服务一直处于正常状态 能正常调用
什么是Spring Cloud Config?
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。
在Spring Cloud中,有分布式配置中心组件spring cloud config,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。
在spring cloud config 组件中,分两个角色,一是config server,二是config client。
使用:
1、添加pom依赖
2、配置文件添加相关配置
3、启动类添加注解@EnableConfigServer
spring Cloud和 Dubbo有哪些区別?
本质区别:
dubbo 是 基于 RPC 远程 过程调用
使用Dubbo可以很方便地进行远程服务调用,在同一个注册中心,业务系统可以随意调用其他服务。
cloud 是基于 http rest api 调用
dubbo的类必须实现serializable接口
spring cloud feign是通过http请求访问服务的所以可以不实现serializable接口实现serializable接口
RPC通信方式:性能高,有原生问题
HTTP的REST方式:牺牲性能,更为灵活

结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)