银盛⽀付java岗社招面经
银盛⽀付
1. 说说springcloud的⼯作原理
springcloud由以下⼏个核⼼组件构成:
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉
取注册表,从⽽知道其他服务在哪⾥
Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从⼀个服务的多台机器中选择⼀台
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
Hystrix:发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩
的问题
Zuul:如果前端、移动端要调⽤后端系统,统⼀从Zuul⽹关进⼊,由Zuul⽹关转发请求给对应的服务
2. ⽤什么组件发请求
在Spring Cloud中使⽤Feign, 我们可以做到使⽤HTTP请求远程服务时能与调⽤本地⽅法⼀样的编码体验,开发者完全感知不到
这是远程⽅法,更感知不到这是个HTTP请求。
3. 注册中⼼⼼跳是⼏秒
1、Eureka的客户端默认每隔30s会向eureka服务端更新实例,注册中⼼也会定时进⾏检查,发现某个实例默认90s内没有再收到
⼼跳,会注销此实例,这些时间间隔是可配置的。
2、不过注册中⼼还有⼀个保护模式(服务端在短时间内丢失过多客户端的时候,就会进⼊保护模式),在这个保护模式下,他
会认为是⽹络问题,不会注销任何过期的实例。
4. 消费者是如何发现服务提供者的a.当⼀个服务实例启动,会将它的ip地址等信息注册到eureka;
b.当a服务调⽤b服务,a服务会通过Ribbon检查本地是否有b服务实例信息的缓存;
c. Ribbon会定期从eureka刷新本地缓存。
5. 多个消费者调⽤同⼀接⼝,eruka默认的分配⽅式是什么
6. 说说常⽤的springboot注解,及其实现?
7. spring的事务注解是什么?什么情况下事物才会回滚
8. 说说spring事物的传播性和隔离级别
9. mysql的引擎有什么?他们的区别
10. innodb如何实现mysql的事务
事务进⾏过程中,每次sql语句执⾏,都会记录undo log和redo log,然后更新数据形成脏⻚,然后redo log按照时间或
者空间等条件进⾏落盘,undo log和脏⻚按照checkpoint进⾏落盘,落盘后相应的redo log就可以删除了。此时,事务还未
COMMIT,如果发⽣崩溃,则⾸先检查checkpoint记录,使⽤相应的redo log进⾏数据和undo log的恢复,然后查看undo log的
状态发现事务尚未提交,然后就使⽤undo log进⾏事务回滚。事务执⾏COMMIT操作时,会将本事务相关的所有redo log都进⾏
落盘,只有所有redo log落盘成功,才算COMMIT成功。然后内存中的数据脏⻚继续按照checkpoint进⾏落盘。如果此时发⽣了
崩溃,则只使⽤redo log恢复数据。
11. mysql索引谈⼀谈
12. 说说b+树的原理
a. B-tree:B-tree利⽤了磁盘块的特性进⾏构建的树。每个磁盘块⼀个节点,每个节点包含了很关键字。把树的节点关键字增多后树的层级
⽐原来的⼆叉树少了,减少数据查找的次数和复杂度。
B-tree巧妙利⽤了磁盘预读原理,将⼀个节点的⼤⼩设为等于⼀个⻚(每⻚为4K),这样每个节点只需要⼀次I/O就可以完全载
⼊。
B-tree的数据可以存在任何节点中。
1. B+tree:
B+tree是 B-tree的变种,B+tree数据只存储在叶⼦节点中。这样在B树的基础上每个节点存储的关键字数更多,树的层级更少
所以查询数据更快,所有指关键字指针都存在叶⼦节点,所以每次查找的次数都相同所以查询速度更稳定;
13. 让你设计⼀个索引,你会怎么设计
a. mysql默认存储引擎innodb只显式⽀持B树索引,对于频繁访问的表,innodb会透明建⽴⾃适应hash索引,即在B树索引基础
上建⽴hash索引,可以显著提⾼查找效率,对于客户端是透明的,不可控制的,隐式的。
14. 还问了git和svn的区别
1、Git是分布式的,⽽Svn不是;
2、GIT把内容按元数据⽅式存储,⽽SVN是按⽂件
3、分⽀不同:git分⽀切换很⽅便;svn分⽀就是版本库的另外⼀个⽬录;
4、GIT没有⼀个全局的版本号,⽽svn有,SVN的版本号实际是任何⼀个相应时间的源代码快照。
5、GIT的内容完整性要优于SVN(GIT的内容存储使⽤的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和⽹络问题
时降低对版本库的破坏。)
15. git命令的⼀些底层原理以及流程
https://www.jianshu.com/p/2b47a3078a46
a. git init:使⽤git init初始化⼀个新的⽬录时,会⽣成⼀个.git的⽬录,该⽬录即为本地仓库。⼀个新初始化的本地仓库是这样
的:
1 !"" HEAD
2 !"" branches
3 !"" config
4 !"" description
5 !"" hooks
6 !"" objects
7 # !"" info
8 # $"" pack9 $"" refs
10 !"" heads
11 $"" tags
description⽤于GitWeb程序
config配置特定于该仓库的设置(还记得git config的三个配置级别么)
hooks放置客户端或服务端的hook脚本
HEAD传说中的HEAD指针,指明当前处于哪个分⽀
objectsGit对象存储⽬录
refsGit引⽤存储⽬录
branches放置分⽀引⽤的⽬录
其中description、config和hooks这些不在讨论中,后⽂会直接忽略。
b. git add:Git commit之前先要通过git add添加⽂件:
可以看到,多了⼀个index⽂件。并且在objects⽬录下多了⼀个9f的⽬录,其中多了⼀个
4d96d5b00d98959ea9960f069585ce42b1349a⽂件。
其实9f4d96d5b00d98959ea9960f069585ce42b1349a就是⼀个Git
#银盛支付##面经##社招##java工程师#