-
你怎么理解分布式的?
- 将系统中独立的业务服务,分拆到不同的机器上,可以独立的部署,独立的运维。
-
SpringCloud主要有哪些组件及其作用?(5大组件)
- Eureka注册中心,服务有很多个,可能随时会增加,就需要有一个注册中心,将多个服务的实例的信息保存,让服务之间查找通过注册中心去找,并且每个服务和注册中心有一个心跳连接,一定时间如果没有受到心跳,则任务服务不可用,在下一次服务查找(从来没调用过),就会剔除掉这个服务。但如果之前调用过,也还是有信息缓存,还是能调用通的。
- Ribbon和Feign,它们主要是负责负载均衡调用,当从注册中心拿到服务列表,服务的实例可能有3、5个,这时候就要按照负载均衡策略确定调用哪个服务。
- hystrix,当我们调用服务的时候,服务有可能挂掉了,为了服务的健壮性,要用到另外一个组件叫hystrix,它主要是做服务的熔断、降级以及限流的。
- SpringCloud Config,主要是负责总多服务的一些配置管理,是一个统一的配置中心。
- 网关zuul,服务有多个地址,前端配置那么多地址是不合理的,一般我们会统一地址,给前端调用。除了统一调用,还有统一鉴权,以及多服务的反向代理。
-
Zuul的权限怎么设计
- Rbac,实体涉及用户、角色、权限,用户和角色是多对多,角色和权限也是多对多。
-
项目做权限管理,用的什么框架
- 单体应用用的是shiro,微服务项目用spring security。
-
资源的url,有做一些资源限制吗?
- 单例应用,先登录,再判断登录用户是否有权限给你去访问这个资源。
- 微服务项目,用jwt来做,登录后返回token,并且将权限数据、用户信息保存起来,下次再访问,携带token,进行比对,直接去缓存的信息中找,就不需要去数据库中查找。
-
分布式项目的分布式事务,你们怎么处理的?
- 使用的事seat中的二阶段提交的方案,但效率会比较低。所以设计时尽量不要让它跨服务器事务,真的要跨的时候,才使用二阶段提交方案。
- Tcc方案,缺点是要将事务的处理耦合到业务逻辑当中,会侵入我们的业务代码中,虽然效率比seat的二阶段提交高一点。
-
分布式事务,还有哪些基于tcc方案的吗
- tcc
- 两段式提交
- 最大努力通知
- 最终消息可靠
-
负载均衡算法有哪些?
-
Eureka的底层有了解过吗
-
Eureka挂了话,怎么办?
-
说一下,你对Spring的了解
-
Jdk的动态代理和cglib的动态代理有什么区别吗?
- Jdk需要接口,cglib不需要,但要求类不能是final,并且代理方法也不能是final
-
jdk动态代理和cglib的动态,哪个性能比较好?
-
Aspectj,你有听说过吗?
-
Spring是如何为我们创建对象的?
- 通过配置文件,或者注解标识,获取要创建的对象的全限定类名,通过反射创建对象
-
Spring容器创建的对象,它的作用域有哪些?
- Singleton单例、prototype多例、request、session
-
Spring容器中,默认对象是单例的,可能会产生线程安全问题,Spring是怎么解决的?
- 用ThreadLocal来解决,变量的线程隔离
-
ThreadLocal底层是怎么实现的?
- 内部有一个ThreadLocalMap,类似于Map的功能,key-value键值对的方式存储
-
Spring怎么去解决循环依赖的问题?
- 三级缓存
-
ORM框架,用得最多是哪个?
- MyBatis
-
MyBatis的动态sql是怎么去写?
- 四大标签select、insert、update、delete。子标签有if、where。
- 用#{}获取参数,拼接到sql的查询参数中。还有一种是${}来获取
- Sql标签可以提取公共的查询字段,再用includ标签引入
-
MyBatis中,#符和$符有什么区别?
-
#
符是预编译,能预防SQL注入,$符是字符串拼接,会SQL注入风险。
-
-
MyBatis中,Mapper和XML中的方法怎么对应起来的?
- 类的命名空间+方法名,组成id来做唯一
-
MyBatis的XML中,常用的标签有哪些?
- select、insert、update、delete、resultMap、一对多(collection)、多对多、if、where、choose、foreach
-
嵌套查询和嵌套结果有什么区别?
- 嵌套查询,相当于联查,只发送一次sql,嵌套结果可以做懒加载,是多次发送sql的结果
-
MyBatis怎么在插入后,获取插入的记录的id
- useGenerateKeys属性设置为ture,或者使用selectKey标签
-
HashMap的底层是怎样的?
- 1.7使用数组+链表,1.8使用数组+链表+红黑树。插值时会对key做一个取余来做hash运算来存储到数组中,当发现hash到的值已经有存值后,发生hash冲突,就会用链表保存起来,1.8版本对链表做了优化,当链表长度达到7时,会将链表转换为红黑树。
-
HashMap的扩容,加载因子是多少?初始容量是多少?为什么扩容是2的幂次
- 加载因子为0.75,初始容量为16,2的幂次,用位运算代替取余
-
Cookie和Session的区别
- 他们都是会话跟踪技术,Cookie是保存在客户端的,而Session保存在服务端,而Session还是依赖于Cookie的,Session的ID是保存在Cookie中的。
-
如果浏览器将Cookie禁用了以后,Session还能用吗?
- 可以url传参的方式,将SessionID进行传输
-
数据库的隔离级别,默认是什么?
- read_uncommitted读未提交、read_committed读已提交、repeatable_red可重复读、serializable串行化
-
什么是脏读,什么是幻读,什么是不可重复读?
- 脏读:一个事务读取到了另外一个事务还未提交的数据。
- 幻读:
- 不可重复读:
-
哪些隔离级别会产生脏读、幻读、不可重复读
- read_uncommitted读未提交会产生,幻读除了serializable串行化其他都会产生。
-
Sql的执行过程是怎样的?
- from -> where -> group by -> having -> select -> order by -> limit
-
数据库死锁有出现过吗?
-
做过数据库的优化吗?
- 反范式,冗余字段,避免联查来提高查询效率
- 查询不要写select *
- 添加索引
- 分库分表
- 水平分表(一个表的数据过多,分拆到好几张表,分表后,要找到,需要一些算法去确定)和垂直分表(将一些不经常查的字段分到别的表)
- 读写分离
- 缓存
-
分表的策略有哪些?
- 区间(范围),id从1到1万的一张表,1万到2万的放下一张表,以此类推
- 时间,今年的都放一张表,或者按月分,一个月一张表。
- Hash算法,通过一个标识,算出一个表名
-
分表后,查询到某个范围,跨表了,怎么去查询
- 通过标识查询出在哪些表中有,分别查询出来,用sql的union语句将表数据合并起来,再将合并结果返回出去。
-
union和unionall有什么区别?
- union有去重,而unionall不去重。
-
索引,你有了解过它的底层吗?
- 案例,查第十万条数据,没有索引,会从头到尾去全表扫描,效率是很低的,定义一个索引结构,从索引结构中去查,查到标识后,直接就定位过去。
- MySQL生成索引用的是b+tree。树的深度不会太深。
-
B+tree相对于二叉树有什么区别?
-
数据库的存储引擎,myisam和innodb,在索引上有什么区别?
- myisam是不支持事务的,所以读操作比较多。
- Innodb是支持事务的。
- Innodb的数据时和索引放一起的,而myisam的数据和索引是分开的。锁粒度,一个myisam是表级,innodb是行级。
-
项目中,有遇到锁表的情况吗?
-
具体的数据库优化方式有哪些?
- Explain看sql查询速度,全文检索优化
-
MySQL支持的索引类型
- 普通索引、唯一索引、主键索引
-
索引的底层结构是怎样的?
- 底层是B+Tree,和红黑树有什么区别?红黑树是平衡二叉树,B+Tree是多叉查找树,数据量大时,红黑树的树会变高,而B+Tree在千万级量级时,还是只有3层
-
听说过聚集索引和非聚集索引吗?
- 聚集索引:索引和数据存储在一起。非聚集:索引+内存地址,内存地址指向数据
-
平时怎么用redis?怎么保证缓存和数据库的双写数据一致性
- 先删redis缓存,再更新数据库,下次再访问时,从数据库中查,再放到redis缓存
- 按业务来使用不同的方案,没有十全十美的方案,只有最适合的方案。
-
你还了解redis的其他什么东西?
- Redis是单线程+多路io复用,存储在内存中,比操作数据库要快,存储类型有string、list、hashset、sortset。数据淘汰策略,例如lru算法,淘汰掉最近最少使用,淘汰最少使用的缓存。持久化操作有rdb和aof,rdb是每隔一段时间进行一次持久化,而aof是没操作命令一次,就持久化一次。
-
除了用redis来做缓存,还用它做过什么东西吗?
- 保存登录信息,30分钟后过期,就用到redis的自动过期的功能。
- 队列,有一个list,从一头进,另外一边出,就可以用来做队列,保证一致性、削峰等
-
Redis用来做过分布式锁吗?
- 用redis的redisson(操作redis的一个框架)。用redis的setnx命令的话,会将你设置的值和过期时间的操作,变成一个原子性操作。但有可能他还没操作完,导致锁已经释放了,这时候就会出现问题。
-
Zookeeper怎么实现分布式锁?
- Zookeeper有一个叫动态节点的东西,当有人访问的时候,对这个标识新增一个节点,代表已经有人来操作了,后来的人访问时,先看标识是否有节点,有的话,就等待。直到别人操作完了,将这个节点删掉了。再进行查,进行判断和操作。(多个人去访问的时候,都会在Zookeeper上产生节点,基于它的选举机制,谁先拿到那个数字比较大,或者比较小,就用那个锁)
-
要实现缓存,用redis实现缓存,和其他方式实现缓存有什么区别?
- 如果使用map,或者MyBatis的二级缓存,都是再JVM上实现的,多个服务之间是不能共享的,而使用redis是一个公共的地方,不依赖于JVM。(本地缓存和分布式缓存的区别)
-
分布式锁的原理是什么?
- 多个服务,多个进程,去访问公共的一个数据,例如2个人去商城买商品,查询的时候都查到有库存,有5个,2个人都想要买3个,但到买的时候,第一个人买了3个,只剩下2了,另外一个去买,就发现库存不足了。解决方案是,在进行查的时候,就加上锁,另外一个去查的时候就不能查,只有当第一个人操作完,第二个人才能进行查。由于他们是2个进程,我们就要提供一些公共的东西来作为锁,可以使用数据库、redis、zookeeper等,在公共的东西打标记,就可以让第二个去查之前,先去看标记,发现被锁了,就等待。
-
Redis的rdb和aof,这2种之持久化策略的区别吗?
-
平时项目中,rdb和aof用哪种?
- 2种都用,rdb间隔一段时间才备份,如果在备份区间内宕机,数据就会损失一部分。
-
什么是Restful风格
- 请求的uri对应着一种资源,请求的方法对应着资源的操作。Restful风格的接口,名称结尾都是避免用动词,具体的动作,通过http请求方式来表达。
-
接口幂等性
-
Linux如何动态去查看Tomcat一些日志
- 用tail -f命令,查看catalina.out日志文件,tail -f catalina.out,还有一个-n参数,表示查看末尾的多少行,例如tail -n 100 catalina.out,表示查询日志文件末尾100行的内容
-
Linux用哪个命令去查询服务的进程号
- ps -ef | grep 服务名
-
Linux怎么去杀掉进程?
- kill -9 进程pid,-9表示强制删除
-
Linux怎么全局查找文件
- find -name ‘名称’
-
线程和进程的关系是怎样的?
- 线程依赖于进程
- 进程是程序资源的基本的分配单位,线程是程序资源的基本调入单位。
-
线程有哪些状态?
- 1)初始状态,新创建一个线程对象,但没有调用start()方法
- 2)就绪
- 3)运行
- 4)阻塞
- 5)销毁
-
线程常用方法有哪些?
- 1)start(),开启
- 2)getThreadName(),获取线程名称
- 3)getThreadStatus(),获取线程状态
- 4)interrupt(),中断
- 5)yield(),线程让步
-
notify和notifyAll有什么区别?
-
什么是线程安全?
- 多线程环境下,对一个公共资源进行写操作就会出现安全问题,可能会出现数据不一致等问题。
-
怎么解决线程安全问题?
- 使用synchronize关键字进行加锁,可以用于代码块上、方法上、静态方法上
-
synchronize的锁膨胀过程(升级过程)是怎样的?
-
Java中的反射,可不可以获取到类中的私有变量或者私有方法
- 1)先调用setAccess(true),设置允许访问
- 2)再调用getDeclaredFields
-
要创建一个自定义注解要怎么去创建?
- 1)创建类型为@interface的类
- 2)加上@Target注解,标识能作用于哪里,方法、变量、形参等
- 3)加上@Retention注解,标识注解信息保留到什么阶段,运行期、编译期、Class等
- 4)@Documented,是否被JavaDoc处理
- 5)@Inherited,标识注解是否被自动继承,当查询注解时,目标类上如果没有查询到指定注解,那么会继续查找目标类的父类上是否有指定注解
-
多态是怎么一回事?
- 多态是Java的一种机制,首先要有类之间的继承或者实现关系,其次父类的引用指向子类对象,当子类有复写父类的方法时,调用对象的父类方法,会调用子类复写的方法。
-
封装又是怎样的?
- 提取公共父类,子类做特殊行为
- 属性私有化,对外提供get、set方法
-
HashSet怎么做到存储元素去重的?
- 通过调用类的hashCode和equals方法来决定类是否重复
-
TreeSet怎么做到存储元素排序和去重的?
- 调用类comparable或者提供comparator比较器对象
-
ArrayList和LinkedList有什么区别?
- ArrayList是数组实现的,LinkedList是用链表实现的
- ArrayList适用于查询多的场景,他提供数组的索引提供查找,并且元素的地址是顺序的,所以查找速度比较快。但增删改会比较慢,每次改动都要复制数组移位
- LinkedList适用于增删改多的场景,链表的增删改直接改节点的前、后即可
-
RandomAccess接口有什么作用?
- 是一个标识性接口,ArrayList能够支持下标,快速访问获取
-
序列化和反序列化有什么用?
- 可以将对象持久化,持久化到磁盘中,或者网络上对象传输
网友评论