Spring-知识汇总

1. Spring

1.1 IOC容器

ioc(控制反转 inverse of control)是spring容器的核心,主要包含两个意思:控制,反转。就是某一接口实现类的选择控制权从调用类移除,转交给第三方决定。因为IOC难理解,所以后来Martin Fowler提出了DI(依赖注入 Dependency Injection)的概念以替代IOC,即让调用类对某一个接口实现类的依赖关系由第三方注入,以移除调用类对某一个接口实现类的依赖,实现解耦。

详细教程:https://jinnianshilongnian.iteye.com/category/206533?page=2

依赖注入,分为三种:

1. 构造函数注入

2. 属性注入

3. 接口注入

Bean生命周期:

通过getBean调用某一个Bean,共执行了以下操作来完成Bean的生命周期。

1. 调用 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法。

2. 构造函数实例化

3. 调用 InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation 方法。

4. 调用 InstantiationAwareBeanPostProcessor 的 postProcessPropertyValues 方法。

5. 设置属性值

6. 调用 BeanNameAware 的 setBeanName 方法。

7. 调用BeanFactoryAware 的 setBeanFactory 方法。

8. 调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法。

9. 调用 InitializingBean 的 afterPropertiesSet()方法

10. 通过 init-method 属性配置的初始化方法。

11. 调用BeanPostProcessor的postProcessAfterInitialization()方法

12. 如果是单例singleton 对象加入到IOC容器中,否则原生prototype对象将bean交给调用者。

13. 调用 DisposableBean 的 afterPropertiesSet 方法。

14. 调用 destroy-method 属性配置的销毁方法。

ApplicationContext 与 BeanFactory 区别:

。。。。

BeanFactory 与 FactoryBean的区别:

BeanFactory,以Factory 结尾,表示它是一个工厂类接口,用于管理Bean的工厂,在Spring的BeanFactory是ioc容器的核心接口,它的职责:实例化、定位、配置应用程序中的对象及建立这些对象之间的依赖。

FactoryBean,以Bean结尾,表示它是一个Bean,不同于其他Bean的是:它实现了FactoryBean接口的Bean,根据Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject返回的对象,而不是FactoryBean本身,如果需要获取FactoryBean对象,请在ID前面增加一个&来获取。

1.2 AOP编程

aop,面向切面编程,也就是把那些与业务无关,但是又被业务模块共同调用的逻辑或行为封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用场景:日志,权限,监控,事务,异常等,可防止恶意攻击(时间片控制调用次数),可防止sql注入。

SpringAop 通过pointcut(切点)指定在那些类的哪些方法植入横切逻辑,通过advice(增强)描述横切逻辑和方法的具体织入点(方法前,方法后,方法两端等)。此外,spring通过advisor(切面)将pointcut和advice两者组装起来。有了advisor的切面,spring就可以理用jdk或cglib(第三方生成库code generation library)的动态代理技术采用统一的方式为目标bean创建织入的代理对象了。

动态代理,jdk,cglib:

1. jdk动态代理是通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,核心是invocationHandler接口和proxy类

2. cglib是一个代码生成的类库,可以在运行时动态生成某一个类的子类(派生类),注意,cglib是通过集成的方式来实现动态代理,因此如果类被标记为final,那么它是无法使用cglib来实现动态代理的。

注意事项:

1. 如果目标对象实现了接口,默认情况下spring会采用jdk动态代理来实现aop,也可以强制使用cglib来实现。

2. 如果目标对象没有实现接口,必须采用cglib来实现动态代理,spring会在两种方式自动切换。

3. 不管哪种方式,都不能使用private和final来做修饰。

4. jdk动态代理要比cglib代理执行速度快,但性能不如cglib好。

具体例子:1. SpringAOP 动态代理实现的两种方式 - xu_shuyi - 博客园

1.2.1 启动原理

springmvc启动是从一个叫contextLoaderListener 开始的,它是一个servlet监听器,能够被web容器发现并加载,初始化contextLoaderListener之后,接着就是根据配置入contextConfigLocation和contextClass创建web容器了,如果你不指定contextClass参数值,则默认创建springweb容器类型为xmlWebApplicationContext,最后一步就是根据你配置的contextConfiglocation 文件路径去配置并刷新容器。

面试题(11)-- Spring MVC启动过程分析 - xu_shuyi - 博客园

1.2.2 请求原理

dispatcherServlet初始化做了两件事情,第一根据web容器,就是xmlwebapplicationcontext创建一个专门为dispatcherservlet服务的web容器;第二将你在web.xml文件中对dispatcherservlet进行相关配置加载到新容器中。

SpringMVC工作原理 - 平凡希 - 博客园

2. spring boot

2.1 自动配置原理

springBoot自动配置原理-阿里云开发者社区

2.2 组件工作原理

2.2.1 eureka

1. eureka server 注册中心服务端:

1. 服务注册

服务提供者启动时,会通过eureka client 向 eureka server 注册信息,eureka server 会存储该服务信息,eureka server 内部有两层缓存机制来维护整个注册表。

2. 提供注册表

服务消费者在调用服务时,如果eureka client 没有缓存注册表的话,会从 eureka server 获取最新的注册表。

3. 同步状态

eureka client 通过注册、心跳机制和eureka server 同步当前客户端的状态。

2. eureka client 注册中心客户端:

eureka client 是一个java 客户端,用于简化与eureka server的交互。eureka client 会拉取、更新和缓存eureka server 中的信息。

当所有的eureka server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。

1. register 服务注册

服务的提供者,将自身注册到注册中心,服务提供者也是一个eureka client。当eureka client 向 eureka server 注册时,它提供自身的元数据,比如:IP 地址、端口、运行状态指示 url、主页等。

2. renew 服务续约

eureka client 会每隔30秒 发送一次心跳来续约。通过续约来告知eureka server 该 eureka client 运行正常,没有出现问题。默认情况下,如果eureka server在90秒内没有收到eureka client 的续约,server 端会将实例从其注册表中删除,次时间可配置,一般情况不建议更改。

服务续约任务的调用间隔时间,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30

服务失效的时间,默认为90秒。
eureka.instance.lease-expiration-duration-in-seconds=90

3. eviction 服务驱逐

当eureka client 和 eureka server 不再有心跳,eureka server 会将该服务实例从服务注册表中删除。

4. cancel 服务下线

eureka client 在程序关闭时向eureka server 发送取消请求。发送请求后,该客户端实例信息将从 eureka server 的实例注册表中删除。该下线请求不会自动完成,它需要调用 DiscoveryManager.getInstance().shutdownCompent()方法。

5. getRegisty 获取注册表

eureka client 从服务器获取注册表信息,并将其缓存本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与eureka client 的缓存信息不同,eureka client 自动处理,默认情况下eureka client 使用压缩json 格式来获取注册列表信息。

# 启用服务消费者从注册中心拉取服务列表的功能
eureka.client.fetch-registry=true

# 设置服务消费者从注册中心拉取服务列表的间隔
eureka.client.registry-fetch-interval-seconds=30

6. remote call 远程调用

当eureka client 从注册中心获取到服务提供者信息后,就可以通过http请求调用对应服务;服务提供者有多个时,eureka client 客户端会通过ribbon自动进行负载均衡。

3. 自我保护机制

eureka server 在一定90s内没有接收到某个服务实例心跳,会注销该实例。但是在微服务架构下服务之间通常都是跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,网络分区故障,导致此实例被注销。

固定时间内大量实例被注销,可能会严重威胁整个微服务架构的可用性。为了解决整个问题,eureka开发了自我保护机制。

eureka server 在运行期间会去统计心跳失败比例在15分钟之内是否地域85%,如果低于,eureka server 即会进入自我保护机制。

eureka server 进入自我保护机制

1. eureka不再从注册列表中移除因为长时间没有收到心跳而应该过期的服务

2. eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点依然可用)

3. 当网络稳定时,eureka 会自动退出自我保护机制,当前实例新的注册会被同步到其他节点上。

4. 自我保护机制期内刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,即会调用失败。对于这个问题需要消费者端要有一细些容错机制,如:重试、断路器等。

4. eureka 集群原理

 1. 三台eureka server 就组建成了一个跨区域的高可用集群,只要三个地方的任意一个机房不出现问题,都不会影响整个架构的稳定性。

2. eureka server 集群相互之间通过replicate 来同步数据,彼此互相注册来提高可用性,相互之间不区分主节点和从节点,所有的节点都是平等的,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。

3. 如果某台eureka server 宕机,eureka client 的请求会自动切换到新的eureka server 节点。当宕机的服务器重新恢复后,eureka会再次将其纳入到服务器集群管理钟。当节点开始接受客户端请求时,所有的操作都会进行节点间复制。

4. eureka server 集群之间的状态时采用异步方式同步的,所有不保证节点间的状态一定是一致的,不过基本能保证状态是一致的。

eureka 分区

eureka 提供了region 和 zone 两个概念来进行区分,这两个概念均来自亚马逊的AWS

region

可以理解为地理上的不同区域

zone

可以理解为region内的具体机房

eureka 保证 AP
eureka server 各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而eureka client 在向某个eureka 注册时,如果发现连接失败,则会自动切换至 其他节点。

要有一台eureka server 还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)

5. eureka 工作流程

1. eureka server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过replicate 同步注册表,每个eureka server 都存在独立完整的u服务注册表信息。

2. eureka client 启动时根据配置的eureka server 地址去注册中心服务

3. eureka client 会每30s向eureka server 发送一次心跳请求,证明客户端服务正常。

4. 当eureka server 90s内没有收到eureka client 的心跳,注册中心则认为该节点失效,会注销该实例

5. 党委时间内eureka server 统计到有大量的eurekaclient 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。

6. 当eureka client 心跳请求恢复正常之后,eureka server 自动退出自我保护模式

7. eureka client 定时全量或增量从注册中心获取服务注册表,并且将获取的信息缓存到本地

8. 服务调用时,eureka client 会先从本地缓存寻找调取的服务,如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。

9. eureka client 获取到目标服务器信息,发起服务调用

10. eureka client 程序关闭时向 eureka server 发送取消请求,eureka server 将实例从注册表钟删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Xu321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值