以下面试题没有进行分类,但是是本人亲身面试总结得来的哟,大家参考下,给个三连,三克油!!!
一定要自己提前练习好,组织好语言,不要慌,有条理的说清楚,控制在一分钟左右等。可以提前自己在家练习一遍,然后录音自己听,慢慢调整。
这种问题,简直是送命题,就挑你复习的最好的部分去进行回答,集合、线程、框架啥的都可以
简述调用过程,Dubbo直连
服务注册标签:dubbo:service 服务消费标签:dubbo:reference
1.Java语言是 SUN公司 1995 年推出的一门高级编程语言,起初主要应用在小型消费电子产品上,后来随着互联网的兴起,Java语言迅速崛起,成为大型互联网项目的首选语言
2.Java是一种跨平台的语言,一次编写,到处运行,堪称“当今世界最重要、应用最广泛的编程语言”。
3.目前,Java的主要就业方向有三个Web开发、Android开发、客户端开发(桌面应用软件)等
4.Java分为不同的版本J2SE(主要开发桌面程序)、J2EE(主要开发Web系统)、J2ME(主要开发安卓APP)
jdk 最小开发环境,包含jre以及一些开发所必须的类库
jre 最小运行环境,包含jvm
jvm java虚拟机
1.编译器把 .java 源代码文件编译成 .class 字节码文件
2.Java类加载器将 .class 字节码文件加载到内存,在 JVM 中进行解释并生成可执行代码。
jvm内存结构分为堆、栈、方法区、本地方法栈、程序计数器等几个部分
在jvm1.7中堆内存中包含永久代、1.8中移除了永久代并新增了元空间,且元空间是不占用堆内存,而是直接占用物理机内存
学习jvm参考地址:https://www.processon.com/view/link/6059e6db5653bb2225e13f6a
编译和解释参考地址: https://www.cnblogs.com/kuangsao/p/13387537.html
压测工具JMeter
AOP(Aspect Oriented Programing)面向切面编程,是通过预编译方式或者是运行期期间动态代理实现功能扩展而不用修改源代码。通过AOP技术,实现一种通用的逻辑解耦,解决一些系统层面的问题,如日志,事务,权限等,从而实现高可用的可重用性和可维护性。
动态代理有两种实现方式,详情参考:https://blog.csdn.net/weixin_52851967/article/details/122433833
分页插件(PageHelper)、逆向工程插件(Generator)、MybatisX、MybatisLog
分表:垂直切分、横向切分
分库:一个模块对应一个库表(按模块划分)
分库分表工具:shardingjdbc、mycat
主要还是用于缓存:登录验证码、图形验证码、文件下载的token等
任务抢占中用到了分布式锁
String:缓存使用、计数器、商品编号、订单编号可以用INCR生成等
Hash(类似java中的Map>结构):早期购物车的实现、用户对象
List(类似java中的Queue):微信文章、订阅公众号等
Set:集合处理(交、并、补)、微信抽奖小程序
Zset:实现排行榜功能
BitMap:上班打卡、活动签到、统计活跃用户数
ThreadPoolTaskExecutor(Spring框架中的线程池),不推荐jdk中的那几个线程池,而是自定义线程池,因为这样子最大线程数和阻塞队列的长度才可控!
各个方面都可以说,往你熟悉的方面说,MySQL的锁、索引、数据结构、优化等
MYISAM:无事务、外键、行锁等,查询总数快、表文件有3个
INNODB::有事务、外键、行锁等、多个表共用一个表空间
EXPLAIN查看SQL语句的执行计划,着重查看type ,key rows等字段 type字段性能顺序:
system>constant>eq_ref>ref>range>index>all
适当的创建索引,调整SQL语句等
了解过一点,这个不太确定
以前弄问卷报告的时候用过一次,用于保存Excel插件生成的超长json字符串
雪花算法,通过zookeeper提供的数据中心id保证分布式不重复
选举机制:半数选举 监听机制:??
https://blog.csdn.net/xiewenfeng520/article/details/107013665/
线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。
在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对 Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停的检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式将只使用固定的线程就将所有任务的 run 方法串联起来。
提供者 注册中心 消费者 监控中心
提供者提供服务到注册中心,消费者监听注册中心,发现对应服务即进行消费
轮询
权重随机
最小活跃数:若存在多个最小相同活跃数的,则再随机(活跃数:可以理解为服务器正在处理请求的个数)
一致性Hash:根据请求参数的Hash来决定选择哪个服务,因此相同参数的请求总是发到同一个服务提供者
这里是引用
链接: https://blog.csdn.net/ChineseSoftware/article/details/122472459
超时分为服务端超时和客户端超时:
消费端超时:只需捕获超时异常然后进行回滚或其它操作
服务端超时:
①Dubbo 自身有重试机制,调用超时后会发起重试,Provider 端需考虑幂等性。
②使用补偿事务或异步 MQ 保持最终一致性(需要写一些与业务无关的代码来保持数据最终一致性。比如在 Provider 端加个 check 方法,检查是否成功,具体实现还需要结合自身的业务需求来处理。)
③基于时间回滚,在 Consumer 端调用时设置两个参数 ctime、ttime 分别表示调用时间、超时时间,将参数打包发给 Provider。Provider 收到两个参数后进行操作,如果执行时间越过 ttime 则回滚数据,否则正常执行。
前端拦截、使用token机制、通过代码控制
链接: https://blog.csdn.net/Javaesandyou/article/details/124097590
Redisson、Lua脚本
核心线程数
最大线程数
空闲线程存活时间
空闲线程存活时间单位
阻塞队列
线程创建工厂
拒绝策略:抛异常、退回调用者、丢弃、丢弃第一个
用过,通过自定义拦截器实现自动添加创建人、创建时间等公用字段
公平锁:
非公平锁:
悲观锁:
乐观锁:
可重入锁(递归锁):
自旋锁:
写锁(独占锁):
读锁(共享锁):
两者是不一样的东西,JVM内存模型就是我们平时熟悉的(栈、堆、本地方法栈、程序计数器、方法区等)
Java内存模型 是 JMM (Java Memory Model,简称 JMM),是定义了线程和主内存之间的抽象关系
参考地址: https://blog.csdn.net/weixin_43582499/article/details/123919792
分布式事务Seata中间件
有,模块间数据传输采用RabbitMQ
事务的四个特性:
原子性
一致性
永久性
隔离性
单列模式
普通工厂模式
策略模式
代理模式
模板模式
。。。
实现单列的写法有多种,但是常用线程安全的写法有3种
懒汉式、饿汉式、枚举参考链接: https://blog.csdn.net/lingerlan510/article/details/121943784
共有6种状态,每个状态解释如下: 初始化、运行、阻塞、等待、超时等待、终止
- sleep()方法是Thread的静态方法,而wait是Object实例方法
- 在同步块中sleep方法不会释放锁,而wait方法会释放锁
- wait能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
- sleep和wait使用时都必须捕获异常(网上有的说wait不用捕获,是错误的,不捕获则会出现编译错误)
参考链接: Sleep()和wait()方法的区别
1、this和super一样,都是对象内部的引用变量,只能出现在 对象内部;
2、this指向当前对象自己,super指向当前对象的父类型特征,故this的东西比super多,也就是super是this的一部分;
3、this()和super()都只能出现在构造方法的第一行,故this()和super()方法不能共存,当一个类的构造方法第一行中没有this(),也没有super(),系统默认有super()方法;
4、this()是构造方法中调用本类其他的构造方法,super()是当前对象构造方法中去调用自己父类的构造方法。
mvc是一种架构模式,主张将代码分为模型(Model)、视图(View)、控制器(Controller),SpringMvc则是这种架构的一种实现,这种架构的实现还有以前的struct2。而SpringBoot则是为了简化企业级应用的开发而出现的一种框架,两者有着本质的区别,因此无法去进行对比。
CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得,因为在分布式系统中P是必不可少的,因此只会存在AP和CP。
网关:目前一般采用SpringCloud GateWay,提供统一的路由方式、动态路由,鉴权、日志监控、流量控制等
注册中心:Nacos,存放和调度服务,实现服务和注册中心,服务和服务之间的相互通信
配置中心:Nacos,配置集中管理、在系统运行期间可动态配置、配置修改自动刷新
客户端负载均衡:Ribbon 进行客户端的负载均衡
服务降级: Spring Cloud Hystrix 避免在微服务架构中个别服务出现异常时引起的故障蔓延
链接: Spring Cloud全家桶主要组件及简要介绍
- 路径最短优先原则
- 路径长度相同则按pom文件中申明顺序优先
- 覆写优先(子pom内声明的优先于父pom中的依赖)
- 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现
- 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁
- 优缺点:
乐观锁-优点:轻量级锁,避免了线程切换的开销。
乐观锁-缺点:会有ABA问题、只能对单一变量加锁、自旋操作导致额外开销
悲观锁-优点:因为锁的是代码块,可以锁住多个变量。
悲观锁-缺点:重量级锁,加锁、释放锁操作会有开销,而且操作系统层面的上下文切换和线程调度也会引起很大的开销。- 参考链接: https://baijiahao.baidu.com/s?id=1740502410051177537&wfr=spider&for=pc
用于线程间进行数据隔离
最常见的ThreadLocal使用场景为用来解决数据库连接、Session管理等
链接: ThreadLocal作用、场景、原理
synchronized是java中的锁
volatile是java虚拟机提供的轻量级的同步机制,有三大特性:可见性,不保证原子性,禁止指令重排
链接: synchronized和volatile的区别
默认是可重复读
隔离级别总共包含:读未提交、读已提交、可重复读、串行化
主键索引、唯一索引、普通索引、全文索引、空间索引、前缀索引等等
链接: 微服务Dubbo和SpringCloud架构设计、优劣势比较
Feign就是一个Netflix公司开发的用于远程调用服务的框架/工具,让开发者可以更少耦合、更少代码、更加快,也更兼容的方法进行远程服务调用。
优点:
- feign采用的是基于接口的注解(操作简单)
- feign整合了ribbon,具有负载均衡的能力
- 整合了Hystrix,具有熔断的能力
- 服务熔断:服务熔断是指当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用(类似于我们家用的保险丝)。
- 服务降级:服务降级是指当我们系统核心功能服务出现压力过载时,我们暂时舍弃非核心业务服务(返回个友好的提示),以减轻服务器压力来保证我们的核心功能可以正常运行。
seata
链接: 什么时候使用接口,什么时候使用抽象类