Spring MVC的工作流程
客户端向服务端发送一次请求这个请求会先到前端控制器DispacherServletDispacherServlet接收到请求后会调用HandlerMapping处理器映射器——该请求由哪个Controller来处理DispacherServlet调用HandlerAdapter处理器适配器告诉处理器适配器应该去执行哪个Controller这个存在的意义是有不同的Controller类型DispacherServlet将ModelAndView交给视图解析器解析然后返回真正的视图。DispacherServlet将模型数据填充到视图中。DispacherServlet将结果返回给客户端。二、SpringMVC Restful风格的接口的流程是怎么样的请求进入浏览器发请求首先到DispatcherServlet前端控制器。 相当于“总调度”。找到处理器DispatcherServlet 问HandlerMapping“这个请求该交给谁处理”HandlerMapping 返回对应的Controller。执行 ControllerDispatcherServlet 交给HandlerAdapter去执行 Controller 方法。 Controller 就是你写的GetMapping(/user)这种方法。处理返回值如果 Controller 方法上有ResponseBody返回对象就要转成 JSON。过程Spring 用HttpMessageConverter默认 Jackson把对象序列化成 JSON。写到响应的OutputStream里。响应返回给浏览器这时 JSON 已经写进了 HTTP 响应体直接返回给客户端。 如果方法返回ModelAndView才会走视图解析这里返回的是 JSON所以不需要。Spring Boot一、介绍一下Spring Boot有哪些优点自动配置内置了大量常用场景的配置开发者只需要少量配置。比如加上spring-boot-starter-web就能快速构建 Web 应用。starter机制提供一系列start依赖包整合第三方框架很方便spring-boot-starter-redis。内嵌服务器传统的方式写完代码后要把项目打包成WAR包还要准备一个外部的应用服务器如Tomcat把war包放到服务器的webapps目录下重启tomcat才能跑。但在SpringBoot中直接内嵌了服务器只需要打包一个jar包然后直接命令执行会自动把内嵌的Tomcat启动起来。约定优于配置提供了一套合理的默认约定若不写配置就用默认值若有特殊需求也可以再覆盖配置。依赖管理提供官方Start POM一行依赖搞定一整套功能避免版本冲突。二、Spring Boot自动配置原理传统Spring需要写一堆XML或配置如web项目要自己配置DispatcherServlet、ViewResolver、消息转换器数据库要自己配置dataSource等。那SpringBoot的最大特点就是这些常见配置不需要你写自动帮你配好。123456SpringBootApplicationpublicclassDemoApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(DemoApplication.class, args);}}1、 启动类上有一个SpringBootApplication注解这个注解里面包含EnableAutoConfiguration。2、SpringFactories 机制Spring Boot 在自己的 jar 包里放了一个文件META-INF/spring.factories。如果启用了自动配置请把这些类也加载进来。1234org.springframework.boot.autoconfigure.EnableAutoConfiguration\org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\...3、条件注解比如DataSourceAutoConfiguration123456ConfigurationConditionalOnClass(DataSource.class)// classpath 里有 DataSource 才生效ConditionalOnMissingBean(DataSource.class)// 容器里没有你自己定义的 DataSource 才生效publicclassDataSourceAutoConfiguration {// 自动帮你注册一个 DataSource bean}你引入了spring-boot-starter-jdbc→ classpath 里就有DataSource→ 自动配置生效 ✅如果你自己写了一个Bean DataSource→ Boot 就尊重你写的不去覆盖 ❌三、Spring Boot启动原理123456SpringBootApplicationpublicclassDemoApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(DemoApplication.class, args);}}创建一个SpringApplication对象判断应用类型普通应用/servlet Web应用加载ApplicationContext类型。读取配置去application.yml/application.properties里读配置。把数据库地址、端口号、日志级别等全都存好。加载Bean定义你写的类上有Component、Service、Repository、ControllerSpring 都会扫描到。Spring Boot 还会根据依赖比如spring-boot-starter-web自动帮你装好“常用机器”Tomcat、Jackson、异常处理器等。创建Bean依赖注入Spring 会 new 出所有对象实例化Spring 会 new 出所有对象实例化。启动内嵌服务器若是Web项目会自动帮你把Tomcat启动起来端口默认8080.注册好DispatcherServlet专门接收用户请求并分发给Controller。应用就绪。四、对Spring Cloud的了解1、概念微服务是一种架构风格代表着一种通过将应用程序拆分成小型、独立的功能模块的开发方式。每个模块服务实现独立的业务功能不限语言服务之间通过轻量级的通信机制如HTTP/REST或消息队列进行交互。微服务架构的核心思想是解耦应用程序提升灵活性和维护性。微服务的优点模块独立解耦独立部署、快速迭代如果改动了某个微服务不需要重启整体的项目灵活技术栈高扩展性容错性好缺点分布式系统复杂性服务器成本开发人员成运维成本增加2、Spring Cloud介绍搭建服务治理通过注册中心如Nacos实现服务的注册、发现与剔除并依靠心跳机制保证实例健康可用。服务间调用通过声明式调用工具如Feign简化服务之间的通信逻辑实现透明化的远程调用。统一入口利用Gateway作为流量入口对外提供统一的访问网关实现路由转发与权限控制。容错与限流引入Sentinel进行熔断、限流与降级提升系统在异常情况下的自我保护能力。问题排查借助SkyWalking等链路追踪工具监控请求在各微服务间的调用路径快速定位故障。分布式事务通过Seata协调跨服务的全局事务确保在多服务协同操作时的数据一致性。引入Spring Cloud pomdependencyManagement dependencies !-- Spring Cloud 版本依赖根据 Boot 版本来选 -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version2021.0.8/version !-- 举例实际要看Boot版本 -- typepom/type scopeimport/scope /dependency !-- Spring Cloud Alibaba 版本依赖Nacos, Sentinel, Seata 等 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version2021.0.5.0/version !-- 要和上面保持兼容 -- typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement3、整合Nacos注册中心进行服务发现假设现在有个小demo有两个功能下单、库存这时候下单服务是通过用HTTP的方式来调用库存服务的接口。假设这个库存服务进行了集群就会有很多的地址和端口如果都需要自己去管理的话会非常麻烦。这时候就可以用nacos来帮我们解决这个问题。1安装nacos服务https://nacos.io/download/nacos-server/?spm5238cd80.c984973.0.0.6be14023Dk5qSI2打开安装好的文件夹confapplication.properties文件因为nacos里面有很多数据要持久化所以我们要连接数据库根据原本的配置去创建一个nacos数据库记得数据库名字要和配置里面的一致。把安装包的mysql-schema.sql文件在新建的这个数据库运行一下就会产生很多个数据表。3打开安装包的bin里面的startup.cmd文件因为默认是集群方式启动把cluster改为standaloneset MODE standalone。双击启动即可端口是8848。接下来可以通过localhost:8848/nacos启动就可以打开nacos的控制面板。4引入具体的Spring Cloud组件dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency5在两个服务的启动类上加入EnableDiscoveryClient 表示当前应用启用了nacos的服务。6在两个服务的application.yml的文件中修改配置。spring: application: name: order-server cloud: nacos: discovery: server:addr: 127.0.0.1:88487启动项目在nacos控制面板就可以看到两个服务。8服务发现集成Spring Cloud Loadbalancer组件放在需要远程调用的消费者端order。然后再OrderApplication中的public RestTemplate上加一个LoadBalanced注解。然后在OrderController就可以通过服务名访问了。dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency//原来是写死的 http://localhost:8082/xxx现在换成 服务名调用