spring boot and mvc

This commit is contained in:
yinkanglong
2023-10-29 22:21:57 +08:00
parent cf81eeddfa
commit 874f5af287
31 changed files with 1212 additions and 84 deletions

View File

@@ -1,9 +1,10 @@
## Java学习路线
> 生命的长度是有限的但Java的知识是无限的
## Java 学习路线
> 生命的长度是有限的,但 Java 的知识是无限的!
总共包括六个主要的部分。学完就能毕业啦。开始吧。
### Java的学习路线视频打卡系列
### Java 的学习路线(视频打卡系列)
- [ ] 基础知识(学习方式——阅读书籍)
- [ ] 数据库
@@ -11,30 +12,29 @@
- [ ] 计算机网络
- [ ] 数据结构与算法
- [ ] 编译原理
- [ ] Java基础教程Java的基本语法和使用及原理晚上自学,第一周学完
- [X] Java语言基础。语言语法。(分五个阶段完成把,当前第一阶段已经完成)
- [ ] Java高级操作。JDK IO操作/并发编程/网络编程
- [ ] Javaweb开发。ServletJSP相关的老技术。知道就行
- [ ] Java基本原理。JVM底层的原理和技术
- [ ] Java架构模式。面向对象和设计模式
- [ ] Java网站开发JavaWeb相关的技术知识。
- [ ] Java 基础教程Java 的基本语法和使用及原理,分五个阶段完成
- [x] Java 语言基础。语言语法。
- [ ] Java 高级操作。JDK 标准库/集合类/IO 操作/并发编程/网络编程
- [ ] Javaweb 开发。ServletJSP 相关的老技术。知道就行
- [ ] Java 基本原理。JVM 底层的原理和技术
- [ ] Java 架构模式。面向对象和设计模式
- [ ] Java 网站开发JavaWeb 相关的技术知识。)
- [ ] MySQL
- [ ] JDBC
- [ ] lombak
- [ ] mybatis
- [ ] Java工具教程Java使用的关键工具白天学习一下
- [X] maven教程
- [X] idea教程
- [ ] Java框架教程Spring全家桶白天自学
- [X] Spring
- [ ] Java 工具教程Java 使用的关键工具,白天学习一下)
- [x] maven 教程
- [x] idea 教程
- [ ] Java 框架教程Spring 全家桶,白天自学)
- [x] Spring
- [ ] Springboot
- [ ] Spring MVC
- [ ] SpringCloud
- [ ] Java云计算和微服务
- [ ] Java云原生
- [ ] docker
- [ ] k8s
- [ ] servicemesh
- [ ] Java性能优化
- [ ] Java 性能优化
- [ ] 高可用
- [ ] 双机架构
- [ ] 异地多活
@@ -44,49 +44,82 @@
- [ ] 高并发
- [ ] 分库分表
- [ ] 消息队列
- [ ] Java分布式基础
- [ ] Java 分布式基础
- [ ] 负载均衡和调度
- [ ] 分布式缓存
- [ ] 分布式算法
- [ ] kfk消息队列
- [ ] Java数据库
- [ ] kfk 消息队列
- [ ] Java 数据库
- [ ] mysql
- [ ] redis
- [ ] 中间件
- [ ] 微服务架构经典和Mesh
- [ ] 服务侧
- [ ] 注册中心Nacos/ZooKeeper/Etcd
- [ ] 服务治理,实现服务的限流、路由、熔断等功能(Seninel)
- [ ] 配置中心,运行时配置推送下发(Nacos)
- [ ] 网关
- [ ] 客户侧
- [ ] 服务框架,快速引入中间件的客户端(SpringCloud/SpringCloudAlibaba/Dubbo)
- [ ] 通信协议,实现远程调用(Dubbo)
- [ ] 通信中间件
- [ ] 消息(RocketMQ)
- [ ] 调度
- [ ] 事务
- [ ] 数据中间件
- [ ] 数据代理
- [ ] 数据缓存(Redis)
- [ ] 数据同步
- [ ] PaaS 运维发布
- [ ] 运维发布(Docker/K8s/Helm):服务自愈、弹性伸缩
- [ ] 应用管理、服务管理、节点管理、全链路灰度、灰度发布
- [ ] RaaS 监控告警
- [ ] 日志
- [ ] 监控、告警(Prometheus/Grafana)
- [ ] 链路追踪
- [ ] 研发效能 CI/CD
- [ ] 需求管理
- [ ] 迭代管理和流水线(Jekeins)
- [ ] 仓库:代码仓库(Gitee/Git)、镜像仓库(DockerHub)、依赖仓库(Maven)等
> 首先看完这些相关的课程,然后去看书重新学习一遍这些知识
> * 下三个内容jdk/jdbc -> javaweb -> springmvc -> mybatis -> ssm -> sprincloud
> * -> spring(spring->springboot->springmvc->springcloud)
> * -> java(jdk->javaweb->jvm)
> * -> 网站开发(mysql->jdbc->lomback->mybatis)
> * -> 云计算(docker->k8s)
> * -> 微服务(nacos->zookeeper->sentinel->dubbo->rocketeMQ->prometheus->grafana->git->jekens)
### Java 书籍打卡系列开始
### Java书籍打卡系列开始
第一阶段:向下探索五本
- [ ] Java编程思想4版
- [ ] Java核心技术卷112版
- [ ] Java核心技术卷212版
- [ ] Java 编程思想4 版)
- [ ] Java 核心技术卷 112 版)
- [ ] Java 核心技术卷 212 版)
- [ ] Effective Java
- [ ] 深入理解Java虚拟机
- [ ] 深入理解 Java 虚拟机
第二阶段:向上进阶五本
- [ ] ON JAVA基础卷
- [ ] ON JAVA进阶卷
- [ ] Java设计模式及实践这些东西还是得自己手敲一遍
- [ ] Java并发编程的艺术、并发编程实践、高并发编程详解机械工业出版三件套
- [ ] Spring官方文档。全套阅读。
- [ ] ON JAVA 基础卷
- [ ] ON JAVA 进阶卷
- [ ] Java 设计模式及实践(这些东西还是得自己手敲一遍)
- [ ] Java 并发编程的艺术、并发编程实践、高并发编程详解(机械工业出版三件套)
- [ ] Spring 官方文档。全套阅读。
第三阶段:云原生三本
- [ ] 云原生技术
- [ ] 服务网格
> 一份可以参考的文档。其中大数据、网络安全和扩展篇不学。
> ![](image/2022-10-27-20-26-36.png)
> 找到了两个很不得了的东西。如果有时间,可以把这两个文档全部重新看一遍。完全有书籍的质量的基础知识介绍。常看常新。自己接下来的笔记就从这上边找吧。
>
>
> 入门小站。https://rumenz.com/
> BestJavaer。https://github.com/crisxuan/bestJavaer
>

View File

@@ -0,0 +1,112 @@
# Servlet容器、Http服务器Servlet、Tomcat、SpringMVC的关系
> 参考文章
> https://blog.csdn.net/cristianoxm/article/details/121268913
## 1. Servlet
### 概念
![](image/2023-10-22-21-51-33.png)
servlet就是一个接口接口就是规定了一些规范使得一些具有某些共性的类都能实现这个接口从而都遵循某些规范。有的人往往以为就是servlet直接处理客户端的http请求其实并不是这样servlet并不会去监听8080端口直接与客户端打交道是“容器”比如常用的tomcat。客户端的请求直接打到tomcat它监听端口请求过来后根据url等信息确定要将请求交给哪个servlet去处理然后调用那个servlet的service方法service方法返回一个response对象tomcat再把这个response返回给客户端。
简而言之就是说Servlet是一个小型的JAVA程序运行在Web 服务器中来处理用户的请求我们实际上使用的各路Servlet都需要通过各种方式实现这个接口。
### 生命周期
1. 调用 init() 方法初始化
1. 调用 service() 方法来处理客户端的请求
1. 调用 destroy() 方法释放资源,标记自身为可回收
1. 被垃圾回收器回收
### 请求处理
![](image/2023-10-22-22-00-16.png)
servlet的init方法和destroy方法一般容器调用这两个方法之间的过程就叫做servlet的生命周期。调用的整个过程就如上图所示。当请求来容器第一次调用某个servlet时需要先初始化init()但当某个请求再次打到给servlet时容器会起多个线程同时访问一个servlet的service方法。
由此可以看出多个客户访问同一service方法会涉及线程安全的问题。
1. 如果service()方法没有访问Servlet的成员变量也没有访问全局的资源比如静态变量、文件、数据库连接等而是只使用了当前线程自己的资源比如非指向全局资源的临时变量、request和response对象等。该方法本身就是线程安全的不必进行任何的同步控制。
2. 如果service()方法访问了Servlet的成员变量但是对该变量的操作是只读操作该方法本身就是线程安全的不必进行任何的同步控制。
3. 如果service()方法访问了Servlet的成员变量并且对该变量的操作既有读又有写通常需要加上同步控制语句。
4. 如果service()方法访问了全局的静态变量,如果同一时刻系统中也可能有其它线程访问该静态变量,如果既有读也有写的操作,通常需要加上同步控制语句。
5. 如果service()方法访问了全局的资源,比如文件、数据库连接等,通常需要加上同步控制语句。
### Servlet如何同时处理多个请求访问
单实例多线程: 主要是请求来时会由线程调度者从线程池李取出来一个线程来作为响应线程。这个线程可能是已经实例化的也可能是新创建的。Servlet容器默认是采用单实例多线程的方式处理多个请求的
1. 当web服务器启动的时候或客户端发送请求到服务器时Servlet就被加载并实例化(只存在一个Servlet实例)
2. 容器初始化化Servlet主要就是读取配置文件例如tomcat,可以通过servlet.xml的设置线程池中线程数目初始化线程池通过web.xml,初始化每个参数值等等。
3. 当请求到达时Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程Worker Thread给请求者
4. 线程执行Servlet的service方法
5. 请求结束,放回线程池,等待被调用; (注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题)
以上方法主要优点如下
1. 第一Servlet单实例减少了产生servlet的开销
1. 第二:通过线程池来响应多个请求,提高了请求的响应时间;
1. 第三Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet直接分配给它一个新的线程如果是同一个Servlet的多个请求那么Servlet的service方法将在多线程中并发的执行
1. 第四每一个请求由ServletRequest对象来接受请求由ServletResponse对象来响应该请求
## 2. Tomcat
1. 尽管tomcat非常灵活而强大可以作为web应用服务器启动端口使用Socket进行网络通信实现Web服务器通过多线程的方式提供请求并发处理能力。
2. 但是tomcat首先是一个Servlet容器,Servlet容器可以对Servlet进行管理控制其生命周期。使其可以专注于自己应该做的事情不需要考虑端口啊多线程啊socket之类的东西也使得Servlet在各种环境下具有适应性。一个基本的流程tomcat接收请求找到合适的Servlet来处理请求如果该Servlet没加载就顺便编译加载到JVM,如果加载了就调init方法初始化调Service方法处理request并返回responser观测Servlet状态变化在结束时调用destory方法。
## 3. SpringMVC
任何Spring Web的entry point都是servlet。
spring的核心就是通过依赖注入、面向切面编程aop、和模版技术解耦业务与系统服务消除重复代码。借助aop可以将遍布应用的关注点如事物和安全从它们的应用对象中解耦出来。
### Bean的声明周期
![](image/2023-10-22-22-32-40.png)
![](image/2023-10-22-22-32-54.png)
![](image/2023-10-22-22-33-02.png)
## 4. 三者关系
1. Tomcat和jettey类似都是HTTP服务器和Servlet容器负责给类似Spring这种servlet提供一个运行的环境其中Http服务器与Servlet容器的功能界限是可以把HTTP服务器想象成前台的接待负责网络通信和解析请求Servlet容器是业务部门负责处理业务请求。
2. Tomcat和Servlet作为Http服务器和Servlet容器的结合可以接受网络http请求解析为Servlet规范的请求对象和响应对象。比如HttpServletRequest对象是Tomcat提供的Servlet是规范Tomcat是实现规范的Servlet容器SpringMVC是处理Servlet请求的应用其中DispatcherServlet实现了Servlet接口Tomcat负责加载和调用DispatcherServlet。同时DispatcherServlet有自己的容器SpringMVC容器这个容器负责管理SpringMVC相关的bean比如Controler和ViewResolver等。同时Spring中还有其他的Bean比如Service和DAO等这些由全局的Spring IOC容器管理因此Spring有两个IOC容器。
3. JavaEE中如果只是使用spring(不包含springmvc)那么是tomcat容器解析xml文件通过反射实例化对应的类根据这些servlet规范实现类触发对应的代码处理逻辑这个时候tomcat负责http报文的解析和servlet调度的工作。
4. 如果使用spring mvc那么tomcat只是解析http报文然后将其转发给dispatchsetvlet然后由springmvc根据其配置实例对应的类执行对应的逻辑然后返回结果给dispatchservlet最后由它转发给tomcat,由tomcat负责构建http报文数据。
### Web服务器的实现方案
实现web服务有很多种方案。为了能够模块化每一个功能将整个web服务器分为一下三个部分。大致分为一下三个步骤
1. Http服务器监听端口、解析Http协议的数据包将处理后的数据包转换成Http格式的数据包返回给操作系统。**提供并发处理请求的能力**,这种并发能力可以基于多种不同的技术实现(多线程、异步非阻塞),但都必须遵循标准。
2. 服务路由映射将解析后的数据包转换为Java类型的请求通过Url Mapping到指定的业务处理器上。
3. 业务逻辑处理:根据请求的具体内容,处理业务需求,返回处理结果。
其中典型的实现方案包括一下几种:
1. Servlet with JavaEE。基于Servlet标准提供Web服务其主要实现包括原生的Servlet服务器。Tomcat、Jetty等Http服务器和Servlet容器实现客户实现的Servlet中实现了业务逻辑处理。
1. Tomcat实现了Http服务器
2. Tomcat实现了Servlet容器在Servlet容器中实现了服务路由映射。
3. 在不同Servlet中实现了业务逻辑处理。
2. Servlet with SpringMVC中。和SpringMVC通过封装Servlet实现的Web服务器+SpringMVC提供的服务路由映射和业务逻辑处理能力
1. Tomcat实现了Http服务器
2. Tomcat实现了Servlet容器将所有请求/**映射到同一个Spring的DispatcherServlet上。
3. SpringMVC实现了服务路由映射通过内置的服务路由映射机制路由到具体的业务代码和Servlet处理业务需求。
3. WebFlux With Netty。底层是Netty通过异步非阻塞的方式实现的web服务器。异步非阻塞不是指在调用链上的某个节点而是所有节点都是异步非阻塞的。
1. Netty实现了Http服务器
2. SpringMVC实现了服务路由映射
3. 用户自己实现了业务逻辑处理
4. Jax-RS with Resteasy/Jessy。底层也是Netty通过多线程阻塞的方式实现web服务器。
1. Netty实现了Http服务器
2. Jax-RS实现了服务路由映射和过滤器的标准、Resteasy提供了具体实现。
3. 用户自己实现了业务逻辑处理。

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB