分享一下Java(SpringCloud和SpringBoot部分)面试心得

1.SpringCloud和dubbo的区别?

1.Dubbo主要分为服务注册中心,服务提供者,服务消费者,还有管控中心。
2.相比dubbo的简单四模块,Spring Cloud是一个完整的分布式一站式框架,有着一样的注册
服务中心,服务提供者,服务消费者,管控器,断路器,分布式配置服务等。
从性能来说
Dubbo基于Tcp协议传输,配合一Hession序列化完成RPC,而SpringCloud是基于Http协议+rest接口调用远程过程的。Http请求报文更大,占的宽带更多,网络消耗比较大。
dubbo开发难度比较高,对很多jar包依赖无法解决或者解决起来很麻烦,Spring接口协议约定比较自由
Dubbo的注册中心可以使用zookeeper,redis和多种
SpringCloud的注册中心只能选择eureka或者自研。
springCloud提供了微服务的一整套解决方案。
Dubbo
优点:
1.支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜 ;
2.采用rpc方式,性能上比Spring Cloud的rpc更好;
3.dubbo的网络消耗小于springcloud
缺点:
1.如果我们使用配置中心、分布式跟踪这些内容都需要自己去集成;
2.开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决;
Spring Cloud:
优点:
1、产出于Spring大家族,Spring在企业级开发框架中来头很大,可以保证后续的更新、完善。
2、spring cloud社区活跃,教程丰富,遇到问题很容易找到解决方案;
3、spring cloud功能比dubbo更加完善;
5、spring cloud采用rest访问方式,rest的技术无关性使用效果更棒;
6、spring cloud轻轻松松几行代码就完成了熔断、均衡负责、服务中心的各种平台功能;
7、从公司招聘工程师方面,spring cloud更有优势,因为其技术更新更炫;
8、提供了微服务的一整套解决方案:服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等;作为一个微服务治理的大家伙,考虑的很全面,几乎服务治理的方方面面都考虑到了,方便开发开箱即用;

缺点:
1.如果对于系统的响应时间有严格要求,长链接更合适。
2.接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
————————————————
版权声明:本文为CSDN博主「Chauncy Nong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ChauncyNong/article/details/80961630

2.项目中用到了哪些组件?

springCloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。通过以下简单的主键,就能构建庞大的分布式系统。
常用5大组件
1.服务发现:Eureka
2.客户端负载均衡:Ribbon
3.断路器:Hystrix。
4.服务网关:zuul
5.分布式配置:config

Eureka:实现服务治理(服务注册与发现)
由Eureka服务端和Eureka客户端组成。
Eureka服务端用作服务注册中心,支持集群部署。
Eureka客户端用来处理服务注册与发现。
客户端和服务端周期性的进行交互,以更新服务租约和服务信息。

Ribbon:主要提供客户端的软件负载均衡算法。
Ribbon是一个基于Http和Tcp的客户端负载均衡工具,它基于Ribbon实现,通过Spring Cloud的封装,可以轻松的将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。

Hystrix:断路器,保护系统,控制故障范围。
为了保证高可用,耽搁服务通常集群部署,由于网络或者自身原因,并不能保证100%的可
用,如果单个服务出现问题,调用这个服务就会出现线程阻塞。此时若有大量的请求涌入,
Servlet容器就会被消耗完毕,导致服务瘫痪。

Zuul:Api网关,路由,负载均衡等多种作用。
类似ngnix,反向代理的功能。在微服务中后端服务往往不是直接开放给调用端的,而是通过一个Api网关根据情况的url,路由到相应的服务。当添加Api网关后,第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制。后将请求均衡分发给后台服务端。

Config:配置管理,Config提供服务端和客户端,服务端存储后端的默认实现使用git,因此他轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。这个是静态的,得配合Bus实现动态的配置更新

3.eureka的原理,如何保证高可用性,和Zookeeper有什么区别?

Eureka的原理:Eureka是Netflix出品的用于实现服务注册和发现的工具,SpringCloud集成了Eureka,并提供了开箱即用的支持。
Eureka的原理图
服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,直接从本地缓存中获取,完成一次调用。
当那个服务注册中心Eureka Server检测到服务提供者因为宕机或者网络原因不可用,则在服务注册中心将服务职位DOWN状态,并将当前服务提供者状态向订阅者发布,订阅过得服务消费者更新本地缓存。服务提供者在启动后,周期性想eureka发送心跳,以证明当前服务是可用状态,Eureka Server在一定的时间。默认是90秒,未收到客户端心跳,则认为服务宕机,注销该实例。
Eureka的自我保护机制
默认配置中,Eureka Server在默认90秒中没有得到客户端的心跳,则注销该实例,但是往往因为微服务跨进程调用,网络通信往往面临各种问题,比如微服务状态正常,但是因为网络分区故障,Eureka Server注销服务实例则为了解决这个问题。Eureka有自我保护机制,配置eureka。server。enable-self-preservation=true。
它的原理是,当Eureka Server节点在短时间内丢失过多的客户端时,那么节点进入自我保护模式,不再注销任何微服务,当网络故障回复后,该节点会自动退出自我保护模式。自我保护模式架构是宁可放过一个,绝不错杀一千。

Eureka和Zookeeper
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性),A(可用性)和P(分区容错性)。由于分区容错性在分布式系统中必须要保证,因此我们只能在A和C之间进行权衡,Zookeeper保证的是CP,而Eureka则是AP。
大佬的分析

4.feign如何调用的?

Java接口如何调用:Httpclient:Apache的项目,用来提供高效的,最新的,功能丰富的支持Http协议的客户端工具包,并且它支持Http协议最新版本和建议。
Okhttp:一个处理网络的开源项目,是安卓最火的轻量级框架,简洁的Api,高效的性能,并支持多种协议。
HttpURLConnection是java的标准类,用于向指定网站发送Get和post请求,使用比较复杂
RestTemplate是Spring提供的用于访问Rest服务端的客户端,RestTemplate提供多种编写访问远程Http服务的方法,能够大大提高客户端的编写效率。

Feign是一个声明式的REST客户端,他能让REST调用更加简单,Feign提供了Http请求的模板,通过编写简单的接口和插入注解,就可以定义好Http请求参数,格式和地址,Feign则会完全代理Http请求,我们只需要像方法一样去调用它就可以,并且Spring Cloud对Fegin进行了封装,Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
SpringCloud中集成Fegin。
添加Feign依赖,在启动类上加上@EnableFeignClients注解。之前的项目是如何做的,单独先建一个文件夹叫feign文件夹,然后把所有需要fegin调用的请求放在里面,在其他需要调用feign的service层调用就可以了。
feign调用的时候还得指定fallback,以免调用失败打印出来。
feign是集成ribbon实现的负载均衡。

5.处理生产环境上配置生效问题?

首先是多环境的Spring Cloud配置:使用三短横将不同环境的配置分隔开来,主要配置有Spring的profiles,和Spring Cloud Config的profile。缺一不可。
java -jar xxxx.jar --spring.profiles.active=prod
使用命令来启动多环境的项目,之前项目中是用jkenis进行持续集成的。

6.hystrix的降级策略有哪些?

Hystrix是一款开源的容错插件,具有依赖隔离,系统容错降级等功能,这也是其重要的两种用途,还有请求合并等功能。
为什么要进行隔离?
在分布式中,一个服务经常需要调用其他的服务,即RPC调用,而调用最多的方式还是通过http请求调用,如果被调服务因为超市,而没有及时熔断的话,那么调用链路就会一直卡在那里,如果该服务还被其他服务调用就会产生雪崩效应。
Hystrix就需要发现这种异常,进行服务降级,常用降级处理包括,超时处理,线程池隔离和信号量隔离。
超时降级:hystrix提供了超时降级熔断机制,通过添加注解的方式来实现熔断,@HystrixCommand注解就可以实现,源码中HystrixCommand中的fallbackMehton中有一个叫createOrderFallbackMethod4Timeout()方法,用来实现超时降级。
线程池隔离:每个过来的请求,系统会单独将这个请求的执行放在一个线程或者线程池中,根据自己的需求进行配置,相同的请求不管有多少打进来,都会在指定数量的线程池内进行,不会出现线程资源耗尽的问题。
信号量隔离,开关作用,服务A的信号量为10,那么就同时只允许有10个tomcat线程来访问服务A,其他请求都会被拒绝。只需要在方法上添加 @PerfTest(invocations = 10,threads = 10就可以

7.定时任务如何实现?

一般来说是Spring Boot定时任务Schedule模块,一般情况能满足我们所有需求。
常见定时框架
schedul已经包含在spring-boot-starter基础模块中了,所以不需要添加额外的依赖。
1.在启动类中添加启动注解@EnableScheduling注解,即可启动定时任务。
2.Corn表达式
Corn表达式
常用的
给需要定时启动的方法上添加@Scheduled的注解。即可完成。

8.分布式锁

分布式锁具备的条件:
1.分布式系统环境下,一个方法只能在同一时间被一个机器的一个线程执行。
2.高性能的获取锁和释放锁。
3.具备可重入特性
4.具备锁失效机制,防止死锁。
5.具备非阻塞特性,即没有获取到锁将直接返回锁失败。
Redis分布式锁实战
通俗来讲,就是set一个锁,需要就get得到,然后delete掉。结束就再次set进去。
工具类设计。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值