分布式&微服务&Spring知识大纲

1、对CAP、BASE的理解,项目中是怎么取舍的,常用中间件使用的是哪种组合方式

CAP:C 一致性 A 可用性 P 分区网络容错性(一般为必须) 另外2个2选1

对于需要确保强一致性的场景如银行一般会选择保证 CP

ETCD,强一致性,CP。ZooKeeper、HBase 就是 CP 架构,Cassandra、Eureka 就是 AP 架构,Nacos 不仅支持 CP 架构也支持 AP 架构

CAP理论详解

BASE:

 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性)

牺牲数据的一致性来满足系统的高可用性,系统中一部分数据不可用或者不一致时,仍需要保持系统整体“主要可用”

BASE 是 CAP 理论中 AP 方案的延伸(放弃一定强一致性),但是要达到最终一致性,三种方式:读时修复、写时修复(推荐,性能消耗比较低)、异步修复

BASE理论介绍


2、对2PC、3PC、TCC的理解

https://www.cnblogs.com/wudimanong/p/10340948.html

2PC:2阶段提交,请求阶段,提交阶段,事务发起者、协调者、事务参与者(有超时机制)

3PC:precommit,cancommit,docommit,事务发起者、协调者(有超时机制)、事务参与者(有超时机制)

TCC(Try-Confirm-Cancel)又称补偿事务。其核心思想是:"针对每个操作都要注册一个与其对应的确认和补偿(撤销操作)"。对应用的侵入性非常强,业务逻辑的每个分支都需要实现try、confirm、cancel三个操作

《分布式事务之如何基于RocketMQ的事务消息特性实现分布式系统的最终一致性?》 


3、Spring中Bean的生命周期和扩展点

详解


4、SpringBoot的启动流程

https://www.jianshu.com/p/bbb2cbe2c49a

https://www.cnblogs.com/javaguide/p/springboot-auto-config.html

@SpringBootApplication ==》@Configuration配置类,@ComponentScan类,包扫描,@EnableAutoConfiguration根据需求自动加载相关的bean


5、开放性问题

让你实现一个微服务框架,如何设计


6、动态代理是怎么实现的

详解

从 JVM 角度来说,动态代理是在运行时动态生成类字节码,并加载到 JVM 中的。

JDK 动态代理类使用步骤

1)定义一个接口及其实现类;

2)自定义 InvocationHandler 并重写invoke方法,在 invoke 方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑;

3)通过 Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) 方法创建代理对象;

注意:JDK 动态代理有一个最致命的问题是其只能代理实现了接口的类。为了解决这个问题,我们可以用 CGLIB 动态代理机制来避免。


7、Spring的Aop?切入点是什么?环绕通知是什么?

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib生成一个被代理对象的子类来作为代理

使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。


8、Spring IOC

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spring 特有。 IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

IoC源码阅读


9、spring框架用到了哪些设计模式?

详细介绍

工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。

代理设计模式 : Spring AOP 功能的实现。

单例设计模式 : Spring 中的 Bean 默认都是单例的。

模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。

适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。


10、SpringMVC处理一个请求的过程


11、Springcloud微服务间的调用,如何设计权限限制服务进行调用?


12、RPC和HTTP

Http协议:超文本传输协议,是一种应用层协议。规定了网络传输的请求格式、响应格式、资源定位和操作的方式等。基于TCP

RPC,即 Remote Procedure Call(远程过程调用),是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。

1)差异:

RPC并没有规定数据传输格式,这个格式可以任意指定,不同的RPC协议,数据格式不一定相同。

Http中还定义了资源定位的路径,RPC中并不需要

最重要的一点:RPC需要满足像调用本地服务一样调用远程服务,也就是对调用过程在API层面进行封装。Http协议没有这样的要求,因此请求、响应等细节需要我们自己去实现。

2)优点:RPC方式更加透明,对用户更方便;Http方式更灵活,没有规定API和语言,跨语言、跨平台

3)缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境。

4)对比:

速度来看,RPC要比http更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿

难度来看,RPC实现较为复杂,http相对比较简单

灵活性来看,http更胜一筹,因为它不关心实现细节,跨平台、跨语言。

5)不同的使用场景:

如果对效率要求更高,并且开发过程使用统一的技术栈,那么用RPC还是不错的。

如果需要更加灵活,跨语言、跨平台,显然http更合适

微服务,更加强调的是独立、自治、灵活。而RPC方式的限制较多,因此微服务框架中,一般都会采用基于Http的Rest风格服务。

RPC原理

RPC、IO多路复用、序列化&反序列化


13、Spring的事务是怎么实现的

底层是基于mysql的事务能力实现的


14、nginx原理

架构:多进程+异步非阻塞IO事件模型(epoll)

算法:

1)安装轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低,但缺点是:可靠性低和负载分配不均衡。

2)权重:指定轮询几率,weight和访问比例成正比,用于后端服务器性能不均的情况。

3)ip_hash:上面2种方式都有一个问题,就是下一个请求来的时候,请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用session保存数据),这个时候,就有一个很大的问题,比如把登录信息保存到了session中,那么跳转到另外一个服务器的时候就需要重新登录了,所以很多时候,我们只需要一个客户只访问一个服务器,那么就需要用到iphash。iphash的每个请求按访问ip的hash结果分配,这个每个访客访问一个后端服务器,可以解决session问题。

4)fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5)url_hash(第三方):按访问URL的hash结果进行分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用hash算法。


15、服务注册、服务发现

一般如何实现?


16、一致性hash

https://www.cnblogs.com/lpfuture/p/5796398.html


17、微服务之间的调用,连接数怎么限制?


18、zookeeper如何保证数据一致性

https://www.cnblogs.com/zz-ksw/p/12786067.html

两阶段提交+过半写机制


19、zookeeper节点类型

临时节点(ephemeral)、持久节点(persistent)、顺序节点(sequence)。节点类型在创建时确定,之后不可修改。

(1)临时节点在客户端会话结束后,zookeeper会将该临时节点删除,且临时节点不可有子节点。

(2)持久节点不依赖于客户端的会话,只有客户端明确要删除该持久节点,才会将其删除。

也可以说是四种:

(1)PERSISTENT-持久节点除非手动删除,否则节点一直存在于 Zookeeper 上

(2)EPHEMERAL-临时节点临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper 连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。

(3)PERSISTENT_SEQUENTIAL-持久顺序节点基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。

(4)EPHEMERAL_SEQUENTIAL-临时顺序节点基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。


20、Spring事务的传播

REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED

详解


21、zookeeper作为分布式锁

https://www.cnblogs.com/crazymakercircle/p/14504520.html

1)临时节点,所有等待节点监听锁节点--》一次释放锁的过程中要触发大量的watch,对集群造成冲击

2)临时顺序节点,只需监听上一个节点--》实现复杂(可用框架)

由于ZK本身的高可靠性、强一致性,ZK作为分布式锁性能不高,只适用于对可靠性要求高、并发量不是非常大的场景


22、注解的实现原理

https://zhuanlan.zhihu.com/p/387354943

元注解@Target,@Retention,@Documented,@Inherited 


23、服务注册挂了后,消费者和生产者的通信会怎么样

消费者和生产者有保存对方的信息,还是可以相互通信,但是如果有ip变更,则不能通信了


24、ZK选举算法

选举算法详解

每当新Leader产生时,会生成一个epoch标号(标识当前属于那个Leader的统治时期),这个epoch是递增的,followers如果确认了新的Leader存在,知道其epoch,就会拒绝epoch小于现任Leader epoch的所有请求。

投票信息包含 :所选举leader的Serverid,Zxid,SelectionEpoch

Epoch判断,自身logicEpoch与SelectionEpoch判断:大于、小于、等于。

优先检查ZXID。ZXID比较大的服务器优先作为Leader。

如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。

ZK中有三种选举算法,分别是LeaderElection,FastLeaderElection,AuthLeaderElection,FastLeaderElection和AuthLeaderElection是类似的选举算法,唯一区别是后者加入了认证信息, FastLeaderElection比LeaderElection更高效,后续的版本只保留FastLeaderElection。

你可能感兴趣的:(分布式&微服务&Spring知识大纲)