springclound
eureka和nacos的区别
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;
Eureka采用AP方式
临时实例不会在 Nacos 服务端持久化存储,心跳不正常会被剔除,
非临时实例持久化被 Nacos 服务端,即使注册实例不在不会被剔除
Nacos支持服务端主动检测提供者状态:临时实例采用客户端向服务端发送心跳模式,非临时实例采用服务端主动检测客户端模式
Eureka采用客户端向服务端发送心跳模式
nacos做配置中心加注册中心
eureka做注册中心
自我保护方式不同
eureka 阈值是针对所有服务的
当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。
nacos 阈值是针对某个具体service
当域名健康实例 (Instance) 占总服务实例(Instance) 的比例小于阈值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。
Dubbo 与 Feign 的区别
1、协议
Dubbo:
支持多传输协议(Dubbo、Rmi、http、redis等等),
默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。
Feign:
基于Http传输协议,短连接,不适合高并发的访问。(例如我们用@openFeign注解来标识远程调用服务的接口时,需要加@RequestMapping)服务粒度是http接口级的
2、负载均衡
Dubbo:
支持4种算法(随机、轮询、活跃度、Hash一致性),而且算法里面引入权重的概念。
配置的形式不仅支持代码配置,还支持Dubbo控制台灵活动态配置。
负载均衡的算法可以精准到某个服务接口的某个方法。
Feign:
只支持N种策略:轮询、随机、ResponseTime加权。
负载均衡算法是服务级别的。
默认的负载均衡:轮询,对ip进行
Sentinel和Hystrix的区别
Hystrix熔断
Sentinel限流降级熔断
什么是Hystrix?它如何实现容错?
Hystrix是一个延迟和容错库, 停止级联故障并在复杂的分布式系统中实现弹性。用Hystrix在这种情况下的Fallback方法功能,消费者调用生产者,生产者抛出异常。定义一个Fallback方法。这种方法应该具有与生产者相同的返回类型。如果生产者出现异常, 则回退方法将返回一些值。
什么是Hystrix断路器?我们需要它吗?
断路器的目的是给第一页方法或第一页方法可能调用的其他方法留出时间,并导致异常恢复。可能发生的情况是,在负载较小的情况下,导致异常的问题有更好的恢复机会 。
Servlet的生命周期:
实例化,初始 init ,接收请求 service ,销毁 destroy ;
spring bean的生命周期
(1)实例化 Bean :(2)设置对象属性(依赖注入):(3)处理 Aware 接口:Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean(4) BeanPostProcessor :如果想对 Bean进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口(5) InitializingBean 与 init-method :如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。(6)如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Objectobj, String s) 方法;由于这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓存技术;(7) DisposableBean :当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的destroy()方法;(8) destroy-method :最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。
Spring对象的生命周期
- 对象创建
- 初始化数据
- 调用方法,完成功能
- 对象销毁
核心: 生命周期的方法都是自动调用!!!
Spring Aop 流程是怎样的?
① JDK 动态代理只提供接口的代理,不支持类的代理。核心 InvocationHandler 接口和 Proxy 类,InvocationHandler 通过 invoke() 方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy 利用 InvocationHandler 动态创建一个符合某一接口的的实例 , 生成目标类的代理对象。② 如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用 CGLIB 来动态代理目标类。CGLIB ( Code Generation Library ),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP 。 CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为final ,那么它是无法使用 CGLIB 做动态代理的。
Spring怎么解决循环依赖得
1.获取A时首先会尝试从一级缓存singletonObjects 中获取;
2.获取不到就再从二级缓存earlySingletonObjects中获取;
3.若是还没有则尝试从三级缓存singletonFactories获取;
4.还是没有获取到则再尝试创建A对象
5.会执行doGetBean->createBean->createBeanInstance并使用构造器实例化
6.在尝试给A进行初始化时,由于B不存在无法完成初始化,则将半成品A放入第二级缓存中,进入B的创建流程。
7.与先前过程相似,在第三级缓存中放入beanName和表达式sharedInstance,进入B的初始化过程
8.由于在第二级缓存中可以找到A,则B可以完成初始化,将成品Bean放入一级缓存中备用,删除三级缓存中的B
9.同时完成A的初始化,并删除二级缓存中的半成品A