自己总结Spring全家桶面试题(3)

Spring全家桶

一,spring

1,什莫是spring框架,使⽤有什么好处 ,谈谈你对Spring的理解

Spring是一个轻量级的java开发框架。简化了企业应用开发。Spring的出现是为了解耦合,由工厂模式和xml文件演化诞生的,使用对象我们只要调用工厂就行了,修改被调对象时只需要修改xml配置文件。Spring的核心是控制反转(IOC)和面向切面(AOP)。

3, spring 特性ioc,di是什么,实现原理是什么

IOC就是控制反转,以前使用的资源都需要自己new出来,而在Spring中所有的资源在创建时候,全部放到Spring的IOC容器中。当你需要用的时候,Spring把对应的资源给你就行了。

DI其实和IOC是一回事,IOC是站在Spring的角度来看,将资源交给spring进行控制,DI是站在应用程序的角度来看,应用程序要使用资源Spring就相应的资源给应用程序。

4, spring常⽤的注解

@Component, @Controller ,@Service , @Repository,

@Bean(用于加载第三方资源的)

@Value (用于注入非引用类型,也可以读取配置文件${} )

@PropertySource(用于加载配置文件)

@Autowired (自动注入引用类型,自动装配按照类型加载,如果类型一样按变量名匹配)

@PropertySource(value = "classpath:filename.properties")
public class ClassName {
    @Value("${propertiesAttributeName}")
    private String attributeName;
}

@Primary 提高bean优先级(如果两个bean的类型和名称都相同)

@Cofiguration (使用注解代替spring的配置文件) @ComponentScan(“scanPackageName”)

@Improt (导入第三方bean作为Spring的控制资源,弄一个配置类,配置类可以进行导入

5, @Autowird和@qualifier,@resourse区别

@Autowired和@qualifier(考雷fai耳)(“userDao”) 按照bean的id名称进行注入

上面两个是Spring中的提出的东西,@resourse是java提出的,模仿Spring的,功能和这两个一样

6, spring bean⽣命周期,⾃定⽣命周期⾏为 ***不好搞

Spring启动,查找并加载需要被Spring管理的bean,进行bean的实例化,

bean准备就绪,被应用程序使用,bean会一直驻留在应用上下文(容器)中,直到上下文被销毁。

如果bean标签中定义了w方法,该方法会在bean的创建时被执行。

如果bean标签中定义了destroy-method方法,容器销毁会调用destroy-method方法。

Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建、何时被初始化完成、容器何时准备销毁该Bean实例。
对于prototype作用域的Bean,Spring容器仅仅负责创建,当容器创建Bean实例之后,Bean实例完全交给客户端代码管理,容器不再跟踪其生命周期。每次客户端请求prototype作用域的Bean时,Spring都会产生一个实例交给客户端程序,就不再过问了。之后等待GC进行垃圾回收。
对于singleton作用域的Bean,每次客户端代码请求时都返回同一个共享实例,客户端代码不能控制Bean的销毁,Spring容器负责跟踪Bean实例的产生、销毁。Spring容器可以在创建Bean之后,进行某些通用资源申请;还可以在销毁Bean实例之前,先回收某些资源,比如数据库连接。

自己总结Spring全家桶面试题(3)_第1张图片

Bean的生命周期:

如果我在程序中要生成一个Bean,并且注册到 ioc 容器中。

1, spring 拿到这个类,先从类中抽取出 一些属性和者方法,组成每个类的 beanDefinitionMap (bean 定义)

(bean定义中有,beanClass (bean是属于什么类的) , Scope(singleton,prototype (pro per type)) lazyInit )类定义描述了类中的所有信息。,由DefinitionListableBeanFactory (Bean工厂统一管理)。

2,然后下一步是Bean工厂后处理器,(可以对类定义进行修改 )

3,然后开始实例化 ,推断构造方法,使用合理的构造方法。

4,然后使用DB 工厂生成Object对象

5,执行bean的后置处理器 (在bean实例化对象之后做的事情,initiailzingBean 给bean的某些方法赋值,或者给bean的某些属性赋值 )

6,把bean放入singletonObjects (bean的一级缓存 ,单例池)

SpringBean的生命周期

如何理解spring的循环依赖:首先spring FrameWork的体系中,我们的Bean ,是由beanDefinition来创建的,beanDefinition可以理解位spring bean的一个建模。Bean的生命周期,首先我们的Spring容器启动扫描,把类变成beanDefinition存到beanDefinitionMap 中,进行遍历对beanDefinition进行验证,是否单例,是否懒加载。spring在实例化之前回去singletonObjects看有没有这个bean,没有就进行创建,bean的创建分为3步:

1.调用构造方法创建对象实例(这一步完成之后其它对象实例就可以引用它)

2.填充实例内部属性(会依次从三级缓存中获取依赖的bean,如果没有找到,则会先去创建依赖的bean,之后再返回继续填充属性)

3.执行initializeBean方法进行初始化

(当bean进行创建时,会先调用getbean方法->执行doGetBean方法,在doGetBean方法中会调用getSingleton方法,这一步就是从三级缓存中获取对象缓存,因为是刚开始创建bean所以缓存中肯定没有,之后会调用createBean方法,在createBean方法中会调用doCreateBean执行bean的创建过程就是上面的那三步,当bean创建成功之后会将其放入一级缓存之中,此时会将它从三级和二级缓存中删除。其中我们可以看到当第一步执行完毕后会将刚刚创建的实例放入singletonFactories(第三级缓存)中,那么我们下面了解下到底什么是spring的三级缓存。处于最上层的缓存是singletonObjects,它其中存储的对象是完全创建好,可以正常使用的bean,二级缓存叫做earlySingletonObjects,它其中存储的bean是仅执行了第一步通过构造方法实例化,并没有填充属性和初始化,第三级缓存singletonFactories存储的是对应bean的一个工场。

7,spring中的循环注⼊是什么意思,怎么解决 ?

循环依赖就是X中注入了Y , Y中注入了X, 其中有个ObjectFactory

Y进行加载的时候,会得到Y的beanDefinition,然后看Y对应的ObjectFactory 有没有提前暴露,没有就提前暴露,到Y进行属性填充式,发现X没有在spring的容器中,就开始X的生命周期,就开始X的初始化,然后进行到属性填充时,发现X中有Y,然后发现Y的ObjectFactory 中暴露出来了。然后用ObjectFactory 生产出Y。

8, spring注解扫描原理

Spring中存在一个专门用于包扫描的类 ClassPathBeanDefinitionScanner, 它有一个doScan()方法,去扫描指定的包;然后获取这个类的Class对象。通过放射获取到类的注解信息。判断是否是Spring的注解。如果是完成加载。

9, spring核⼼模块有哪些

七大核心模块

(1)核心容器(Spring Core)在实际开发中所要用到的组件,都通过IOC控制反转的方式,交给Spring 的容器进行管理。

(2)应用上下文(Spring Context)Spring的上下文是一个配置文件。向Spring框架提供上下文信息。

(3) Spring DAO模块 Spring的Dao 对JDBC进行封装。隐藏了JDBC的API ,更好的对数据库进行操作。可以是Mybatis

(4)spring 的 AOP

(5)spring 的 ORM 对象关系映射。使的数据库的表和java中的类一一对应。不用去手动进行封装了。

(6)Spring Web模块 Web模块建立在应用程序上下文模块之上,给Web模块提供上下文。Web层使用的框架可以是Spring的MVC 也可以是Struts(死chua si)。

(7) Spring MVC 是基于mvc模式的 轻量级web框架·

13, spring 框架中都⽤到了哪些设计模式

设计模式:

ioc的装饰者模式,动态代理

spring bean的单例模式

工厂模式

14, spring BeanFactory和FactoryBean区别

FactoryBean是bean标签的一个属性。作用是将工厂创建出来的对象,作为Spring的bean进行管理使用。

BeanFactory是Spring源码中一个工厂类,是一个接口,用于管理和生产bean,其实例有 DefaultListableBeanFactory、ApplicationContext等,如今用ApplicationContext创建bean。比起BeanFactory,BeanFactory创建bean,采用延迟加载,使用才创建,ApplicationContext创建bean才用容器创建时,及创建。

7, 什么是aop,aop实现原理

aop是面向切面编程,弥补oop(面向对象编程)的不足,基于oop横向发展。在运行期间通过动态代理的方式,向目标类注入增强代码。在不修改源码的情况下,对程序进行增强。

8,切⼊点、通知、植⼊点、切⾯是什么

连接点:接口或者实现类中的方法。

切入点:不是每个方法中都能挖掉共性功能的,能被挖掉共性功能的方法称为切入点。

通知:被挖掉的共性功能。

切面:告诉spring通知和切入点之间的关系。

通知类型:通知是位于前面的,还是位于后面的。

织入:就是将挖掉的功能回填的动态过程

目标对象:就是挖掉功能的方法对应的类产生的对象,这种对象是无法直接完成最终工作的

在项目中aop的使用好像就是全局异常处理器。日志记录。

9,代理⽅式有⼏种,怎么配置,实现原理是什么

静态代理:装饰者模式,和被装饰者对象实现相同的接口,写个构造方法,将被代理对象传进来,然后不进行装饰的方法,使用原来的对象中的方法就行。

JDK提供的Proxy动态代理:(1)将要增强的对象作为参数传入,(2)Poxy.newPoxyInstance(cl,classes,ih)三个参数,类加载器,所有接口,invocationHandler(监听被代理对象中的所有方法的调用)

CGLIB动态代理: 是一套动态字节码,AOP默认用的是jdk的proxy,可以在配置文件中指定为CGLIB

JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的,但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。

使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架(Java字节码操控框架),使用字节码技术生成代理类,比使用Java反射效率要高

10,spring的事务传播机制有那些?

为什么会有传播机制呢?

spring 对事务的控制,是使用 aop 切面实现的,我们不用关心事务的开始,提交 ,回滚,只需要在方法上加 @Transactional 注解,这时候就有问题了。

场景一: serviceA 方法调用了 serviceB 方法,但两个方法都有事务,这个时候如果 serviceB 方法异常,是让 serviceB 方法提交,还是两个一起回滚。
场景二:serviceA 方法调用了 serviceB 方法,但是只有 serviceA 方法加了事务,是否把 serviceB 也加入 serviceA 的事务,如果 serviceB 异常,是否回滚 serviceA 。
场景三:serviceA 方法调用了 serviceB 方法,两者都有事务,serviceB 已经正常执行完,但 serviceA 异常,是否需要回滚 serviceB 的数据。

事务的传播行为描述的是事务协调员对事务管理员所携带事务的处理态度。

事务的传播行为有七种:

(1)required 协调员看管理员有事务就加入,如果没事务就自己新建一个事务

(2)required new 管理员有事务,协调员也会新建一个事务

(3)supports 管理员有事务,协调员就加入。如果没有也不进行创建。

(4)not_supports (不支持事务) 管理员有事务,协调员也不开启事务

(5)mandatory (买 de chui )要求管理员必须携带事务,如果不带事务就报错

(6)never 要求管理员不能代事务,如果管理员代了事务就会报错。

(7)nested 用于设置回滚点(savePoint,一旦事务回滚,事务将回滚到回滚点)

事务传播行为的应用:订单业务

记录日志到数据库表X 和 保存订单数据到数据库表Y 是两个不同的事务。

订单号的生成,和保存订单数据是两个不同的事务。

11,spring事物配置⽅式有⼏种 ?(Spring管理事务的方式有几种)

(1)编程式事务,在代码中硬编码(不推荐使用)开启事务和提交事务,平台事务管理器,事务定义,事务状态。(使用sprng提供的事务API)

(2)声明式事务,在配置文件中配置(推荐使用)(因为格式都已经是固定的了所以spring帮我们写好了)

声明式事务又分为两种:

1,基于XML的声明式事务 (在xml文件中定义事务管理的通知类)

2,基于注解的声明式事务 (1)在Spring的配置类上加上@EnableTransactionManagement
(2)在方法,类上或者接口中加上@Transactional,(事务的超时时间基本上摆设。事务在执行的时候时常超过 一个值。)

12, spring事务能跨数据源吗?不能应该怎么解决

不可以。Spring Transaction默认是单数据源

分布式事务:一个事务中,涉及到对多个数据库的操作

采用分布式事务两阶段提交。

两阶段提交有两个阶段:

(1) 分别是准备阶段

(2) 提交阶段

在两阶段提交中会有一个协调者,和多个参与者。

准备阶段会有协调者开启事务。协调者向参与者发起事务执行的请求。

两阶段提交????????

两阶段提交:

存在一个负责协调各个本地资源管理器的事务管理器本地资源管理器一般是由数据库实现的,事务管理器在第一阶段的时候询问各个资源管理器是否就绪?如果收到每个资源的回复都是yes,则在第二阶段提交事务,如果存在一个资源的回复是no,则全部回滚事务。

二,springMVC

1. springmvc整合web,整合spring

SpringMVC是一个轻量级web框架,表现层框架。是基于MVC模式。(Model View Controller 一种表现层模式。浏览器请求过来 要的是数据,而我们将数据进行封装,组成一个Model, 光有数据用户看不到,我们还需要有页面视图 View 而Controller 是将数据和页面进行组合 ,通过Response相应给用户。)

比起Struts 使用更加简单,性能更加突出。

2. spring如何保证⾼并发下Controller安全 ,springmvc的controller线程安全吗?怎么解决

3. springmvc执⾏流程

请求过来,经过前端控制器,进行拦截 , 发送请求查询handler给 处理器映射器(HandleMapping), 处理器映射器查询出相应的handler ,返回一个处理器链 给前端控制器。然后前端控制器找能够执行handler的处理器适配器进行执行。执行完返回ModelAndView对象,给前端控制器。前端控制器有把ModelAndView给视图解析器(ViewResolver)解析成view对象(jsp,html)。给前端控制器。然后前端控制器进行渲染,返回给用户。

2. springmvc参数绑定原理 ,springmvc怎么进行参数绑定(借助方法的形参进行绑定)

表单穿过来的数据是键值对的形式。username=abin&password=1234 , springmvc接收,只需要在方法的参数中加 sayHello( String username , String password){} ;方法的参数名称只需要和请求参数名称保持一致就行了。mvc会自动赋值。

底层原理: 底层一定是按照反射来实现的,通过反射拿到方法的参数,然后进行赋值。

支持的数据类型:1,基本数据类型,2,实体类型(javaBean)3, 集合数据类型 (List , Map)

因为springmvc是一个web层框架。客户端一定会发送请求过来。请求一定会携带参数。springmvc拿到将数据拿到,过程就是参数绑定。

3. springmvc返回json格式数据

给前端相应数据,使用**@ResponseBody**注解即可。

4. springmvc⽂件上传

1,导入依赖,2,配置文件上传处理器, 3,在后端的代码方法的参数上加 MultipartFile file

5. springmvc和spring⼦⽗容器关系

Spring和springmvc是两个框架。spring是根容器,springmvc是子容器。有时没有配好。两个容器会产生冲突,@Controller注解的bean没有在springmvc的容器中,而是被spring加载到它的容器中。

解决方法:spring,和springmvc各扫个的包。

6. 为什么要选择springmvc框架 肯定和Struts做比较

7. SpringMVC有那些注解

@RequestParam ( 基本类型参数的封装 ,如果说请求参数的名称和方法形式参数的名称不一致,)

POJO类型的封装(请求参数的名称需要和POJO的属性名称保持一致

@RequsetMapping (在方法和类上使用) 用来指定请求路径

@ResponseBody (该注解可以将返回的JavaBean转换成json响应到前端。)

@PathVariable从路径中获取参数

@RequestBody从请求体中获取数据,获取的是json格式数据

@RequestParam 获取url拼接的值

@RestController (@RequestBody 和 @Controller的结合)

8. springmvc获得request,response, session的⼏种⽅式

这个很简单,只需要在处理器方法中定义这3种类型的形式参数即可

public String servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session)

9. 注解⽅式springmvc使⽤的是那个requestmapping,adapter(适配器)

10. springmvc怎么优化

11. springmvc的核⼼组件有哪些

也就是请求过来,那几个,视图解析器,处理器映射器,处理器适配器,前端控制器

12. springmvc怎样设定重定向和转发

此时不能使用@ResponseBody注解

return "forward:page.jsp"; == return "page.jsp";	//默认是转发
return "redirect:page.jsp";							//重定向

13. springmvc怎么处理异常

程序产生了异常,会交给Spring MVC中的异常处理器(HandlerExceptionResolver)进行处理。

14. springmvc拦截器怎么使用

拦截器在实际开发中用于拦截请求,权限校验,看是否有token

15. 拦截器和过滤器的区别

18, 什么是restful风格 ,springmvc支持resful风格,对应注解是?

把请求路径作为请求参数的一部分, 用http动作( GET , POST , Delete , PUT )描述动作。比如想要查询id为1的用户。

我们原始的post请求http://127.0.0.1/quest/user?1 , controller层需要对url进行判断,判断是查询,还是修改。然后转发业务层。

而使用restful风格,我们只需要http://127.0.0.1/user/1 这时发送个get请求。外人也看不出来我们这个是什么操作。

@PathVariable从路径中获取参数

@RequestBody从请求体中获取数据,获取的是json格式数据

@RequestParam 获取url拼接的值

19, restful风格怎么做crud(增删改查)

GET查询, POST添加, DELETE删除, PUT更新,

一般只有,get和post请求,只是一个规范而已

20, 乱码问题,静态资源放行

springmvc的前端控制器(DispathServlet 继承了httpServlet )中文乱码问题只需在web.xml使用springmvc提供的配置就行。一次配好就行了。

三,springboot

1,为什么选择springboot ,什么是springboot 和spring cloud的区别

springboot Spring家族中的一个框架,用来简化spring的开发。

比如以前开发个springMVC

1、在pom.xml文件中导入依赖

2、在web.xml文件中去配置Spring MVC所需要的前端控制器(DispatcherServlet)

3、创建一个Spring MVC的配置文件

  • 配置注解扫描路径
  • 开启注解驱动
  • 配置视图解析器
  • 配置CommonsMultipartResolver
  • 配置HandlerExceptionResolver

4、编写Controller,启动程序进行测试

使用Spring Boot开发一个web应用(基于Spring MVC)步骤:

1、在pom.xml文件中导入依赖

2、编写Controller方法

3、编写一个启动类(代码有main方法的类),启动程序进行测试

2,springboot提供了哪些核⼼功能

自动装配

起步依赖: springboot有两个起步依赖

(1)springboot需要继承的父工程 spring-boot-starter-parent

(2)web 开发需要的起步依赖 spring-boot-starter-web

一前我们开发时候需要自己导入对应的依赖,添加用那些版本,有时会出现版本冲突

而Spring boot通过起步依赖来帮助项目管理依赖,对版本锁定, dependencyManagement。

比如,web 开发需要的起步依赖 spring-boot-starter-web中有spring的依赖,mvc的依赖,tomcat的依赖,json的依赖,在spring-boot-starter-web中都有。

3,springboot中的 Starter 是什么

起步依赖:是一种可以指定基于功能依赖,是利用Maven的依赖传递性,把常用类库组合在一起,>为提供特定功能定制的依赖,并且不会存在版本冲突等问题。

4,springboot常⽤的 Starter 有哪些

spring-boot-starter-parent:SpringBoot的父依赖,SpringBoot项目必须实现的
spring-boot-starter-logging:提供Logging日志功能
spring-boot-starter-thymeleaf:使用Thymeleaf视图构造MVC Web应用程序的启动器
spring-boot-starter-web:web项目的依赖,里面有json spring tomcat mvc的依赖
spring-boot-starter-test:整合Junit测试
spring-boot-starter-data-redis:操作Redis客户端
spring-boot-starter-actuator:应用监控功能
spring-boot-starter-dubbo:使用Dubbo框架相关功能 浅绿色文字

5,springboot的配置⽂件有哪⼏种格式

properties > yml > yaml;三种,同目录优先级

6,springboot有哪⼏种读取配置的⽅式?

(1)使用@Value注解

(2)使用springboot 自带的 Evironment 对象,里面封装了配置文件中的数据。

(3)直接将数据封装到对象中。在对象上加@ConfigurationProperties(prefix = “person”), 类要有set方法

7,springboot怎么管理配置⽂件版本 吗,版本控制

Springboot多环境切换。

采用多个profile文件的方式,提供多个文件,每个代表一种环境。

application-dev.properties/yml 开发环境

application-test.properties/yml 测试环境

application-pro.properties/yml 生产环境

profile激活方式

1,配置文件: 再配置文件中配置:spring.profiles.active=dev

2,测试时在idea中配置虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev

3,部署时使用命令行参数:java –jar xxx.jar --spring.profiles.active=dev

8,springboot的核⼼注解是哪个

@EnableAutoConfiguration , 这个注解底层也是是使用 @Import这个注解来导入配置类,实现Bean的动态加载。里面的参数是AutoConfigurationImportSelector.class (ImprotSelector的实现类)

9, springboot⾃动配置原理是什么?

(1)springboot的启动类上 有 @SpringBootApplication注解 ,这个注解是一个复合注解。

核心的注解就有3个:@SpringBootConfiguration,@EnableAutoConfiguration ,@ComponentScan()

自动配置就是@EnableAutoConfiguration 它也是复合注解

里面有个注解@Import( {@AutoConfigurationImportSelector.Class } ) 利用AutoConfigurationImportSelector选择器给spring容器中导一些组件。

@AutoConfigurationImportSelector中有一个selectImprot 方法,这个方法就是要告诉springboot导入那些组件。 将所有要导入的组件以全类名的方式返回, 这些组件就会被添加到容器中。这些组件都叫做什么什么AutoConfiguration, 这些都是自动配置类。 这些配置类的作用就是给容器中导入这个场景所需要的所有组件,并配置好这些组件。

List configurations = getCandidateConfigurations( ) // 获取候选的配置文件

SpringFactoriesLoader.loaderFactoryNames()

这个方法的作用就是扫描所有jar包类路径下的 META -INF / Spring.factories

把扫描到的这些文件的内容包装成properties对象,它从properties对象获取FactoryClassName ,将结果返回交给容器中的各个组件。


ImportSelector,其主要作用是收集需要导入的配置类

(1) 在启动类上有 @SpringBootApplication注解 跟进去。是一个复合注解,

package com.yizheng.api;

@SpringBootApplication
public class ApiAcceptApplication {}

在idea中按住Ctrl点击进去,会看到下面两个关键注解(其他注解没有列出来)

@SpringBootConfiguration  //该类为配置类
@EnableAutoConfiguration  //启动自动配置
@ComponentScan() // 对那些包进行扫描
public @interface SpringBootApplication {}

其自动配置的核心就是@EnableAutoConfiguration,这个注解内部使用了@Import(AutoConfigurationImportSelector.Class) 来加载配置类。

这个类中有个方法getAutoConfigurationEntry() , 去在META-INF/spring.factories (该文件定义了许多的配置类), 找配置类,会自动加载这些配置类,初始化成Bean。 不是所有的bean都会被加载,只有满足Condition条件的,才会被加载。

四,springcloud

1,什么是微服务架构?

单体架构 > 分布式架构 > SOA架构 > 微服务

微服务是系统架构的一种风格。它是将原本独立的系统,拆分成多个微小的服务。(解耦合,有利于开发,有利于调试 )。这些微服务各个都能独立运行(独立进程,有自己独立的数据库)。各个服务之间通过HTTP的Restful 风格 进行通信协作。(比如订单微服务可能会用到商品微服务中的商品信息)

2,什么是SOA

3,什么是spring cloud

SpringCloud就是一系列框架的集合,它只是将目前各家公司开发的比较成熟的微服务框架组合起来。比如(Nacos,Feign , Gateway )。通过Spring Boot 框架, 进行项目的构建和开发。 屏蔽掉各个框架复杂的配置,和API。 springboot 和 springCloud 的区别。springCloud 啥都没干,就是把别人的框架整合起来。用springboot简化了他们之间的开发和配置。形成了一套框架的集合。springcloud是基于springcloud做开发的。

4,SpringCloud和Dubbo做对比

Dubbo (是阿里开发的一套rpc框架)的注册中心Zookeeper(注册中心就是服务治理) , SpringCloud的注册中心是Nacos 。dubbo 服务的调用方式:RPC ,SpringCloud 是采用Rest API , 服务监控才用的是Dubbo-monitor, SpringCloud 采用的是 Spring boot Admin 。断路器,服务网关,分布式配置这些都没有。

Dubbo 使用RPC通信协议(底层是基于Socket 相对于底层)完成通信,Spring Cloud使用Restful (底层是基于http的,http是相对于Socket的上层建筑, 但是上层建筑功能更多)

5, 几种注册中心的对比

服务治理就是注册中心(注册中心就是用于服务的注册和发现的)

Eureka , Consul , Nacos

Eureka是Netflix公司开发的组件 , Eureka中有俩个组件 Eureka Server(注册中心 @EnableEurekaServer),Eureka Client (服务的提供者,服务的消费者@EnableEurekaClient),@EnableDiscoveryClient // 激活DiscoveryClient 激活服务发现

Eureka 2.0遇到了一些瓶颈,停止维护,停止更新了

服务治理的作用,比如一个微服务对外提供服务,另一个微服务需要知道它在哪里。通过远程调用进行(远程调用有三要素协议,ip , 端口)。

Consul 也是一家外国的

Nacos = Spring Cloud eureka + Spring Cloud Config + Spring Cloud Bus (消息总线)

Nacos 是 阿里的, 18年开源的, 功能比上面两个要强大,可以是注册中心,也可以是配置中心。

  • 界面:中文界面,符合国人习惯
  • 上手:极易,中文文档,案例,社区活跃

6,eureka注册中⼼实现原理 (这个应该不会问,问就说eureka的组成)

7,eureka和zookeeper都可以实现注册于发现的功能 ,说说两个的区别。

在注册中心上查询服务列表时,我们可以容忍返回慢,但不能容忍直接宕机。服务的注册功能对高可用要求非常高。zk不高可用,当master节点因为网络故障挂掉,剩余节点会重新选leader,选取leader的时间较长,30~120s,且在选取zk集群期间,集群是不可用的。这样会导致注册中心在选举期间瘫痪。

Eureka保证 用性,Eureka各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点仍然可以提供注册和查询服务。

8,ribbon的负载均衡

通过一定的负载均衡算法,把我们压下来的请求分摊到配置的服务器上。通过轮询的策略进行的。(通常是轮询的策略,但还有看那个性能好,用那个。设置负载均衡的权重)

RestTemplate配置类添加@LoadBalanced注解即可

8,ribbon的负载均衡 (hystrix-ribbon)

通过一定的负载均衡算法,把我们压下来的请求分摊到配置的服务器上。通过轮询的策略进行的。(通常是轮询的策略,但还有看那个性能好,用那个。设置负载均衡的权重)

RestTemplate配置类添加@LoadBalanced注解即可

在这里插入图片描述

3,ribbon继承rest实现负载均衡原理 ,dubbb也有负载均衡

、轮询法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

、轮询法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

加权轮询法

不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

最小连接数法

​ 最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前

积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。

4, zuul实现原理 (现在不用zuul了,用的是getway网关)

zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。

全局异常处理器就是在网关中定义的。

网关也是一个微服务,也是会在Eureka注册中心中进行服务的注册和发现。网关为微服务提供统一入口。进行漏油分发。

在application.yml配置文件配置zuul的服务映射路径

5,⾃⼰实现配置中⼼思路

6,hystrix(黑 死 吹 可 死)熔断机制原理 (现在不用Netfilx (奈特fu lai x 公司的了) 用的是阿里的sentienl )

sentienl 的作用: 系统保护,

前言:

在分布式系统架构中多个系统之间通常是通过远程RPC调用进行通信,也就是 A 系统调用 B 系统服务,B 系统调用 C 系统的服务。当尾部应用 C 发生故障而系统 B 没有服务降级时候可能会导致 B,甚至系统 A 瘫痪,这种现象被称为雪崩现象。所以在系统设计时候要使用一定的降级策略,来保证当服务提供方服务不可用时候,服务调用方可以切换到降级后的策略进行执行。

原理:

当在一定时间段内服务调用方调用服务提供方的服务的次数达到设定的阈值,并且出错的次数也达到设置的出错阈值,就会进行服务降级,让服务调用方之间执行本地设置的降级策略,而不再发起远程调用。但是Hystrix提供的熔断器具有自我反馈,自我恢复的功能,Hystrix会根据调用接口的情况,让熔断器在closed,open,half-open三种状态之间自动切换。

open状态说明打开熔断,也就是服务调用方执行本地降级策略,不进行远程调用。
closed状态说明关闭了熔断,这时候服务调用方直接发起远程调用。
half-open状态,则是一个中间状态,当熔断器处于这种状态时候,直接发起远程调用。

1,服务降级:当服务会引发异常。使用Hystrix我们定义了一个回退方法。我们会在回退发方法返回一些默认值。比如HTML页面,服务器正在维护。而不能异常返回过去。

2,流量控制,热点参数限流:对资源设置限流阈值。 秒杀购物,限定一个人的访问次数

3,授权:sentienl有白名单功能。

7, 远程调用不用Feign 用 阿里的OpenFeign

远程调用的核心就是网络通信的三要素:ip,端口,协议
自己总结Spring全家桶面试题(3)_第2张图片

8,分布式任务调度使用XXL-job组件

9,分布式事务zeata

两阶段提交

10,微服务监控⽤的是什么技术

链路追踪:华为的skywalking

链路追踪

-------远程调用----------------

17、httpcleint

18、Restfultemplete Spring提供的

19、Springcloud feign

设计模式:

ioc的装饰者模式,动态代理

spring bean的单例模式

工厂模式

-------远程调用----------------

17、httpcleint

18、Restfultemplete Spring提供的

19、Springcloud feign

设计模式:

ioc的装饰者模式,动态代理

spring bean的单例模式

工厂模式

你可能感兴趣的:(java)