系列文章目录
文章目录
3. 解释什么是声明式的事务管理?Spring如何实现声明式的事务管理?重点
4. 对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理重点
3. SpringBoot、Spring MVC和Spring有什么区别?
4. 简述什么是Spring Boot Starter?重点
5. 简述 SpringBoot的核心注解 以及常用注解 ?重点
6. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?重点
3. 请详细描述DispatcherServlet 的工作流程 ?重点
8. 简述SpringCloud 和 Dubbo 有哪些区别?重点
3. Mybatis是如何将SQL执行结果封装为目标对象并返回的?
4. Mybatis动态SQL作用 ?如何封装 ?有哪些动态SQL?重点
前言
本文主要介绍Java当中的几个框架,spring、springmvc、springboot、springcloud、mybatis等等
一 Java框架——spring
1. 详细列举Spring核心模块组成 ?重点
Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含以下模块:
Spring Core
Spring Bean
SpEL (Spring Expression Language)
Spring Context
数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:
JDBC (Java DataBase Connectivity)
ORM (Object Relational Mapping)
OXM (Object XML Mappers)
JMS (Java Messaging Service)
Transaction
Web – 该层提供了创建 Web 应用程序的支持。它包含以下模块:AOP – 该层支持面向切面编程
Web
Web – Servlet
Web – Socket
Web – Portlet
Instrumentation – 该层为类检测和类加载器实现提供支持。
Test – 该层为使用 JUnit 和 TestNG 进行测试提供支持。
几个杂项模块:
Messaging – 该模块为 STOMP 提供支持。它还支持注解编程模型,该模型用于从 WebSocket 客户端路由和处理 STOMP 消息。
Aspects – 该模块为与 AspectJ 的集成提供支持。
2. 详细阐述Spring的IOC和DI ?重点
1:什么是“控制反转”
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。【百度百科】
在软件工程中,控制反转(IoC)是一种编程原则。与传统控制流程相比,IoC反转了控制流程。在IoC中,计算机程序的自定义编写部分接收来自通用框架的控制流程。与传统程序编程相比,具有这种设计的软件架构反转了控制:在传统编程中,表示程序目的的自定义代码调用可重用库来处理一般任务,但在控制反转中,框架调用自定义或特定于任务的代码。【维基百科】
简单描述就是,对象a中用到了对象b,一般情况下,需要在a的代码中显示的new一个b的对象。使用控制反转设计原则后,a中只需要定义一个对象b,不需要实例化new,而是通过相关的容器控制程序来将b对象在外部new出来并赋值给a中的b。控制反转有时被戏称为“好莱坞原则:不要打电话给我们,我们会打电话给你”。
2:什么是“依赖注入”
依赖注入(Dependency Injection)是Spring框架的核心之一。【百度百科】
在软件工程中,依赖注入是一种设计模式,其中一个对象或函数接收它所依赖的其他对象或函数。依赖注入是控制反转的一种形式,旨在分离构造对象和使用对象的关注点,从而生成松散耦合的程序。该模式确保希望使用给定服务的对象或函数不必知道如何构造这些服务具体实现。相反,接收“客户机”(对象或函数)由外部代码(“注入器”)提供其依赖关系,而它无需感知实现细节。【维基百科】
简单描述就是,在控制反转中提到相关的容器控制程序来将b对象在外部new出来并赋值给a中的b,这个就是依赖注入的过程。
IoC,DI关系
IoC(控制反转)主要指将对象的创建权交给外界(例如Spring容器),这里的交给外界就是控制反转的过程,在对象创建过程中普遍会依赖其他的对象资源,所以需要外界对原始对象进行属性依赖的赋值操作,这个过程就是DI(依赖注入)。在这里我们要清楚是将手动创建对象的权利反转给Spring容器,Spring容器对创建的对象进行依赖注入。所以IoC和DI是相辅相成的搭档,IoC需要DI进行依赖的赋值,他们都是为实现解耦而服务的。
3. 解释什么是声明式的事务管理?Spring如何实现声明式的事务管理?重点
声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。
Spring为我们提供了两种的事务管理,编程式事务管理和声明式事务管理,因为spring提倡使用声明式事务管理,所以笔者本身也具体学习研究和应用声明式事务,这里只详细谈谈声明式事务,而编程式事务就一句概括;
编程式事务:使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务:spring的声明式事务的实现方式有两种,一种是基于AOP切面实现声明式事务,而第二种是基于注解@ Transacitional实现,但是两种都需要在sprig的xml配置才能启动事务管理;本篇文章先讲基于注解Transacitional的声明式事务的实现,这里先看下xml配置文件是怎么配置的,
其中,tx:annotation-driven标签表示开启事务管理
4. 对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理重点
Spring是一个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次它提升了系统性能,因为通过依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就全部实例化,而是在调用到这个类时才会实例化该类的对象,从而提升了系统性能。这两个优秀的性能使得Spring受到许多J2EE公司的青睐,如阿里里中使用最多的也是Spring相关技术。
Spring的优点:
1、降低了组件之间的耦合性,实现了软件各层之间的解耦。
2、可以使用容易提供的众多服务,如事务管理,消息服务,日志记录等。
3、容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
Spring中AOP技术是设计模式中的动态代理模式。只需实现jdk提供的动态代理接口InvocationHandler,所有被代理对象的方法都由InvocationHandler接管实际的处理任务。面向切面编程中还要理解切入点、切面、通知、织入等概念。
Spring中IOC则利用了Java强大的反射机制来实现。所谓依赖注入即组件之间的依赖关系由容器在运行期决定。其中依赖注入的方法有两种,通过构造函数注入,通过set方法进行注入。
5. 详细叙述什么是Spring开发框架 ?重点
pring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。主要包括以下七个模块:
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring Core:核心类库,所有功能都依赖于该类库,提供IOC和DI服务;
Spring AOP:AOP服务;
Spring Web:提供了基本的面向Web的综合特性,提供对常见框架如Struts2的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
Spring MVC:提供面向Web应用的Model-View-Controller,即MVC实现。
Spring DAO:对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务;
Spring ORM:对现有的ORM框架的支持;
6. 简述Spring 的优点?
Spring具有简单、可测试和松耦合等特点,从这个角度出发,Spring不仅可以用于服务器端开发,也可以应用于任何Java应用的开发中,Spring框架优点总结:
1、非侵入式设计
Spring是一种非侵入式(non-invasive)框架,它可以使应用程序代码对框架的依赖最小化。
2、 方便解耦、简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大地降低了组件之间的耦合性。
3、支持AOP
Spring提供了对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
4、支持声明式事务处理
只需要通过配置就可以完成对事务的管理,而无需手动编程。
5、方便程序的测试
Spring提供了对Junit4的支持,可以通过注解方便的测试Spring程序。
6、方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
7、降低Java EE API的使用难度
Spring对Java EE开发中非常难用的一些API(如:JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。
Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。Spring里用的经典的一个设计模式就是模板方法模式。Spring里的配置很多很难记住,把服务和功能理解了也就基本上掌握了Spring。
7. 简述Spring的AOP理解 ?
OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用。
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
(1)AspectJ是静态代理,也称为编译时增强,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法
(3)静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。
8. 解释Spring AOP里面的关键词 ?
(1)连接点(Join point):指程序运行过程中所执行的方法。在Spring AOP中,一个连接点总代表一个方法的执行。
(2)切面(Aspect):被抽取出来的公共模块,可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,一个切面可以由多个切点和通知组成。
在Spring AOP中,切面可以在类上使用 @AspectJ 注解来实现。
(3)切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
切点分为execution方式和annotation方式。execution方式可以用路径表达式指定对哪些方法拦截,比如指定拦截add*、search*。annotation方式可以指定被哪些注解修饰的代码进行拦截。
(4)通知(Advice):指要在连接点(Join Point)上执行的动作,即增强的逻辑,比如权限校验和、日志记录等。通知有各种类型,包括Around、Before、After、After returning、After throwing。
(5)目标对象(Target):包含连接点的对象,也称作被通知(Advice)的对象。 由于Spring AOP是通过动态代理实现的,所以这个对象永远是一个代理对象。
(6)织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程。
(7)引入(Introduction):添加额外的方法或者字段到被通知的类。Spring允许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制
9. 简述Spring通知(Advice)有哪些类型?重点
(1)前置通知(Before Advice):在连接点(Join point)之前执行的通知。
(2)后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
(3)环绕通知(Around Advice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
(4)返回后通知(AfterReturning Advice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
(5)抛出异常后通知(AfterThrowing advice):在方法抛出异常退出时执行的通知
二 Java框架——springboot
1. 简述什么是SpringBoot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重xml的配置,提供了各种启动器,在运行过程中自定配置, 开发者能快速上手
2. 简述 Springboot 优点 ?重点
独立运行
Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
简化配置
spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
自动配置
Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring
boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。
无代码生成和XML配置
Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。
应用监控
Spring Boot 提供一系列端点可以监控服务及应用,做健康检测
3. SpringBoot、Spring MVC和Spring有什么区别?
Spring:
Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。
当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。
Spring MVC:
Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot:
Spring和Spring MVC的问题在于需要配置大量的参数。
SpringBoot通过一个自动配置和启动的项来解决这个问题
4. 简述什么是Spring Boot Starter?重点
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,可以一站式集成 Spring
和其他技术,而不需要到处找示例代码和依赖包。Spring Boot Starter的工作原理是:Spring Boot
在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包,根据spring.factories配置加载AutoConfigure类,根据
@Conditional注解的条件,进行自动配置并将Bean注入Spring Context
5. 简述 SpringBoot的核心注解 以及常用注解 ?重点
启动类上面的注解是@SpringBootApplication,它也是SpringBoot的核心注解 主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能, 也可以关闭某个自动配置的选项,比如关闭数据源自动配置功能:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
}
)。
常用注解:
(1)@RestController和@Controller指定一个类,作为控制器的注解
(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉
(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器
(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。
(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上
(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。
(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean
(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。
6. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?重点
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;
7. Spring Boot 的配置文件有哪几种格式?
.properties 和 .yml,它们的区别主要是书写格式不同。
1).properties
app.user.name = javastack
2).yml
app:
user:
name: javastack
另外,.yml 格式不支持 @PropertySource 注解导入配置。
三 Java框架——springmvc
1. 简述 SpringMVC 工作原理 ?重点
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
2. Spring MVC 框架的作用 ?重点
Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合
3. 请详细描述DispatcherServlet 的工作流程 ?重点
1. 向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
2. DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
3. DispatcherServlet 根据获得的 Handler ,选择一个合适的 HandlerAdapter 。(附注:如果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 preHandler(...)方法)。
4. 提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler ( Controller )。 在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
HttpMessageConveter : 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换 :对请求消息进行数据转换。如 String 转换成 Integer 、 Double 等。
数据根式化 :对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
数据验证 : 验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。
5. 根据返回的 ModelAndView ,选择一个适合的 ViewResolver (必须是已经注册到 Spring 容器中的 ViewResolver )返回给 DispatcherServlet 。
6. ViewResolver 结合 Model 和 View ,来渲染视图。
7. 视图负责将渲染结果返回给客户端。
4. 请简述Spring MVC的五大组件 ?
前端控制器 (DispatcherServlet) 映射处理器(HandlerMapping) 处理器(Controller) 模型和视图(ModelAndView) 视图解析器
5. 简述Spring MVC的前端控制器是什么?
前端控制器是org.springframework.web.servlet包中存在的DispatcherServlet类。它将请求分派到适当的控制器并管理应用程序的流程。需要在web.xml文件中指定DispatcherServlet类。
四 Java 框架——springcloud
1. 简述什么是微服务?
单个轻量级服务一般为一个单独微服务,微服务讲究的是 专注某个功能的实现,比如登录系统只专注于用户登录方面功能的实现,讲究的是职责单一,开箱即用,可以独立运行。通俗的来讲:
微服务就是一个独立的职责单一的服务应用程序。在 intellij idea 工具里面就是用maven开发的一个个独立的module,具体就是使用springboot 开发的一个小的模块,处理单一专业的业务逻辑,一个模块只做一个事情。将传统的all in one应用,根据业务功能的不同,拆分成一个个的服务,去掉以往的严重耦合现象,每个服务提供单个业务功能。微服务强调的是服务大小,关注的是某一个点,具体解决某一个问题/落地对应的一个服务应用,可以看做是idea 里面一个 module。
比如你去医院:你的牙齿不舒服,那么你就去牙科。你的头疼,那么你就去脑科。一个个的科室,就是一个微服务,一个功能就是一个服务。
2. 简述什么是微服务架构?
微服务架构是一个用分布式服务来拆分业务逻辑,完成解耦的架构模式(架构风格)
微服务架构就是在分布式技术成熟后,通过分布式服务来拆分业务逻辑,完成解耦,并且通过一系列组件和方法论来解决落地问题,这套架构风格+落地标准就是微服务架构!
微服务:每个服务就是方法,调用分布式服务
3. 简述微服务的核心要素是什么 ?重点
根基包括两点:
服务的高可用:即服务必须保证在线、存活,尽量降低服务不可用的情况;
服务的可伸缩:即服务能根据请求过来的流量、并发数等,去自动增减自身的服务(有些服务压力大,有些服务压力小,那么我们需要通过一种策略去动态地增加压力大的服务实例数量,减少压力小的服务实例数量);
4. 简述微服务的优缺点 ?
优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多有业务,只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。微服务只专注于当前业务逻辑代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。
缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资源增多,系统依赖增强,数据一致性,性能监控
5. 微服务之间如何独立通讯?
同步:RPC ,REST等。
异步:消息队列,要考虑消息的可靠传输、高性能,以及编程模型的变化等。
RestTemplate通信的三种方式:
第一种调用方式
RestTemplate restTemplate = new RestTemplate();
String data = restTemplate.getForObject("http://localhost:8773/hi?name=ceshi",String.class);
ResposeResult responseFinishEntity = restTemplate.postForObject(urlNameString, inOrderVO, ResposeResult.class);
第二种调用方式:
@Autowired
private LoadBalancerClient loadBalancerClient;
//第二种调用方式
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose("provider");
String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort());
String data = restTemplate.getForObject(url,String.class);
第三种调用方式(使用server_id):
RestTemplate restTemplate = new RestTemplate();
String data = restTemplate.getForObject("http://service-provider/hi?name=" + name, String.class);
6. 简述什么是Spring Cloud?
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
7. 简述REST和RPC的区别?
REST风格的系统交互更方便,RPC调用服务提供方和调用方式之间依赖太强。
REST调用系统性能较低,RPC调用效率比REST高。
REST的灵活性可以跨系统跨语言调用,RPC只能在同语言内调用。
REST可以和Swagger等工具整合,自动输出接口API文档。
8. 简述SpringCloud 和 Dubbo 有哪些区别?重点
两者都是现在主流的微服务框架,但却存在不少差异:
初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
生态环境不同:SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
调用方式:SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
组件差异比较多,例如SpringCloud注册中心一般用Eureka,而Dubbo用的是Zookeeper
SpringCloud生态丰富,功能完善,更像是品牌机,Dubbo则相对灵活,可定制性强,更像是组装机。相关资料:
SpringCloud:Spring公司开源的微服务框架,SpirngCloud 定位为微服务架构下的一站式解决方案。
Dubbo:阿里巴巴开源的RPC框架,Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断
9. 简述SpringCloud中的常用组件 ?重点
Spring Cloud的子项目很多,比较常见的都是Netflix开源的组件:
Spring Cloud Config
集中配置管理工具,分布式系统中统一的外部配置管理,默认使用Git来存储配置,可以支持客户端配置的刷新及加密、解密操作。
Spring Cloud Netflix
Netflix OSS 开源组件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心组件。
Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制;
Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略;
Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
Feign:基于Ribbon和Hystrix的声明式服务调用组件;
Zuul:API网关组件,对请求提供路由及过滤功能。
Spring Cloud Bus
用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置。
Spring Cloud Consul
基于Hashicorp Consul的服务治理组件。
Spring Cloud Security
安全工具包,对Zuul代理中的负载均衡OAuth2客户端及登录认证进行支持。
Spring Cloud Sleuth
Spring Cloud应用程序的分布式请求链路跟踪,支持使用Zipkin、HTrace和基于日志(例如ELK)的跟踪。
Spring Cloud Stream
轻量级事件驱动微服务框架,可以使用简单的声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。
Spring Cloud Task
用于快速构建短暂、有限数据处理任务的微服务框架,用于向应用中添加功能性和非功能性的特性。
Spring Cloud Zookeeper
基于Apache Zookeeper的服务治理组件。
Spring Cloud Gateway
API网关组件,对请求提供路由及过滤功能。
Spring Cloud OpenFeign
基于Ribbon和Hystrix的声明式服务调用组件,可以动态创建基于Spring MVC注解的接口实现用于服务调用,在Spring Cloud 2.0中已经取代Feign成为了一等公民。
5.微服务调用关系复杂,如何做监控和错误排查?
企业中对于微服务监控有一套东西,叫做APM。比如:SpringCloudSeluth+Zipkin,Pinpoint、Skywalking,可以实现性能监控、链路跟踪(精确到某个代码,某条sql)、CPU运行情况,链路运行耗时。
当然, 还可以借助于分布式日志管理系统。把项目运行的日志收集,形成统计报表,放入elasticsearch,便于搜索查看。比如:ELK技术栈、GrayLog
6.Hystix的作用是什么?
Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。比较常用的手段就是线程隔离和服务熔断。
10. Spring Cloud的版本差异关系 ?
SRx:表示Service Release版本,Spring Cloud累积到一个临界点或者解决一个严重BUG,就发布一个SR版本。
GA:General Availability,一般可用版本,标识该版本为正式版本。
Stable:稳定版,有些开源软件有的会用stable来表示正式发布的版本。比如Nginx、docker。
Final:最终版,也是正式发布版的一种表示方法。比如Hibernate。
Release:表示公开发行版本,一般来说等同于GA版本,比RC版稳定。
RC:Release Candidate,表示发行候选版本。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错,主要着重于修复测试中发现的缺陷!
Milestone:里程碑版本,在Release版本之前的相对稳定版本,高于快照版本。
SNAPSHOT:快照版本,也就是相对稳定版本,但是会再进行改进,最好不要用于生产环境。
Gamma:经Beta 版,完善修改,成为正式发布的候选版本(Release Candidate)。
Beta:比Alpha版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。
Alpha:内部测试版,表示最初的版本,一般不向外部发布。Alpha版会有很多Bug,除非你想去测试最新的功能,否则一般不建议使用。
11. SpringCloud如何实现服务的注册和发现?
服务在发布时 指定对应的服务名(服务名包括了IP地址和端口) 将服务注册到注册中心(eureka或者zookeeper)。
这一过程是springcloud自动实现 只需要在main方法添加@EnableDisscoveryClient 同一个服务修改端口就可以启动多个实例。
调用方法:传递服务名称通过注册中心获取所有的可用实例 通过负载均衡策略调用(ribbon和feign)对应的服务。
五 Java框架——mybatis
1. 简述什么是Mybatis和原理 ?重点
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。
(2)作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
称Mybatis是半自动ORM映射工具,是因为在查询关联对象或关联集合对象时,需要手动编写sql来完成。不像Hibernate这种全自动ORM映射工具,Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
(4)由于MyBatis专注于SQL本身,灵活度高,所以比较适合对性能的要求很高,或者需求变化较多的项目,如互联网项目。
2. 请简述Mybaits的优缺点 ?
【优点】
① 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
② 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
③ 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
④ 能够与Spring很好的集成;
⑤ 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
【缺点】
① SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3. Mybatis是如何将SQL执行结果封装为目标对象并返回的?
第1种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第2种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的
4. Mybatis动态SQL作用 ?如何封装 ?有哪些动态SQL?重点
Mybatis动态SQL可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断 并动态拼接sql的功能。Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
映射方式
1、当列名和封装查询结果的类的属性名一一对应时:
这时MyBatis 有自动映射功能,将查询的记录封装到resultType 指定的类的对象中去
2、当列名和封装查询结果的类的属性名不对应时:
使用resultMap 标签,在标签中配置属性名和列名的映射关系
5. MyBatis #{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性。
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值
总结
以上就是今天的内容~
欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。
最后:转载请注明出处!!!