第一轮面试题汇总

Posted day-day--up

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一轮面试题汇总相关的知识,希望对你有一定的参考价值。

1.描述下数据库中的事务--ACID各个的特点

原子性(Atomicity):事务中的操作要么全部成功要么全部失败。 一致性(Consistency):事务前后数据的完整性必须保持一致。 隔离性(Isolation):多个并发的事务之间是相互隔离的,互不干扰的。 持久性(Durability):事务提交后,数据是永久改变的。

2.什么是springboot?你们公司是用的哪个版本?

SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务。

Spring boot 的优点

轻松创建独立的Spring应用程序

内联Tomcat、jetty等web容器,不需要部署WAR文件。 提供一系列的“starter”来简化的Maven配置

开箱即用,尽可能自动配置Spring

版本号:2.1.6

3.什么是redis?

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis优势

  • 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型-Redis支持二进制案列的String,Lists,Hashes,Sets及Ordered Sets 数据类型操作。
  • 原子—Redis的所有操作都是原子性(不可再分)的,意思就是要么成功执行要么失败不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性—Redis还支持publish/subscribe,通知,key过期等等特性**

4.如何理解springcloud微服务项目中,eureka,provider,consumer它们之间的关系?

eureka:提供服务注册于发现 provider:服务提供方法将自身注册到eureka,让消费方找到 consumer:服务消费方从eureka获取注册服务列表,能够消费服务

5.mysql默认的存储引擎是什么?

Mysql在V5.1之前默认存储引擎是MyISAM; 在此之后默认存储引擎是InnoDB。MyISAM不支持事务,InnoDB支持事务。 MyISAM不支持外键,InnoDB支持外键,MyISAM支持全文索引,InnoDB不支持全文索引。

6.什么是跨域?

要了解跨域,先要说说同源策略。所谓同源是指,域名,协议,端口相同,有一个不一样则是跨域。

同源策略一般又分为以下两种:

DOM同源策略:禁止对不同源页面DOM进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。

XmlHttpRequest同源策略:禁止使用XHR对象向不同源的服务器地址发起HTTP请求。

跨域,指的是从一个域名去请求另外一个域名的资源。即跨域名请求!跨域时,浏览器不能执行其他域名网站的脚本,是由浏览器的同源策略造成的,是浏览器施加的安全限制。

跨域的严格一点来说就是只要协议,域名,端口有任何一个的不同,就被当作是跨域。

7.什么是token?

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。 当第一次登录后,服务器生成一个Token便将此Token返回给客户端, 以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

8.什么是RESTful?

首先rest是一种API的模式,常以JSON格式编写。符合rest约束风格和原则的应用程序或设计就是RESTful。

9.SpringCloud解决了哪些问题?

与分布式系统相关的复杂性 – 包括网络问题,延迟开销,带宽问题,安全问题。 处理服务发现的能力 – 服务发现允许集群中的进程和服务找到彼此并进行通信。 解决冗余问题 – 冗余问题经常发生在分布式系统中。 负载平衡 – 改进跨多个计算资源(例如计算机集群,网络链接,中央处理单元)的工作负载分布。 减少性能问题 – 减少因各种操作开销导致的性能问题。

10.微服务中什么是熔断?什么是服务降级?

服务熔断的作用是当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。 
服务降级是为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。

11.微服务的优缺点是什么?

优点:

易于开发和维护:因为一个服务只关注一个特定的业务,业务就变得比较清晰。同时维护起来也是比较方便。 单个服务启动比较快:单个服务代码量不会很多,启动起来就会很快。 便于伸缩:如果系统中有三个服务ABC,服务B的访问量比较大,我们可以将服务B集群部署。

松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多个业务, 只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。 微服务只专注于当前业务逻辑代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。

缺点: 运维要求比较高:之前就一个war包,现在一个系统中会有很多的服务,每个服务都对应一个war包,维护起来就会变得很麻烦。 技术复杂性提高:微服务就会带来一系列的问题,事务问题,Session一致性问题,锁问题等。

随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资源增多,系统依赖增强,数据一致性,性能监控。

 

(微服务的缺点

1. 服务调用跨网络,增加网络IO,降低性能。

2. 服务调用跨更多节点,分布式事务数据不一致性可能更大。

3. 需要服务发现,增加复杂度。

4. 运维、测试基于微服务架构的应用也很复杂。

5. 每个服务都是一个独立系统,代码重复,增加系统框架不一致的可能性。

6. 所以服务总的启动时间长。

7. 服务依赖的传递性,A依赖B,B依赖C。那么只能先部署好C、再部署B、再部署A。

 

 微服务的优点

1. 传统微服务能使用不同的语言、框架开发。

2. 一个jar是计算密集型的,一个jar是io密集型的,集成在一个系统里,会有资源冲突。)

 

12.微服务之间如何独立通讯的?

同步通信:dobbo通过 RPC 远程过程调用、springcloud通过 REST接口json调用等。异步:消息队列,如:RabbitMq、ActiveMq、Kafka 等。

(

同步:RPC ,REST等。

  异步:消息队列,要考虑消息的可靠传输、高性能,以及编程模型的变化等。

RestTemplate通信的三种方式:

 

第一种调用方式

  RestTemplate restTemplate = new RestTemplate();

  String data = restTemplate.getForObject("http://localhost:8773/hi?name=ceshi",String.class);

  ResposeResult responseFinishEntity = restTemplate.postForObject(urlNameString, inOrderVO, ResposeResult.class);

 

第二种调用方式:

  @Autowired

  private LoadBalancerClient loadBalancerClient;

  //第二种调用方式

  RestTemplate restTemplate = new RestTemplate();

  ServiceInstance serviceInstance = loadBalancerClient.choose("provider");

  String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort());

  String data = restTemplate.getForObject(url,String.class);

 

第三种调用方式(使用server_id

  RestTemplate restTemplate = new RestTemplate();

  String data =  restTemplate.getForObject("http://service-provider/hi?name=" + name, String.class);

负载均衡:在启动类中加入RestTemplate中bean和LoadBalanced注解

 

  @Bean

  @LoadBalanced

  RestTemplate restTemplate(){

      return new RestTemplate();

   }

再通过注解直接使用restTemplate

 

  @Autowired

  RestTemplate restTemplate;

配置负载均衡规则。默认是轮询规则

 

service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

)

13.SpringCloud 和 Dubbo 有哪些区别?

首先他们都是分布式管理框架。 dubbo 是二进制传输,占用带宽会少一点。SpringCloud是http 传输,带宽会多一点,同时使用http协议一般会使用JSON报文,消耗会更大。 dubbo 开发难度较大,所依赖的 jar 包有很多问题大型工程无法解决。SpringCloud 对第三方的继承可以一键式生成,天然集成。 SpringCloud 接口协议约定比较松散,需要强有力的行政措施来限制接口无序升级。 最大的区别: Spring Cloud抛弃了Dubbo 的RPC通信,采用的是基于HTTP的REST方式。 严格来说,这两种方式各有优劣。虽然在一定程度上来说,后者牺牲了服务调用的性能, 但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约, 不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适。

(

首先,他们都是分布式管理框架。
    dubbo 是二进制传输,占用带宽会少一点。SpringCloud是http 传输,带宽会多一点,同时使用http协议一般会使用JSON报文,消耗会更大。
    dubbo 开发难度较大,所依赖的 jar 包有很多问题大型工程无法解决。SpringCloud 对第三方的继承可以一键式生成,天然集成。
    SpringCloud 接口协议约定比较松散,需要强有力的行政措施来限制接口无序升级。
最大的区别:
    Spring Cloud抛弃了Dubbo 的RPC通信,采用的是基于HTTP的REST方式。


    严格来说,这两种方式各有优劣。虽然在一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适。

 

)

14.SpringBoot 和 SpringCloud 之间关系?

SpringBoot:专注于快速方便的开发单个个体微服务(关注微观); SpringCloud:关注全局的微服务协调治理框架,将SpringBoot开发的一个个单体微服务组合并管理起来(关注宏观); SpringBoot可以离开SpringCloud独立使用,但是SpringCloud不可以离开SpringBoot,属于依赖关系。

(

1、SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。

2、SpringCloud是一系列框架的集合,可以包含SpringBoot。

)

15.eureka和zookeeper的区别?

eureka和zookeeper都可以提供服务注册与发现的功能,zookeeper 是CP原则,强一致性和分区容错性。eureka 是AP 原则 可用性和分区容错性。 zookeeper当主节点故障时,zk会在剩余节点重新选择主节点,耗时过长,虽然最终能够恢复,但是选取主节点期间会导致服务不可用,这是不能容忍的。 eureka各个节点是平等的,一个节点挂掉,其他节点仍会正常保证服务。

(

eureka和zookeeper都可以提供服务注册与发现的功能,zookeeper 是CP原则,强一致性和分区容错性。eureka 是AP 原则 可用性和分区容错性。

zookeeper当主节点故障时,zk会在剩余节点重新选择主节点,耗时过长,虽然最终能够恢复,但是选取主节点期间会导致服务不可用,这是不能容忍的。

eureka各个节点是平等的,一个节点挂掉,其他节点仍会正常保证服务。

)

16.mycat是什么?你们公司分库分表的分片规则是什么?

Mycat是基于MySQL的数据库中间件,用来协调切分后的数据库,使其可以进行统一管理。

分片规则:取模分片 PartitionByMode

(

Mycat是基于MySQL的数据库中间件,用来协调切分后的数据库,使其可以进行统一管理。

分片规则:取模分片 PartitionByMode

)

17.什么是集合?

集合有两个父接口,一个collection,一个Map; 而collection有两个子接口,一个List,一个Set; List有两个常见的实现类 ArrayList,LinkedList; Set有两个常见的实现类 HashSet,TreeSet; Map有两个常见的实现类 HashMap,HashTable。

(

集合就是一个放数据的容器,准确的说是放数据对象引用的容器。

集合类存放于java.util包中;集合类型主要有3种:set(集)、list(列表)和map(映射);集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。

)

18.什么是dubbo?

 

Dubbo按照分层的方式来架构,可以最大限度地松耦合。Dubbo采用一种非常简单的模型, 要么提供方提供服务, 要么是消费方消费服务, 所以基于这一点可以抽象出服务提供方和服务消费方两个角色

面向接口的远程方法调用:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。****

智能容错和负载均衡:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。** **

服务自动注册和发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以滑增加或减少机器******

(

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

其核心部分包含:

1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

)

19.什么是spring?

Spring是一个开源的轻量级的Java开发框架。是一种简化应用程序的开发。 在spring出来之前,service层调用dao层都是用new的方式,在spring出来之后,service层和到dao层都会放在spring容器去管理,这是spring的第一种特性,我们称之为IOC,控制反转。 spring还有一种特性,我们称之为AOP,大白话,所谓“面向切面”,说白了就是专门的人干专门的事。在项目很多公有的或是要被重复被调用的模块可以被抽取出来,利用的就AOP的特性,例如日志模块。

(

Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容器。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

)

以上是关于第一轮面试题汇总的主要内容,如果未能解决你的问题,请参考以下文章

架构设计第一讲:架构设计相关面试题汇总

042期JavaEE面试题汇总

面试题汇总

秒杀多线程第一篇 多线程笔试面试题汇总

2018 春招常见Java面试题汇总

剑指Offer学习所有面试题汇总