spring框架——mvc,SpringBoot,springcloud

目录

springmvc

springmvc是什么

springmvc执行流程

9大组件

springboot

为什么使用springboot

约定优于配置

自动装配机制实现原理

start组件

springcloud

springcloud是什么

eureka数据同步原理

nacos配置更新工作流程


springmvc

springmvc是什么

在servlet基础上构建并使用mvc模式设计的一个web框架,用来简化web开发。
spring mvc 框架的特点
1.把传统mvc框架里的controller控制器拆分成了前端控制器dispatcherServlet和后端控制器controller。
2.把model模型拆分成了业务层Service和数据访问层repository。
3.在视图层,可以支持不同的视图,freemark,velocity,jsp等。
spring mvc工作流程:浏览器请求首先经过springmvc核心控制器dispatcherServlet,他负责把请求分发到对应的controller上。controller处理完业务逻辑后,返回modelAndView。然后DispatcherServlet寻找到一个或者多个ViewResolver视图解析器,找到modelAndView指定的视图,并把数据显示到客户端。

springmvc执行流程

执行流程:1.配置阶段 完成xml和注解的配置,配置DispatcherServlet的url匹配规则和spring主配置文件的加载路径,进行注解配置,例如@controller,@Service,@Autowire,@RequestMapping。。。

2.初始化阶段,主要加载并解析配置信息以及ioc容器,di操作和handlerMapping的初始化。首先,web容器启动,会由web容器自动调用DispatcherServlet的Init方法。在这个方法里初始化ioc容器,然后根据配置好的包扫描路径找出相关的类,并利用反射进行实例化,存放到ioc容器里。spring将再次迭代扫描ioc容器里的实例,给需要自动赋值的属性赋值,例如@Autowire的属性。最后读取@RequestMapping注解,获得请求url,将url和Method进行一对一的关联映射并将其缓存起来。

3.运行阶段,用户在浏览器上输入url,web容器接受到用户请求。web容器调用doGet,doPost方法。获得Request和response对象,Request对象可以获取用户请求信息,通过response可以向浏览器输出响应结果。根据request获得的请求的url,可以从handlerMapping里找到对应的Method。然后利用反射调用方法,获得方法的返回结果,将结果通过response输出到浏览器,用户就可以看到响应的结果了。

9大组件

在使用spring mvc框架,主要入口是DispatcherServlet类,springmvc子容器初始化时调用onRefresh方法,他调用InitStrategies方法初始化9大组件。

multipartResolver 多文件上传组件,该组件的主要逻辑就是将enctype为"multipart/from-data"的表单request请求包装成multipartHttpServletRequest。调用他的getFile方法获取客户端上传的文件列表。

locateResolve 多语言支持组件,支持国际化多语言切换,从Request里解析出Local

ThemeResolve 主题模板处理组件,用于支持web页面的多主题风格。读取和解析页面主题样式配置。

handlerMappingURL 映射组件,主要用来保存url和业务逻辑的对应关系,本质是一个Map,Key是url,value是对应controller配置了@RequestMapping注解的方法。他被封装成一个handlerMapping对象,缓存到一个list里。

handlerAdapter 业务逻辑适配组件,动态解析参数,动态适配业务逻辑对应的handler。handlerAdapter提供了handle方法,第3个参数 Object handler是业务处理器,在DispatcherServlet里的doDispatch方法里被调用,而handler对象就是根据用户请求的url从handlerMapping里获取的,handle方法首先解析用户传递过来的参数,并完成数据类型转换,然后使用反射调用handlerMapping封装的controller方法,最后将方法调用的结果统一封装为modelAndView。

HandlerExceptionResolve 异常处理组件,用于拦截不同异常的个性化处理,spring可以给不同的异常配置不同的modelAndView,他根据异常类型将处理封装成一个modelAndView,从而将异常信息转换为更加友好的web页面展示。

RequestToViewNameTranslator 视图名称提取器,用于从Request里提取Viewname,Viewname可以设置在url参数上,也可以设置在Request的header里,将Request请求转换为视图名称。

viewResolver 视图渲染,作用相当于模板引擎,根据视图名称找到对应的模板文件,并解析。这个组件只有一个方法 ResolveViewName,返回View对象,他是用来渲染的页面,他将程序返回的结果填入具体的模板里,生成具体的视图文件,jsp,html...

FlashMapManager 闪存管理组件,参数缓存器,用来确保在请求跳转过程里不丢失参数,在Redirect重定向的时候使用。默认将参数保存在session里,@RedirectAttributes 将参数缓存,在下一个处理器获得参数。

springboot

为什么使用springboot

1.可以独立运行spring项目,可以以jar包形式独立运行。
2.内嵌的Servlet容器,实现项目的快速运行。
3.提供start简化manen依赖配置
4.自动配置spring,springboot根据我们项目里类路径的jar包,为项目自动配置bean,大大简化了配置。
5.无xml配置。

约定优于配置

1是一种软件设计范式,减少开发人员对配置项的维护,把精力聚焦在业务逻辑上。

2.springboot是约定优于配置的理念的产物,类似于spring框架的一个脚手架,通过springboot快速开发spring生态下的应用程序。

3.基于传统的spring框架开发web应用,开发人员需要做很多与业务无关而且只需要做一次的配置,例如,jar的依赖管理,web.xml,DispatcherServlet。xml的配置,应用部署到web容器,第三方组集成到ioc容器的配置项维护。

springboot不需要我们再去做这些繁琐的配置,springboot已经帮我们完成了,这些是约定优于配置思想的体现。

4.springboot start 启动依赖,帮我们管理所有的jar包的版本。

如果当前应用依赖了springmvc相关的jar包,那么springboot会自动配置内置Tomcat容器来运行web应用,不需要单独部署应用。

在springboot自动装配机制下,通过扫描约定路径下的spring.factories文件来识别配置类,从而实现bean的自动装配。

默认加载配置文件application.properties

自动装配机制实现原理

自动装配主要基于注解编程和约定大于配置的思想来设计。自动装配是由spring自动把其他组件中的bean装载到ioc容器里,不需要开发人员在配置文件里添加大量的配置,只需要在springboot的启动类上添加@SpringBootApplication注解,开启自动装配。

那么自动装配的原理是什么?
@SpringBootApplication注解是暴露给用户使用的入口,他底层是由@EnableAutoConfiguration注解来实现。
有3个核心步骤:

1.在启动依赖组件的时候,组件里必须包含@Configuration的配置类,在这个配置类中声明@bean注解,就可以将方法返回值或者属性放入ioc容器。

2.如果使用第三方jar,springboot采用spi机制,只需要在Meta-info目录下增加spring.factories配置文件,然后SpringBoot根据约定规则使用springFactoriesLoader来加载配置文件里的内容。

3.spring获取第三方jar里配置后,调用ImportSelector接口来完成动态加载。

这样设计的好处是,大幅减少的配置文件,而且各个模块之间实现深度解耦。

start组件

让开发者只需要关注业务逻辑,减少对配置和外部环境的依赖,start是启动依赖,有4个作用:1.start组件以功能为维度来维护对应的jar包的版本依赖,开发者可以不需要关心版本冲突等容易出错的细节。

2.start组件会把对应功能的所有jar包依赖全部导入进来,避免开发者自己引入依赖带来的麻烦。

3.start内部集成了自动装配机制,在程序里依赖对应的start组件后,这个组件会自动集成到spring容器里,相关bean的管理,也是基于自动装配完成的。

4.依赖start组件后,这个组件对应的功能所需要维护的外部配置会自动集成到SpringBoot,我们只需要在application.properties文件里进行维护就行了。例如:Redis,只需要application.properties文件里添加Redis的连接信息就可以使用。

springcloud

springcloud是什么

springCloud是spring推出的一套微服务解决方案,他是对微服务架构里出现的各种技术场景定义的一套标准。在这套标准里,spring集成netfix公司的oss开源套件,例如,zuul实现网关,eureka实现服务注册和发现,ribbon实现负载均衡,hystrix实现服务熔断,我们可以使用spring Cloudnetfix组件来快速落地微服务架构,以及解决微服务治理等一系列问题。但是netfix公司的oss相关技术组件闭源和停止维护,spring官方自研组件,gateway实现网关,loadBalancer实现负载均衡。

Alibaba的开源组件实现了springcloud标准,称为springCloud另一套微服务解决方案。dubbo做rpc通信,nacos实现服务注册和发现,动态配置中心,sentinel实现限流和服务降级。

eureka数据同步原理

eureka是一个服务注册中心,在eureka的设计中,为保证可靠性,提供了集群的部署方式,他的集群部署是采用两两相互注册实现的,每个eureka服务节点都需要发现集群里其他节点并建立连接,然后通过心跳的方式来维持这个连接状态。数据同步方式使用对等复制的方式,在eureka服务集群里不存在主从节点,任何一个节点都可以接收和写入数据,一旦集群里任意一个节点接收了数据,就会同步到其他节点上。

这种无中心化节点的数据同步,需要考虑数据同步死循环问题,需要区分eureka服务器收到的数据是属于客户端传递过来的数据还是集群其他节点发送过来的数据。使用时间戳标记来解决这个问题。

nacos配置更新工作流程

nacos采用长轮询的方式向nacos服务器发起配置更新查询功能,长轮询就是客户端发起一次轮询请求到服务端,当服务端配置没有任何跟新的时候,这个连接一直打开,直到服务端有配置更新或连接超时后返回。

然后nacos 客户端需要获取服务端变更配置,前提是需要做一个比较,客户端和服务端的配置信息进行比较。一旦客户端发现与服务端的配置有差异,就表示服务端配置有更新,于是把服务端配置更新到客户端,这个过程里,可能因为客户端配置信息较多,导致比较时间较长,使得配置同步较慢,与nacos针对这个场景做了优化:1.减少网络通信数据量,客户端把需要进行比较的配置进行分片,每一个分片大小是3000,每次最多拿3000个配置到nacos服务端进行比较。

2.分阶段进行比较和更新,1阶段,客户端把这3000个配置的键值对的md5拼接成一个字符串,发送到服务端进行判断,服务端逐个比较这些配置中MD5不同的Key,把存在更新的Key返回给客户端,2阶段,客户端获取到这些Key后,循环调用服务端获取这些键的值。这2个优化是为了减少通信数据包的大小,把一次大的数据包通信拆分成多次小的数据包通信。虽然增加网络通信次数,但是整体性能有较大提升。采用长连接的方式,减少了pull轮询次数,利用了长连接的优势,实现配置动态更新同步功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值