java3-5年面试题——中级篇

1.关于分布式的一些基本概念

1、微服务
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量机制通信,通常是HTTP API。
简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行

2、集群&分布式&节点
集群是个物理形态,分布式是个工作方式
只要是一堆机器,就可以叫集群,它们是不是一起协作着干活,这个谁也不知道;
分布式是指将不同的业务分布在不同的地方。
集群指的是将几台服务器集中在一起,实现同一业务。

3、远程调用
在分布式系统中,各个服务可能处于不同的主机,但是服务之间不可避免的需要互相调用,我们称之为远程调用。
SpringCloud中使用HTTP+JSON的方式完成远程调用

4、负载均衡
分布式系统中,A服务需要调用B服务,B服务在多台机器中都存在,A任意调用一个服务器均可完成功能。
为了使每一个都不要太闲或者太忙,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
常见的负载均衡算法
轮询: 为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
最小链接: 优先选择连接数最少,也就是压力最小的后端服务器,在回话较长的情况下可以采取这种方式。
散列: 根据请求源的IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保持特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。

5、服务注册/发现&注册中心
A服务调用B服务,A服务并不知道B服务当前在哪台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;

6、配置中心
每个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上,我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息

7、服务熔断&服务降级
在微服务架构中,微服务之间通过网络进行通信,存在互相依赖,当其中一个服务不可用时,可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。

8、API网关
在微服务架构中,API Gateway作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端的负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能

2.Spring Boot框架和传统Spring框架相比有哪些优势?

1.可快速构建独立的Spring应用
2.直接嵌入Tomcat、Jetty和Undertow服务器(无需部署WAR文件)
3.提供依赖启动器简化构建配置
4.极大程度的自动化配置Spring和第三方库
5.提供生产就绪功能
6.极少的代码生成和XML配置

3.springboot自动配置的原理是什么?

Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器中。
通俗的来讲,我们之前在写ssm项目时候,配置了大量坐标和配置内容,搭环境的过程在项目开发中占据了大量时间,Spring Boot的最大的特点就是简化了各种xml配置内容,所以springboot的自动配置就是用注解来对一些常规的配置做默认配置,简化xml配置内容,使你的项目能够快速运行。
springboot核心配置原理:
1.自动配置类都存放在spring-boot-autoconfigure-版本号.jar下的org.springframework.boot.autoconfigure中
2.当我们在application.properties中配置debug=true后启动容器。可以看到服务器初始化的初始化配置
3.DispatcherServletAutoConfigratio 注册前端控制器
4.EmbeddedServletContainerAutoConfiguration注册容器类型
5.HttpMessageConvertersAutoConfiguration注册json或者xml处理器
6.JacksonAutoConfiguration注册json对象解析器
7.如果加入其他功能的依赖,springBoot还会实现这些功能的自动配置

4.如果自己集成一个jar包到springboot中,该如何做?

1.将jar包安装到本地maven仓库中,安装之后可以在本地仓库中找到对应的jar包,然后将对应的依赖信息插入到工程的pom文件即可
2.另一种可以在resourse文件目录下新建lib文件夹,将自定义jar包放入,然后将lib文件夹添加为本地仓库。具体操作为:在IDEA编译器中,选中lib文件,点击右键,选择 Add as Libraries。

5.如何解决分布式事务问题?

1.基于XA协议的两阶段提交(2PC):
两阶段提交就是 1.就是当协调者向参与者发送请求之后,当参与者收到请求之后执行对应的操作但是不进行提交事务,而是向协调者发送完成或者失败的消息。2.第二阶段就是协调者拿到不同的参与者的反馈后进行判断如果有一个失败则继续发送消息给参与者都进行回滚,如果都成功的话就发送消息都提交,他的缺点就是性能各个节点会占用资源,存在单点故障问题(一旦事务的协调者挂掉的话就无法完成事务),各个参与者的如果有一个存在局部网络问题的话会导致各个节点之间数据不一致的问题。

2.代码补偿事务(TCC)
TCC的作用主要是解决跨服务调用场景下的分布式事务问题,
TCC的缺点就是开发的代码量会比较大,需要写三个接口。比起XA的优点是它不是长时间的去占有锁,当try结束后就会释放锁可以让其他事务使用,而XA则是一直占用直到事务执行结束之后才会释放。

3.本地消息表(异步确保)- 事务最终一致性
添加一个本地消息表和一个mq消息队列,如图所示的步骤中当5修改状态的时候故障的时候就会导致消息表这里一直收不到状态码的消息这时候就会导致不停的轮询发送消息导致库存不停的在变,如何解决这个问题呢我们可以使用乐观锁去解决。
4.MQ 事务消息
首先消息发送放发送一个half消息告诉MQ服务器我有一个事务要准备操作了,当MQ服务器给消息发送方回复一个消息的成功的消息的时候,然后发送方开始执行本地事务,发送发会判断自己的事务执行成功或者失败,然后发送一个消息给消息队列告诉消息队列提交或者回滚,如果是提交的话这时候的half消息就变成了全消息。然后就会去接收消息方的本地执行事务操作,但是如果是回滚的话,消息队列就会将half消息删掉,当发送方执行结束后发送给消息队列提交或者回滚的消息的时候因为网络或者其他问题导致发送失败的话,消息队列会有一个回查本地事务的机制。

5.Seata(AT及MT) *(重点)
seate又称简单可扩展自治事务框架。
流程就是TM需要发送请求的时候首先向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID,然后这个XID会在微服务调用的整个链路中赋给每一个微服务,每个微服务的RM会去TC(seate)中注册分支事务,然后会执行分支事务并且提交这里是关键执行完事务之后就会直接提交,然后将结果汇报给TC,TM根据TC的中所有分支的执行情况发起全局的提交或者回滚。最终使全部的分支都完成提交或者回滚的操作。

6.token生成的原理

转:https://blog.csdn.net/CJamenc/article/details/109490184

7.常用的设计模式

单例模式
饿汉式:
1.创建一个类 然后对类里面的构造器进行私有化 目的:防止外面调用该类创建对象 无法实现单例

2.一开始先创建一个静态对象 目的:这个对象就是单例

3.创建一个pubilc静态方法来返回对象,供外面调用该对象
代码如下:

//所谓的单例模式就是采取一定的方法保证整个系统软件中,对某个类实例只能存在单个类实例
public class SingletonTest1 {
    public static void main(String[] args){
        Bank bank1=Bank.getInstance();//通过调用内部类的方法 从而调用该对象
        Bank bank2=Bank.getInstance();//两个对象都是一样的
 
        System.out.println(bank1 == bank2);
    }
 
}
//饿汉式模式
class Bank{
    //私有化类的构造器  目的:防止外面调用造对象  如果不将其定义成私有的
    // 那么便可以在外面不断的创建类对象 无法做到只有一个对象
    private Bank(){
 
    }
    //内部创建类的对象 要求此对象必须为静态  目的:在内部创建对象
    //为了能够对象  因为外面不能创建该类的对象
    private static Bank instance = new Bank();
    //但是为了使外部能够调用到该对象我们必须提供一个静态方法让外部调用
    //提供公共的静态方法,返回类对象
    public static Bank getInstance(){
        return instance;
    }
}

懒汉式:
1.创建一个类 并将构造器设置为私有的 目的:防止外面的对象去调用 无法弄成单例模式

2.声明一个静态对象 但是没有初始化 等到要使用的时候再去初始化对象 避免占用内存空间

3.提供一个public static 方法供外面调用
代码如下:

public class SingletonTest2 {
    public static void main(String[] args){
        order order1=order.getInstance();
        order order2=order.getInstance();
 
        System.out.println(order1==order2);
    }
 
}
 
//懒汉式
class order{
    //1.私有化类的构造器 目的:为了不让在外面创建对象
    private order(){
 
    }
    //2.声明当前对象,没有初始化
    //4.此对象必须为静态
    private static order instance =null;//先设置为空 等要使用的时候再去创建对象
    //3.声明public、static返回当前对象的方法 目的:为外部调用提供方法  不然外部无法调用
    public static order getInstance(){
        if(instance==null){//这时如果有两个线程同时调用该方法  在这里面有可能出现线程的阻塞问题 导致创建出不同的对象
            instance=new order();
        }
        return instance;
    }
 
}

工厂方法模式、抽象工厂模式、代理模式、装饰器模式、观察者模式和责任链模式

8.git和svn的区别以及各自优势

一.区别:
1、定义不同
svn:Apache Subversion是Apache许可证下的开源软件版本和版本控制系统。
git:Git是由Linus Torvalds在2005年开发的开源分布式版本控制系统。它强调速度和数据完整性。

2、模型类型不同
svn:svn是集中式模型。
git:Git 是一个分布式模型。

3、存储单元不同
svn:SVN按照原始文件存储,体积较大。
git:Git按照元数据方式存储,体积很小

4、版本库不同
svn:SVN只能有一个指定中央版本库。当这个中央版本库有问题时,所有工作成员都一起瘫痪直到版本库维修完毕或者新的版本库设立完成
git:Git可以有无限个版本库。或者,更正确的说法,每一个Git都是一个版本库,区别是它们是否拥有活跃目录(Git Working Tree)。如果主要版本库发生了什么事,工作成员仍然可以在自己的本地版本库(local repository)提交,等待主要版本库恢复即可。工作成员也可以提交到其他的版本库。

二、git的优缺点
优点:

适合分布式开发,强调个体。
公共服务器压力和数据量都不会太大。
速度快、灵活。
任意两个开发者之间可以很容易的解决冲突。
离线工作。
缺点:

资料少(起码中文资料很少)。
学习周期相对而言比较长。
不符合常规思维。
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
三、svn的优缺点
优点:

集中式管理,管理方式在服务端配置好,客户端只需要同步提交即可,使用方便,操作简单,很容易就可以上手。
在服务端统一控制好访问权限,利用代码的安全管理。
所有的代码以服务端为准,代码一致性高。
缺点:

所有操作都需要通过服务端进行同步,这会导致服务器性能要求比较高。如果服务器宕机了就无法提交代码了。
分支管理不灵活,svn分支是一个完整的目录,且这个目录拥有完整的实际文件,这些操作都是在服务端进行同步的。
不是本地化操作,如果要删除分支,也是需要将远程的分支进行删除,这会导致大家都得同步。
需要连网,如果无法连接到服务器就无法提交代码。

9.maven是如何管理jar包版本的

添加依赖时不再指定版本,而是将版本在properties节点中指定版本号,做版本统一管理
在modules子模块中的项目中如需要使用dependencies节点下的依赖时,子模块的pom.xml将不需要添加任何依赖

  1. 如果大量模块需要用同一个依赖,可将此依赖放在父级模块pom.xml文件下的dependencies节点下;

  2. 反之如果只是其中某一个子模块需要用,那么将此依赖放在dependencyManagement节点下,此节点下的子模块别忘了依赖仍然需要引入,只是不需要再配置版本号。

10.Jenkins的搭建和配置

转:https://www.cnblogs.com/cuitang/p/16310750.html

11.比较get请求和post请求的异同

1.post请求更安全;post请求不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存。2、post请求发送的数据更大,get请求有url长度限制。3、post请求能发送更多的数据类型,get请求只能发送ASCII字符。4、传参方式不同。5、get产生一个TCP数据包;post产生两个。

12.webSocket编程;

WebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术。WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程。其目的是在web浏览器和服务器进行频繁双向通信时,可以使服务器避免打开多个Http连接进行工作来节约资源,提高工作效率和资源利用率。

13.http的理解

http的三个特点:
1.http协议是无状态的
就是说每次HTTP请求都是独立的,任何两个请求之间没有什么必然的联系。但是在实际应用当中并不是完全这样的,引入了Cookie和Session机制来关联请求。
2.多次http请求
在客户端请求网页时多数情况下并不是一次请求就能成功的,服务端首先是响应HTML页面,然后浏览器收到响应之后发现HTML页面还引用了其他的资源,例如,CSS,JS文件,图片等等,还会自动发送HTTP请求这些需要的资源。现在的HTTP版本支持管道机制,可以同时请求和响应多个请求,大大提高了效率。
3.基于TCP协议
HTTP协议目的是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。底层是基于TCP实现的。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。

14.UDP与TCP的异同

TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是对大数据面试题——spark面试题(一)的回答: 1. 什么是Spark?它与Hadoop有什么区别? Spark是一个快速、通用、可扩展的大数据处理引擎,它可以在内存中进行数据处理,因此比Hadoop更快。与Hadoop相比,Spark的优点在于它可以在内存中进行数据处理,因此速度更快,而且它支持更多的数据处理方式,例如流处理、图形处理等。 2. Spark的核心组件有哪些? Spark的核心组件包括Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX。 3. 什么是RDD?它有哪些特点? RDD是Spark中的一个基本概念,它代表一个不可变的分布式数据集合。RDD具有以下特点: - 可以在内存中进行计算,因此速度快; - 支持多种操作,例如map、reduce、filter等; - 可以进行持久化,以便在后续计算中重复使用。 4. Spark中的map和flatMap有什么区别? map和flatMap都是RDD中的转换操作,它们的区别在于: - map操作对每个元素进行转换,返回一个新的元素; - flatMap操作对每个元素进行转换,返回一个包含多个元素的序列。 5. 什么是Spark的shuffle操作? Spark的shuffle操作是指将数据重新分区的操作,它通常发生在reduce操作之前。Shuffle操作会将数据从多个节点上收集到一个节点上,然后重新分区,以便进行后续的计算。 6. Spark中的cache和persist有什么区别? cache和persist都是将RDD持久化到内存中,以便在后续计算中重复使用。它们的区别在于: - cache操作默认将数据持久化到内存中,而persist操作可以指定将数据持久化到内存、磁盘或者其他存储介质中; - cache操作是persist操作的一种简化形式,它默认将数据持久化到内存中,并且只能持久化到内存中。 7. Spark中的reduceByKey和groupByKey有什么区别? reduceByKey和groupByKey都是对键值对RDD进行操作的函数,它们的区别在于: - reduceByKey操作会在每个分区内先进行本地聚合,然后再进行全局聚合,因此效率更高; - groupByKey操作会将所有的键值对都进行网络传输,然后在一个节点上进行聚合,因此效率较低。 8. Spark中的broadcast变量有什么作用? broadcast变量是一种只读的变量,它可以在所有节点上共享,以便在计算过程中使用。使用broadcast变量可以避免在网络上传输大量的数据,从而提高计算效率。 9. 什么是Spark的checkpoint操作? Spark的checkpoint操作是将RDD持久化到磁盘上,以便在后续计算中重复使用。与cache和persist不同的是,checkpoint操作会将数据持久化到磁盘上,以便在内存不足时可以从磁盘上恢复数据。 10. Spark中的Task是什么? Task是Spark中的一个基本概念,它代表一个可以在一个节点上执行的计算任务。Spark将一个RDD分成多个分区,每个分区对应一个Task,这些Task可以并行执行,以提高计算效率。 ### 回答2: 今天我们来讨论一下关于Spark大数据面试的一些常见问题。Spark是一种基于Hadoop的开源计算系统,它能够快速处理大规模数据,并且支持多种编程语言,包括Java、Scala和Python等。以下是一些Spark面试题及其答案: 1. Spark有哪几种部署模式? Spark有三种部署模式,分别是本地模式、集群模式和分布式模式。本地模式指的是在本地运行Spark应用程序,不需要连接到外部计算机。集群模式指的是单个Spark集群环境,它由一组Spark节点组成,可以在数据中心或云中运行。分布式模式指的是使用多个Spark集群并行处理大规模数据。 2. Spark和Hadoop的区别是什么? Spark和Hadoop都是处理大规模数据的工具,但它们有一些区别。首先,Spark处理数据速度快,因为它将数据存储在内存中,而Hadoop则将数据存储在磁盘中。其次,Spark支持更多的编程语言,包括Java、Scala和Python等,而Hadoop只支持Java。此外,Spark具有更好的机器学习和图形处理功能,可以更好地支持大规模数据分析。 3. Spark的RDD是什么? RDD是Spark中重要的概念,全称为Resilient Distributed Dataset。它是一个不可变的分布式数据集合,可以分区存储在不同节点上,并且每个分区都可以在并行处理中进行处理。RDD支持两种操作,即转化操作和行动操作。转化操作将一个RDD转换为另一个RDD,而行动操作返回一个结果或将结果输出至外部系统。 4. Spark的优化技术有哪些? Spark优化技术包括数据本地化、共享变量、宽依赖和窄依赖、缓存和持久化,以及数据分区等技术。数据本地化将数据存储在尽可能接近计算节点的位置,以减少网络传输的开销。共享变量将常用的变量通过广播或累加器的方式在节点中共享,从而减少网络传输量。宽依赖和窄依赖指的是在转化操作中RDD之间的依赖关系,窄依赖表示每个父分区最多与一个子分区有关联,而宽依赖则表示多个子分区可能与多个父分区关联。缓存和持久化技术可将RDD保存在内存中,从而加速访问速度。数据分区可以将数据划分为较小的块进行并行处理。 5. Spark Streaming是什么? Spark Streaming是Spark的一个扩展模块,它支持实时数据流处理。Spark Streaming可以将实时数据流以微批次方式处理,每个批次的数据处理平均耗时只有几秒钟。Spark Streaming可以将数据存储在内存或磁盘中,同时支持多种数据源和数据输出方式。 以上是关于Spark大数据面试题的一些回答,希望能够对大家有所帮助。如果你想深入学习Spark和大数据处理技术,可以考虑参加相关的培训课程或在线课程。 ### 回答3: Spark是一个分布式计算框架,它可以使大规模数据处理更加高效和便捷。因此,在企业招聘大数据领域的人才时,对Spark的技术能力要求越来越高。以下是Spark面试题的回答: 1. Spark有哪些组件? Spark框架由三个核心组件组成:Spark Core、Spark SQL和Spark Streaming。此外,还有Spark MLlib、Spark GraphX、Spark R等个别不同的子组件。 2. 什么是RDD?与Dataframe有什么区别? RDD(弹性分布式数据集)是Spark的核心数据抽象,是不可变的分布式对象集合。RDD可以从文件中读取数据、从内存中读取数据、并行修改数据等。而Dataframe和RDD类似,但是Dataframe更加强大,因为它是带有结构化的RDD。Dataframe在处理大规模结构化数据时非常有效和便捷。 3. Spark如何处理缺失数据? Spark提供了两种处理缺失数据的方法:第一种是使用DataFrame API中的na函数,可以删除或替换缺失值;第二种是使用MLlib中的Imputer类,可以将缺失值替换为均值或中位数。 4. 什么是Spark的任务(task)? 一个任务是Spark作业中的最小执行单位。Spark集群上的作业被划分为多个任务,这些任务可以并行执行。 5. Spark的shuffle操作是什么?它为什么是昂贵的? Spark的shuffle操作是将一组数据重新分配到不同计算节点上的操作。Shuffle操作可能会导致大量数据的磁盘写入、网络传输和数据重组,这些都是非常昂贵的操作。因此,它在Spark集群中是一个相当昂贵的操作。 6. Spark中的Partition有什么作用? Partition是Spark中的数据划分单位。它可以将数据分成多个块并对每个块进行处理。Partition 可以提高 Spark 的并行度和运行效率,因为它可以将大规模数据分成多个小块,并在集群的多个计算节点上并行处理数据。 总而言之,Spark是大数据领域中使用最广泛的计算引擎之一,其技术理念和应用场景非常广泛。对于求职者而言,掌握 Spark 的基本概念和技术特点,提高对 Spark 的理解和应用能力,将有助于更好地处理和分析大规模数据集。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值