java技术专家面试指南50问【java学习+面试宝典】(六)

作为服务注册中心,Eureka比Zookeeper好在哪里?

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

MySQL分库分表了解过吗?

详见:https://baijiahao.baidu.com/s?id=1622441635115622194

什么是Hystrix断路器?我们需要它吗?

由于某些原因,employee-consumer公开服务会引发异常。在这种情况下使用Hystrix我们定义了一个回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。

xargs 命令

将所有图片文件拷贝到外部驱动器:ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory 。
将系统中所有 jpg 文件压缩打包:find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz 。
下载文件中列出的所有 url 对应的页面:cat url-list.txt | xargs wget –c 。

使用Spring Cloud有什么优势?

使用Spring Boot开发分布式微服务时,我们面临以下问题

正向代理和反向代理的区别

正向代理:发生在客户端,是由用户主动发起的。比如翻墙,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端。
反向代理:发生在服务器端,用户不知道发生了代理。

vim有几种工作模式?

命令模式,行末模式,编辑模式

Tomcat一个请求的完整过程

首先 dns 解析 wo.de.tian机器,一般是ng服务器ip地址
然后 ng根据server的配置,寻找路径为 yy/的机器列表,ip和端口
最后 选择其中一台机器进行访问—->下面为详细过程

RocketMQ如何做负载均衡?

通过Topic在多Broker中分布式存储实现。

Redis是单线程还是多线程?

Redis6.0采用多线程IO,不过命令的执行还是单线程的。
Redis6.0之前,IO线程和执行线程都是单线程的。

tar 命令

创建一个新的 tar 文件: tar cvf archive_name.tar dirname/ 。
解压 tar 文件:tar xvf archive_name.tar 。
查看 tar 文件:tar tvf archive_name.tar 。

如何读取Servlet的初始化参数?

ServletConfig中定义了如下的方法用来读取初始化参数的信息:

Thread.sleep(0)的作用是什么?

由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。

用一条命令显示本机 eth0 网卡的 IP 地址,不显示其它字符?

方法一:
ifconfig eth0|grep inet|awk -F ‘:’ ‘{print $2}’|awk ‘{print $1}’
方法二
ifconfig eth0|grep “inet addr”|awk -F ‘[ :]+’ ‘{print $4}’
方法三:
ifconfig eth0|awk -F ‘[ :]+’ ‘NR==2 {print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲' 方法四: ifconfi…##g’
方法五:
ifconfig eth0|sed -n ‘2p’|sed -r ‘s#^.addr:(.) Bc.*$#\1#g’
方法六(CENTOS7 也适用):
ip addr|grep eth0|grep inet|awk ‘{print $2}’|awk -F ‘/’ ‘{print $1}’

什么是ElasticSearch?

Elasticsearch是一个基于Lucene的搜索引擎。它提供了具有HTTP Web界面和无架构JSON文档的分布式,多租户能力的全文搜索引擎。Elasticsearch是用Java开发的,根据Apache许可条款作为开源发布。

Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

Elasticsearch 提供的首个近似聚合是cardinality 度量。它提供一个字段的基数,即该字段的distinct或者unique值的数目。它是基于HLL算法的。HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关 。

rm 命令

删除文件前先确认:rm -i filename.txt 。
在文件名中使用 shell 的元字符会非常有用。删除文件前先打印文件名并进行确认:rm -i file* 。
递归删除文件夹下所有文件,并删除该文件夹:rm -r example 。

HTTP协议包括哪些请求?

  • GET:对服务器资源的简单请求
  • POST:用于发送包含用户提交数据的请求
  • HEAD:类似于GET请求,不过返回的响应中没有具体内容,用于获取报头
  • PUT:传说中请求文档的一个版本
  • DELETE:发出一个删除指定文档的请求
  • TRACE:发送一个请求副本,以跟踪其处理进程
  • OPTIONS:返回所有可用的方法,检查服务器支持哪些方法
  • CONNECT:用于ssl隧道的基于代理的请求

适配器模式是什么?什么时候使用?

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。

ReentrantLock实现原理

详见:https://blog.csdn.net/yanbin0830/article/details/107542529

zookeeper是如何保证事务的顺序一致性的?

zookeeper采用了全局递增的事务Id来标识,所有的proposal(提议)都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch(时期; 纪元; 世; 新时代)用来标识leader周期,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。

Redis主要消耗什么物理资源?

内存。

在整个目录树下查找文件 “core” ,如发现则无需提示直接删除它们?

find / -name core -exec rm {} ;

Mybatis动态SQL?

  1. 传统的JDBC的方法,在组合SQL语句的时候需要去拼接,稍微不注意就会少少了一个空格,标点符号,都会导致系统错误。Mybatis的动态SQL就是为了解决这种问题而产生的;Mybatis的动态SQL语句值基于OGNL表达式的,方便在SQL语句中实现某些逻辑;可以使用标签组合成灵活的sql语句,提供开发的效率。

Redis和Redisson有什么关系?

Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

Spring MVC的工作原理了解嘛?

1.客户端(浏览器)发送请求,直接请求到DispatcherServlet。
2.DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
3.解析到对应的Handler(也就是我们平常说的Controller控制器)。
4.HandlerAdapter会根据Handler来调用真正的处理器来处理请求和执行相对应的业务逻辑。
5.处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是逻辑上的View。
6.ViewResolver会根据逻辑View去查找实际的View。
7.DispatcherServlet把返回的Model传给View(视图渲染)。
8.把View返回给请求者(浏览器)。

ArrayList和LinkedList有什么区别?

  1. ArrayList和LinkedList的差别主要来自于Array和LinkedList数据结构的不同。ArrayList是基于数组实现的,LinkedList是基于双链表实现的。另外LinkedList类不仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,因此LinkedList可以作为双向队列 ,栈(可以参见Deque提供的接口方法)和List集合使用,功能强大。

char型变量中能否能不能存储一个中文汉字,为什么?

char可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char 类型占2个字节(16 比特),所以放一个中文是没问题的。

线程池都有哪几种工作队列?

ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue:是一个基于链表结构的阻塞队列,此队列按FIFO排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
SynchronousQueue:是一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于Linked-BlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
PriorityBlockingQueue:一个具有优先级的无限阻塞队列。

Redis中的大key怎么处理?

大key指的是value特别大的key。比如很长的字符串,或者很大的set等等。
大key会造成2个问题:1、数据倾斜,比如某些节点内存占用过高。2、当删除大key或者大key自动过期的时候,会造成QPS突降,因为Redis是单线程的缘故。
处理方案:可以将一个大key进行分片处理,比如:将一个大set分成多个小的set。

Servlet和JSP的区别?

Servlet是服务器端的程序,动态生成html页面发送到客户端,但是这样程序里会有很多out.println(),java与html语言混在一起很乱,造成编写逻辑控制的后台工程师和设计前端网页的前端工程师彼此很难独立开展工作,所以后来sun公司推出了JSP,其实JSP就是Servlet,每次运行的时候JSP都首先被编译成servlet文件,然后再被编译成.class文件运行。有了jsp,在MVC项目中servlet不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制jsp与javabean之间的流转。其实对jsp也有封装的模板工具velocity和freemarker。

Servlet的生命周期?

—根据Servlet的配置参数1来决定实例化时机,没有配置该参数项或者为负数,则第一次访问的时候才会被实例化并调用init () 函数,如果为0或者正整数,则服务器启动的时候就会被加载,加载顺序由小到达。Servlet 通过调用 init () 方法进行初始化。

static注意事项

1、静态只能访问静态。 2、非静态既可以访问非静态的,也可以访问静态的。

消息怎么路由?

从概念上来说,消息路由必须有三部分:交换器、路由、绑定。生产者把消息发布到交换器上;绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。

单片,SOA 和微服务架构有什么区别?

· 单片架构类似于大容器,其中应用程序的所有软件组件组装在一起并紧密封装。
· 一个面向服务的架构(SOA)是一种相互通信服务的集合。通信可以涉及简单的数据传递,也可以涉及两个或多个协调某些活动的服务。
· 微服务架构是一种架构风格,它将应用程序构建为以业务域为模型的小型自治服务集合。

分布式系统的接口幂等性设计

唯一id。每次操作,都根据操作和内容生成唯一的id,在执行之前先判断id是否存在,如果不存在则执行后续操作,并且保存到数据库或者redis等。
服务端提供发送token的接口,业务调用接口前先获取token,然后调用业务接口请求时,把token携带过去,务器判断token是否存在redis中,存在表示第一次请求,可以继续执行业务,执行业务完成后,最后需要把redis中的token删除
建去重表。将业务中有唯一标识的字段保存到去重表,如果表中存在,则表示已经处理过了
版本控制。增加版本号,当版本号符合时,才能更新数据
状态控制。例如订单有状态已支付 未支付 支付中 支付失败,当处于未支付的时候才允许修改为支付中等

服务器角色

Leader
事务请求的唯一调度和处理者,保证集群事务处理的顺序性
集群内部各服务的调度者

Dubbo启动时如果依赖的服务不可用会怎样?

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,默认 check=“true”,可以通过 check=“false” 关闭检查。

为什么MongoDB的数据文件很大?

MongoDB采用的预分配空间的方式来防止文件碎片。

说说synchronized的实现原理

在 Java 中,每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程其实就是竞争 monitor 的过程,当线程进入字节码 monitorenter 指令之后,线程将持有 monitor 对象,执行 monitorexit 时释放 monitor 对象,当其他线程没有拿到 monitor 对象时,则需要阻塞等待获取该对象。

什么是索引?

索引是一种数据结构,可以帮助我们快速的进行数据的查找。

Zookeeper有哪几种部署模式?

单机模式、伪集群模式、集群模式。

Netty 的心跳机制了解么?

在 TCP 保持长连接的过程中,可能会出现断网等网络异常出现,异常发生的时候, client 与 server 之间如果没有交互的话,它们是无法发现对方已经掉线的。为了解决这个问题, 我们就需要引入 心跳机制。

Netty 的零拷贝了解么?

维基百科是这样介绍零拷贝的:“零复制(英语:Zero-copy;也译零拷贝)技术是指计算机执行操作时,CPU 不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省 CPU 周期和内存带宽。

怎么打出线程栈信息?

输入jps,获得进程号。
top -Hp pid 获取本进程中所有线程的CPU耗时性能
jstack pid命令查看当前java进程的堆栈状态
或者 jstack -l > /tmp/output.txt 把堆栈信息打到一个txt文件。
可以使用fastthread 堆栈定位(fastthread.io)

比较一下Spring Security和Shiro各自的优缺点?

由于Spring Boot官方提供了大量的非常方便的开箱即用的Starter,包括Spring Security的Starter,使得在SpringBoot中使用Spring Security变得更加容易,甚至只需要添加一个一来就可以保护所有接口,所以如果是SpringBoot项目,一般选择Spring Security。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。

Nginx应用场景?

http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

非对称加密

示例

什么是Mybatis?

1)mybatis是一个半ORM框架,它内部封装了JDBC,开发时只需要关乎sql语句本身,不需要花费精力去处理驱动,创建连接,创建1statement等繁复过程。

你能简要介绍一下Kubernetes控制管理器吗?

多个控制器进程在主节点上运行,但是一起编译为单个进程运行,即Kubernetes控制器管理器。因此,Controller Manager是一个嵌入控制器并执行命名空间创建和垃圾收集的守护程序。它拥有责任并与API服务器通信以管理端点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值