17、Dubbo是在什么背景下被开发的?
Dubbo就是一种RPC框架
传统项目中,所有的功能模块都部署在一台服务器上,如果某一个模块出现了问题,都影响整个项目的运行;所以要根据功能模块将项目分开,这就是分布式的来源。每个系统可能还有配置多台服务器Tomcat;那么各个系统如何联系和调用呢?就需要微服务实现服务的自动发现,而dubbo是微服务的一种最佳实现;其中最关键的就是zookeeper;
Dubbo是微服务的一种框架,基于RPC进行远程传输数ti据,传输的是对象(先序列化);微服务其实就是服务的自动发现,实现对资源的控制,使人参与的事情越来越少,最终实现的是服务器全部的自动发现;
Dubbo 整合了SOA(面向服务的架构)思想、微服务和RPC,是SOA思想的一种最佳实现,也是微服务中的一种,另一种springCloud;
所以要讲Dubbo,就要先说微服务,最关键的是zookeeper,即注册中心;
18、spring中哪些常用的注解?
@Controller、@RequestMapping、@Autowired、@ResponseBody、 @PathVariable、@Service、@Override
@Table、@Id
19、springBoot有哪些优势?
不用生成xml配置文件,不用部署Tomcat、不用写web.xml,需要写yml文件;
20、Token是基于什么算法生成的?如果token存于Cookie中,别人可以模仿Cookie去获取token?如何解决?
存于session
21、项目中在哪里用到了反射?
框架中用到反射比较多点,项目中代理模式的使用需要用到反射;
22、Redis会有主从分离吗?
有,“从”负责备份,“主”负责查询,当主机宕机又恢复后会从从机里恢复数据;
23、Redis 如何实现高可用?
Redis 高可用技术是为了解决 redis 宕机后影响整个服务的一种架构方式.主要采用主从结构来实现高可用.(主从挂载)
高可用实现的方式有哨兵和集群 2 种方式.主要思想都是监听主节点的信息. 我们把这种监听方式称之为心跳机制.
当在规定的时间内主节点没有响应,则判断主节点死亡.则会启动从节点代替主节点为用户提供服务.
Redis 分片机制是将多 reids 看做一个整体,每个 redis 只负责一个固定的区域.进行数据的更新和维护.这种方式的实现主要是基于 hash 一致性算法.根据 key 值计算出 hash 的位置,最终将数据保存.并且这个 key 值指向管理该区域的点
四、数据库相关(mysql)
1、有没有msyql优化经验?(苏宁)
2、mysql的索引分类?
索引的建立一般在where上
3、唯一索引、主键索引的区别?(苏宁)
唯一索引列的值必须唯一,但允许有空值。
主键索引是一种特殊的唯一索引,不允许有空值。
4、聚簇索引和非聚簇索引的区别?(携程)
在访问速度上,聚簇索引比非聚簇索引快
5、mysql的存储引擎有哪些,区别是什么;
Innodb
6、说说事务的特性和隔离级别(MySQL默认的隔离级别是?)(饿了么)
事务的特性:ACID
默认隔离级别:可重复读Repeatable read
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 Read Uncommitted | ✅ | ✅ | ✅ |
读已提交 Read Committed | ❎ | ✅ | ✅ |
可重复读Repeatable read | ❎ | ❎ | ✅ |
可串行化 Serialiable | ❎ | ❎ | ❎ |
7、你们的项目中,是怎么控制事务的?
利用AOP
8、左外连接、右外连接、全连接;自然连接、内连接等概念?(饿了么)
内连接: a inner join b on 条件
左外连接: a left join b on 条件
右外连接: a right join b on 条件
全连接: a full join b on 条件
9、如何确定SQL是否走了索引?
explain 显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。简单讲,它的作用就是分析查询性能。
explain 关键字的使用方法很简单,就是把它放在select查询语句的前面。
mysql查看是否使用索引,简单的看type类型就可以。如果它是all,那说明这条查询语句遍历了所有的行,并没有使用到索引。比如:explain select * from company_info where cname like '%小%';
10、不走索引的情况有哪些,索引失效。(苏宁、饿了么)
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
2.对于多列索引,不是使用的第一部分(第一个),则不会使用索引
3.like查询是以%开头
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
11、动手写几个简单的sql语句(涉及到分组、排序、聚集函数等)
12、MySQL使用自增ID主键和UUID主键的比较?
(1)单实例或者单节点组:
经过500W、1000W的单机表测试,自增ID相对UUID来说,自增ID主键性能高于UUID,磁盘存储费用比UUID节省一半的钱。所以在单实例上或者单节点组上,使用自增ID作为首选主键。
(2)分布式架构场景:
20个节点组下的小型规模的分布式场景,为了快速实现部署,可以采用多花存储费用、牺牲部分性能而使用UUID主键快速部署;
20到200个节点组的中等规模的分布式场景,可以采用自增ID+步长的较快速方案。
200以上节点组的大数据下的分布式场景,可以借鉴类似twitter雪花算法构造的全局自增ID作为主键。
13、数据库连接池你们用的哪种,为什么采用该连接池?
开源数据连接池:dbcp、c3p0、proxool
商业中间件连接池:weblogic、websphere
14、查出表中有重复的id的记录,并计算相同id的数量
select id,count(id) from table group by id having(count(id)>1); //having 对多段函数进行筛选
六、介绍项目
1、你在项目中踩过的坑有哪些,举例说明。
2、你刚才介绍的项目里是用什么手段解决高并发?(网易)
3、你们数据库数据量是什么量级的?
4、你刚才介绍的这个项目部署在几台机器上?
5、你们的项目中如何记录错误日志?
6、你刚才的项目说到了反射,反射的优缺点你知道吗?
优点:反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。
缺点是性能问题:使用反射基本上是一种解释操作,影响代码的执行效率。用于字段和方法接入时要远慢于直接代码。因此Java反射机制只要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
使用反射会模糊程序内部逻辑:程序员希望在代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。
7、你们项目中的定时任务是怎么做的?(答:定时任务不是我做的)
8、你们的redis数据库占多大磁盘空间?
9、有没有解决过一些线上的bug?
10、如何实现一个账号不得同时登陆?
当用户在A端登录时,先生成一个状态值,和UserDB一起存入数据库,当用户在另B端登录时,先做一个判断,true or false,判断那个状态码,然后再进行操作;比如说,当状态码为true时可以让A端下线,或者让B端提示已登录;
七、其他方面
1、servlet的两种主要的跳转方式forward和redirect区别?
重定向(redirect)相当于直接在地址栏输入一个新的网址,这个网址自然会显示在地址栏上,当然是
可见的。
转发(forward)就是从其他页面跳转过来,跳转后显示在眼前页面的地址并不是当前页面的地址,而
是上一个页面的地址(或servlet处理上一个页面请求的地址),因此,当前页面的地址当然是不可见的。
2、画一画tcp三次握手,四次挥手示意图。
注:为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK(acknowledge)和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
3、计网里常见简写含义?
SMTP:简单邮件传输协议,应用层
ICMP:互联网控制消息协议,是TCP/IP协议族的一个子协议
TCP:传输控制协议
UDP:用户数据报协议
ARP:地址解析协议
FTP:文件传送协议
DNS:域名解析协议
HTTP:超文本传输协议