Java架构师面试问些什么?微服务之springcloud面试题(共22题,含详细解答)(1)

1、微服务的优缺点分别是什么?说下你在项目开发中碰到的坑。 优点: 1) 每一个服务足够内聚,代码容易理解 2) 开发效率提高,一个服务只做一件事 3) 微服务能够被小团队单独开发 4) 微服务是松耦合的,是有功能意义的服务 5) 可以用不同的语言开发,面向接口编程 6) 易于与第三方集成 7) 微服务只是业务逻辑的代码,不会和HTML,CSS或者其他界面组合 8) 开发中,两种开发模式 9) 前后端分离 10) 全栈工程师 11) 可以灵活搭配,连接公共库/连接独立库 缺点: 1) 分布式系统的负责性 2) 多服务运维难度,随着服务的增加,运维的压力也在增大 3) 系统部署依赖 4) 服务间通信成本 5) 数据一致性 6) 系统集成测试 7) 性能监控

2、什么是Spring Cloud? Spring cloud流应用程序启动器是基于Spring Boot的Spring集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。

3、SpringBoot和SpringCloud 1) SpringBoot专注于快速方便的开发单个个体的微服务 2) SpringCloud是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务 3) SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系 4) SpringBoot专注于快速,方便的开发单个的微服务个体,SpringCloud关注全局的服务治理框架

4、SpringCloud和Dubbo 1) 区别 a. 服务的调用方式Dubbo使用的是RPC远程调用,而SpringCloud使用的是 Rest API,其实更符合微服务官方的定义 b. 服务的注册中心来看,Dubbo使用了第三方的ZooKeeper作为其底层的注册中心,实现服务的注册和发现,SpringCloud使用Spring Cloud Netflix Eureka实现注册中心,当然SpringCloud也可以使用ZooKeeper实现,但一般我们不会这样做 c. 服务网关,Dubbo并没有本身的实现,只能通过其他第三方技术的整合,而SpringCloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,SpringCloud还支持断路器,与git完美集成分布式配置文件支持版本控制,事务总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素 2) 技术选型 a. 目前国内的分布式系统选型主要还是Dubbo毕竟国产,而且国内工程师的技术熟练程度高,并且Dubbo在其他维度上的缺陷可以由其他第三方框架进行集成进行弥补 b. 而SpringCloud目前是国外比较流行,当然我觉得国内的市场也会慢慢的偏向SpringCloud,就连刘军作为Dubbo重启的负责人也发表过观点,Dubbo的发展方向是积极适应SpringCloud生态,并不是起冲突 3) Rest和RPC对比 其实如果仔细阅读过微服务提出者马丁福勒的论文的话可以发现其定义的服务间通信机制就是Http Rest。 RPC最主要的缺陷就是服务提供方和调用方式之间依赖太强,我们需要为每一个微服务进行接口的定义,并通过持续继承发布,需要严格的版本控制才不会出现服务提供和调用之间因为版本不同而产生的冲突 而REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合,只是通过一个约定进行规范,但也有可能出现文档和接口不一致而导致的服务集成问题,但可以通过swagger工具整合,是代码和文档一体化解决,所以REST在分布式环境下比RPC更加灵活 这也是为什么当当网的DubboX在对Dubbo的增强中增加了对REST的支持的原因 4) 文档质量和社区活跃度 SpringCloud社区活跃度远高于Dubbo,毕竟由于梁飞团队的原因导致Dubbo停止更新迭代五年,而中小型公司无法承担技术开发的成本导致Dubbo社区严重低落,而SpringCloud异军突起,迅速占领了微服务的市场,背靠Spring混的风生水起 Dubbo经过多年的积累文档相当成熟,对于微服务的架构体系各个公司也有稳定的现状

5、你所知道的微服务技术栈有哪些?请列举一二。维度(SpringCloud) 1) 服务开发:SpringBoot、Spring、SpringMVC 2) 服务配置与管理:Netfilx公司的Archaiusm,阿里的Diamond 3) 服务注册与发现:Eureka,ZooKeeper 4) 服务调用:Rest,RPC,gRPC 5) 服务熔断器:Hystrix 6) 服务负载均衡:Ribbon,Nginx 7) 服务接口调用:Feign 8) 消息队列:Kafka,RabbitMq,ActiveMq 9) 服务配置中心管理:SpringCloudConfing 10) 服务路由(API网关):Zuul 11) 事件消息总线:SpringCloud Bus

6、负载平衡的意义什么? 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

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做到了负载均衡。

最后

image.png

类Ribbon做到了负载均衡。

最后

[外链图片转存中…(img-1v4jom4z-1714375892506)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值