SpringCloud⾯试题及答案
1. 什么是 spring cloud?
spring cloud 是⼀系列框架的有序集合。它利⽤ spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中⼼、消息总线、负载均衡、断路器、数据监控等,都可以⽤ spring boot 的开发风格做到⼀键启动和部署。
2. spring cloud 断路器的作⽤是什么?
在分布式架构中,断路器模式的作⽤也是类似的,当某个服务单元发⽣故障(类似⽤电器发⽣短路)之后,通过断路器的故障监控(类似熔断保险丝),向调⽤⽅返回⼀个错误响应,⽽不是长时间的等待。这样就不会使得线程因调⽤故障服务被长时间占⽤不释放,避免了故障在分布式系统中的蔓延。
3. spring cloud 的核⼼组件有哪些?
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon:实现负载均衡,从⼀个服务的多台机器中选择⼀台。
Hystrix:提供线程池,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题。
Zuul:⽹关管理,由 Zuul ⽹关转发请求给对应的服务。
4. SpringCloud和Dubbo
SpringCloud和Dubbo都是现在主流的微服务架构
SpringCloud是Apache旗下的Spring体系下的微服务解决⽅案
Dubbo是阿⾥系的分布式服务治理框架
从技术维度上,其实SpringCloud远远的超过Dubbo,Dubbo本⾝只是实现了服务治理,⽽SpringCloud现在以及有21个⼦项⽬以后还会更多
所以其实很多⼈都会说Dubbo和SpringCloud是不公平的
但是由于RPC以及注册中⼼元数据等原因,在技术选型的时候我们只能⼆者选其⼀,所以我们常常为⽤他俩来对⽐
服务的调⽤⽅式Dubbo使⽤的是RPC远程调⽤,⽽SpringCloud使⽤的是 Rest API,其实更符合微服务官⽅的定义
服务的注册中⼼来看,Dubbo使⽤了第三⽅的ZooKeeper作为其底层的注册中⼼,实现服务的注册和发现,SpringCloud使⽤Spring Cloud Netflix Eureka实现注册中⼼,当然SpringCloud也可以使⽤ZooKeeper实现,但⼀般我们不会这样做
服务⽹关,Dubbo并没有本⾝的实现,只能通过其他第三⽅技术的整合,⽽SpringCloud有Zuul路由⽹关,作为路由服务器,进⾏消费者的请求分发,SpringCloud还⽀持断路器,与git完美集成分布式配置⽂件⽀持版本控制,事务总线实现配置⽂件的更新与服务⾃动装配等等⼀系列的微服务架构要素
从技术选型上讲~
⽬前国内的分布式系统选型主要还是Dubbo毕竟国产,⽽且国内⼯程师的技术熟练程度⾼,并且Dubbo在其他维度上的缺陷可以由其他第三⽅框架进⾏集成进⾏弥补
⽽SpringCloud⽬前是国外⽐较流⾏,当然我觉得国内的市场也会慢慢的偏向SpringCloud,就连刘军作为Dubbo重启的负责⼈也发表过观
点,Dubbo的发展⽅向是积极适应SpringCloud⽣态,并不是起冲突
Rest和RPC对⽐
其实如果仔细阅读过微服务提出者马丁福勒的论⽂的话可以发现其定义的服务间通信机制就是Http Rest
RPC最主要的缺陷就是服务提供⽅和调⽤⽅式之间依赖太强,我们需要为每⼀个微服务进⾏接⼝的定义,并通过持续继承发布,需要严格的版本控制才不会出现服务提供和调⽤之间因为版本不同⽽产⽣的冲突
⽽REST是轻量级的接⼝,服务的提供和调⽤不存在代码之间的耦合,只是通过⼀个约定进⾏规范,但也有可能出现⽂档和接⼝不⼀致⽽导致的服务集成问题,但可以通过swagger⼯具整合,是代码和⽂档⼀体化解决,所以REST在分布式环境下⽐RPC更加灵活
这也是为什么当当⽹的DubboX在对Dubbo的增强中增加了对REST的⽀持的原因
⽂档质量和社区活跃度
SpringCloud社区活跃度远⾼于Dubbo,毕竟由于梁飞团队的原因导致Dubbo停⽌更新迭代五年,⽽中⼩型公司⽆法承担技术开发的成本导致Dubbo社区严重低落,⽽SpringCloud异军突起,迅速占领了微服务的市场,背靠Spring混的风⽣⽔起
Dubbo经过多年的积累⽂档相当成熟,对于微服务的架构体系各个公司也有稳定的现状
5. SpringBoot和SpringCloud
SpringBoot是Spring推出⽤于解决传统框架配置⽂件冗余,装配组件繁杂的基于Maven的解决⽅案,旨在快速搭建单个微服务
⽽SpringCloud专注于解决各个微服务之间的协调与配置,服务之间的通信,熔断,负载均衡等
技术维度并相同,并且SpringCloud是依赖于SpringBoot的,⽽SpringBoot并不是依赖与SpringCloud,甚⾄还可以和Dubbo进⾏优秀的整合开发
SpringBoot专注于快速⽅便的开发单个个体的微服务
SpringCloud是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务
SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系
SpringBoot专注于快速,⽅便的开发单个的微服务个体,SpringCloud关注全局的服务治理框架
6. 微服务之间是如何独⽴通讯的
1.远程过程调⽤(Remote Procedure Invocation):
也就是我们常说的服务的注册与发现
直接通过远程过程调⽤来访问别的service。
优点:
简单,常见,因为没有中间件代理,系统更简单
缺点:
只⽀持请求/响应的模式,不⽀持别的,⽐如通知、请求/异步响应、发布/订阅、发布/异步响应
降低了可⽤性,因为客户端和服务端在请求过程中必须都是可⽤的
2.消息:
使⽤异步消息来做服务间通信。服务间通过消息管道来交换消息,从⽽通信。
优点:
把客户端和服务端解耦,更松耦合
提⾼可⽤性,因为消息中间件缓存了消息,直到消费者可以消费
⽀持很多通信机制⽐如通知、请求/异步响应、发布/订阅、发布/异步响应
缺点:
消息中间件有额外的复杂
7. 负载均衡的意义是什么?
在计算中,负载均衡可以改善跨计算机,计算机集,⽹络链接,中央处理单元或磁盘驱动器等多种计算资源的⼯作负载分布。负载均衡旨在优化资源使⽤,最⼤吞吐量,最⼩响应时间并避免任何单⼀资源的过载。使⽤多个组件进⾏负载均衡⽽不是单个组件可能会通过冗余来提⾼可靠性和可⽤性。负载平衡通常涉及专⽤软件或硬件,例如多层交换机或域名系统服务进程。
8. springcloud如何实现服务的注册?
1.服务发布时,指定对应的服务名,将服务注册到注册中⼼(eureka zookeeper)
2.注册中⼼加@EnableEurekaServer,服务⽤@EnableDiscoveryClient,然后⽤ribbon或feign进⾏服务直接的调⽤发现。
9. 什么是服务熔断?什么是服务降级
在复杂的分布式系统中,微服务之间的相互调⽤,有可能出现各种各样的原因导致服务的阻塞,在⾼并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可⽤,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调⽤关系是同步的,会对整个微服务系统造成服务雪崩
为了解决某个微服务的调⽤响应时间过长或者不可⽤进⽽占⽤越来越多的系统资源引起雪崩效应就需要进⾏服务熔断和服务降级处理。
所谓的服务熔断指的是某个服务故障或异常⼀起类似显⽰世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,⽽不是⼀直等到此服务超时。
服务熔断就是相当于我们电闸的保险丝,⼀旦发⽣服务雪崩的,就会熔断整个服务,通过维护⼀个⾃⼰的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回fallback的默认值
10. 微服务的优缺点分别是什么?说下你在项⽬开发中碰到的坑
每⼀个服务⾜够内聚,代码容易理解
开发效率提⾼,⼀个服务只做⼀件事
微服务能够被⼩团队单独开发
微服务是松耦合的,是有功能意义的服务
可以⽤不同的语⾔开发,⾯向接⼝编程
易于与第三⽅集成
微服务只是业务逻辑的代码,不会和HTML,CSS或者其他界⾯组合
开发中,两种开发模式
前后端分离
全栈⼯程师
springboot框架的作用可以灵活搭配,连接公共库/连接独⽴库
缺点
分布式系统的负责性
多服务运维难度,随着服务的增加,运维的压⼒也在增⼤
系统部署依赖
服务间通信成本
数据⼀致性
系统集成测试
性能监控
11. 你所知道的微服务技术栈?
维度(springcloud)
服务开发:springboot spring springmvc
服务配置与管理:Netfix公司的Archaiusm ,阿⾥的Diamond
服务注册与发现:Eureka,Zookeeper
服务调⽤:Rest RPC gRpc
服务熔断器:Hystrix
服务负载均衡:Ribbon Nginx
服务接⼝调⽤:Fegin
消息队列:Kafka Rabbitmq activemq
服务配置中⼼管理:SpringCloudConfig
服务路由(API⽹关)Zuul
事件消息总线:SpringCloud Bus
12. 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只是⼀个进程
13. eureka⾃我保护机制是什么?
当Eureka Server 节点在短时间内丢失了过多实例的连接时(⽐如⽹络故障或频繁启动关闭客户端)节点会进⼊⾃我保护模式,保护注册信息,不再删除注册数据,故障恢复时,⾃动退出⾃我保护模式。
14. 什么是Ribbon?
ribbon是⼀个负载均衡客户端,可以很好的控制htt和tcp的⼀些⾏为。feign默认集成了ribbon。
15. 什么是feigin?它的优点是什么?
1.feign采⽤的是基于接⼝的注解
2.feign整合了ribbon,具有负载均衡的能⼒
3.整合了Hystrix,具有熔断的能⼒
使⽤:
1.添加pom依赖。
2.启动类添加@EnableFeignClients
3.定义⼀个接⼝@FeignClient(name=“xxx”)指定调⽤哪个服务
16. Ribbon和Feign的区别?
1.Ribbon都是调⽤其他服务的,但⽅式不同。
2.启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
3.服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象⽅法的接⼝中使⽤@FeignClient声明。
4.调⽤⽅式不同,Ribbon需要⾃⼰构建http请求,模拟http请求然后使⽤RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调⽤的⽅法定义成抽象⽅法即可。
17. 什么是Spring Cloud Bus?
spring cloud bus 将分布式的节点⽤轻量的消息代理连接起来,它可以⽤于⼴播配置⽂件的更改或者服务直接的通讯,也可⽤于监控。
如果修改了配置⽂件,发送⼀次请求,所有的客户端便会重新读取配置⽂件。
使⽤:
1.添加依赖
2.配置rabbimq
18. 什么是Hystrix?
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)
服务降级:
双⼗⼀提⽰哎哟喂,被挤爆了。 app秒杀⽹络开⼩差了,请稍后再试。
优先核⼼服务,⾮核⼼服务不可⽤或弱可⽤。通过HystrixCommand注解指定。
fallbackMethod(回退函数)中具体实现降级逻辑。
19. springcloud断路器作⽤?
当⼀个服务调⽤另⼀个服务由于⽹络原因或⾃⾝原因出现问题,调⽤者就会等待被调⽤者的响应当更多的服务请求到这些资源导致更多的请求等待,发⽣连锁效应(雪崩效应)
断路器有完全打开状态:⼀段时间内达到⼀定的次数⽆法调⽤并且多次监测没有恢复的迹象断路器完全打开那么下次请求就不会请求到该服务
半开:短时间内有恢复迹象断路器会将部分请求发给该服务,正常调⽤时断路器关闭
关闭:当服务⼀直处于正常状态能正常调⽤
20. 什么是SpringCloudConfig?
在分布式系统中,由于服务数量巨多,为了⽅便服务配置⽂件统⼀管理,实时更新,所以需要分布式配置中⼼组件。在Spring Cloud中,有分布式配置中⼼组件spring cloud config ,它⽀持配置服务放在配置服务的内存中(即本地),也⽀持放在远程Git仓库中。在spring cloud config 组件中,分两个⾓⾊,⼀是config server,⼆是config client。
使⽤:
1、添加pom依赖
2、配置⽂件添加相关配置
3、启动类添加注解@EnableConfigServer
21. 架构?
在微服务架构中,需要⼏个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这⼏个基础组件相互协作,共同组建了⼀个简单的微服务系统
在Spring Cloud微服务系统中,⼀种常见的负载均衡⽅式是,客户端的请求⾸先经过负载均衡(zuul、Ngnix),再到达服务⽹关(zuul集),然后再到具体的服。,服务统⼀注册到⾼可⽤的服务注册中⼼集,服务的所有的配置⽂件由配置服务管理,配置服务的配置⽂件放在git仓库,⽅便开发⼈员随时改配置。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。