终于完成了一个微服务的项目,现在回过头来总结一下微服务这点事。可能写的比较乱,后期再改吧,时间比较紧,没有好好规划结构。主要是借鉴了一些技术视频和大佬讲的。还有一些文章,都是一年前自己收录到word中的,所以找不到在哪里借鉴的了,如果原作者看到了可以联系我备注上出处。
先简单的说一下他们都是什么
Springframework ,轻量级一站式构建企业级应用的解决方案
Springboot 快速构建工具
Spring cloud,微服务协调框架
SpringCloudDataFlow 微服务数据流(没有研究过)
比如你选择ORM,他也给你诸多选择,比如mybatis等,向后兼容。
为什么选择用spring这一套东西?
比如你在官网下载一个项目,里边直接集成了一些,比如容器,数据库连接驱动,他会自动帮你配置好相关的bean,同时他也给你留了自定义配置的空间,你可以按照你需要的去定制。
而且他也提供了很多非功能性的东西,比如,安全,监控等。
我之前用一个非对称加密的东西,当时遇到问题就是本地window系统生成的密钥对,在Linux系统上不能用,也是用他提供的API就可以屏蔽不同系统之间的差异。
我觉得他最大的好处就是,让我们去专注业务逻辑的开发,而不是在一些其他的非功能性方面投入太多精力。
而且spring boot spring cloud有着比较强大的生态圈,对于一些比如redis,zookeeper,或者其他的中间件,都有支持。
从最开始的我的程序跑的好好的,保证不挂,到现在的考虑,高可用,高并发,考虑他的扩展性,还有遇到故障的时候,如何对系统不产生影响,迅速恢复。
Spring就是把这些东西固化到你的系统中,并且提供了很多解决方案,spring boot spring cloud也是继承了这些传统。
比如从外部容器到内部容器化,还有你可以监控系统的运行状态,还有怎么去管理你的配置文件,服务注册和发现,熔断等等。
让你的系统可以更强大。我觉得这也是现在越来越多的人使用他的原因。
Spring面试题
-
什么是Spring框架??
轻量级一站式构建企业级应用的解决方案,是框架的框架。做资源整合,实现业务逻辑层和其他层之间的解耦。
-
开发中主要使用 Spring 的什么技术 ?
①. IOC 容器管理各层的组件
②. 使用 AOP 配置声明式事务
③. 整合其他框架. -
Spring的核心模块
-
使用Spring框架能带来哪些好处??
1 容器化 容器: Spring 包含 并管理应用中 对象的 生命周期和 配置 (很方便配置是单例 还是 原型 ,以及什么时候使用 什么时候销毁 ) 2 方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理,实现松耦合。符合高内聚低耦合的思想,这个特性也叫IOC 控制反转 3 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能,他是通过 动态代理 和CGlib实现的 这个底层是反射的原理 4 声明式事务的支持 不需通过编程的方式而进行管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码, 只需在配置文件中做相关的事务规则声明,便可将事务规则应用到业务逻辑中。 5 方便程序的测试 Spring对Junit4支持,可以通过注解方便的测试Spring程序,需要加入 spring-test 的jar包 6 方便集成各种优秀框架 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持 (如:Struts2、springmvc,Hibernate、MyBatis等) 7 异常处理: Spring 提供方便的API把具体技术相关的异常转化为一致的unchecked 异常。(比如由JDBC,Hibernate or JDO抛出的)
springMVC也有一个集中处理的思想 将异常抛给springmvc框架,由框架来处理异常。
8 降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低 -
什么是控制反转(IOC)?什么是依赖注入??
**控制反转。** spring通过控制反转实现对象间的松耦合。 Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。 IoC容器初始化的步骤:两大步骤,先定义,再初始化和依赖注入 定义:bean的定义分为3步 (1)resource资源定位 (2)载入,将定位到的信息载入到bean的定义中,但是并不会创建bean的实例。 (3)bean的注册,将bean的信息发布到IoC容器中。 做完了这3步,bean就在容器中定义好了。 默认是不会初始化bean的,只有用到IoC容器,getbean的时候,才开始对bean进行初始化,完成依赖注入。 **什么是依赖注入,依赖注入的方式** 就是一个概念,你不用创建对象,只需要在xml中描述哪些组件需要哪些服务,之后IoC负责把他们组装起来。 方式: 1:构造器注入---无参构造器、有参构造器 2:工厂方式注入---静态工厂、动态工厂 3:属性注入 **面向切面编程AOP。** 在不修改原有代码的基础上进行功能的扩展。Aop并不是spring框架独有的,spring只是支持aop编程的框架之一,有些aop能够对方法的参数进行拦截,有些aop对方法进行拦截,springAOP是基于方法拦截的AOP。有四种方法实现AOP的拦截功能: (1)proxyFactoryBean和对应的接口实现AOP (2)使用XML (3)使用@AspectJ (4)适应AspectJ注入切面 AOP通过动态代理,来管控各个对象操作的切面环境,管理包括日志,数据库事务等操作,让我们可以在反射原有对象方法之前,正常返回、异常返回后,插入自己的业务代码,有时候甚至可以取代原有方法。 底层默认使用jdk动态代理,代理模式就是真实对象和代理对象共同实现一个接口,接口里封装的就是要扩展的方法,AOP就是反射的思想,自己写一个类去实现一个动态代理的接口,里面需要重写的方法就是你想要扩展的功能,如果没有AOP,你写的什么方法,他运行时调用的就是什么方法,要做业务扩展要修改大量代码。配置AOP就相当于配置了一个说明书,我要对这个bean的方法进行扩展,AOP把不是核心的业务提取出来,另外实现,可以在不改变原有代码的基础上对业务进行扩展。Cglib动态代理也是一样的,只不过他是通过继承去实现的。 基于AOP的事务管理,就是将springtx的相关管理代码配置成切面。切点bean就是业务bean,配置事务管理的bean,就是管理哪个数据库,事务管理方法。
-
Spring有几种配置方式
1. 基于XML的配置 2. 基于注解的配置 3. 基于Java的配置
-
Spring Bean的作用域(生命周期)
• singleton : bean在每个Spring ioc 容器中只有一个实例。 • prototype:一个bean的定义可以有多个实例。 • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。 • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 默认的Spring bean 的作用域是Singleton。
-
Spring框架中的单例Beans是线程安全的么?
Spring框架中的单例bean不是线程安全的。
当多线程中存在线程改变了bean对象的可变成员变量时,其他线程无法访问该bean对象的初始状态,从而造成数据错乱有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。
-
Springmvc的运行原理
Springmvc的四大核心组件
1.1 DispatchServlet: Servlet分发器,整个SPringMVC的前端控制器,框架入口。一般是在xml中配置servlet容器。
1.2 HandlerMapping:寻找URL所请求的HandlerMethod(控制器方法controller),找@RequestMapping(),根据不同的映射器找到不同的映射。
1.3 HandlerAdapter:实际调用HandlerMethod(controller)的组件,处理器适配器。
1.4 ViewResovler:视图解析器.作用解析HandlerMethod返回值.把处理结果转换为需要调用的物理视图.