一:springmvc请求流程
1:用户发送请求到tomcat
2:tomcat查看请求的url是否符合DispatcherServlet的拦截规则,如果符合则将请求交由DispatcherServlet去进行处理,如果不符合则直接404。
3:DispatcherServlet接收到请求后,去查看handlerMapping中是否有对应的映射,如果没有直接404
4:如果找到了对应的handlerMapping,那么handlerMapping会将请求映射为一个handlerExecutionChain对象(里面封装了handler与多个拦截器对象)然后将其返回给DispatcherServlet。
5:DispatcherServlet通过HandlerAdapter来执行Handler。
6:Handler执行完成之后会返回给HandlerAdapter一个ModelAndView对象。
7:HandlerAdapter将ModelAndView返回给DispatcherServlet。
8:DispatcherServlet去请求viewResolvers进行视图的解析(根据逻辑视图找到真实视图)
9:视图解析器返回视图后,DispatcherServlet对视图进行渲染(将数据写入到页面中)
10:视图解析器将视图返回给DispatcherServlet
11:DispatcherServlet将视图响应给用户。
二:spring常用设计模式
1:工厂模式
2:单例模式
3:适配器模式
4:包装器模式
5:代理模式
6:观察者模式
7:策略模式
8:装饰器模式
9:模版方法模式
三:什么是ioc,什么是di
控制反转:之前的所有对象都是由我们在程序之中手动new出来的,而使用spring之后我们所有的对象都有spring容器去创建,我们需要使用的时候只需要从容器中获取即可(反转创建对象的权利)。
依赖注入:spring在创建对象的过程中,将对象中所依赖的属性注入到对象之内(给创建的对象赋值)。
四:什么是AOP,AOP主要依靠什么实现
面向切面编程,AOP能够将与业务无关,但是又被所有业务模块共用的代码抽离出来,使用动态代理技术在容器的运行期间,动态的织入其中,减少重复代码,降低耦合度,提升系统的可维护性,并且spring的AOP事务管理功能十分强大。
AOP主要依靠动态代理实现。
五:数据库的事务,数据库的隔离级别
(一):原子性;
(二)一致性;
(三)隔离性;
(四)持久性;
读未提交,读已提交,可重复度,串行化
六:什么是悲观锁,什么是乐观锁,如果实现两种锁
悲观锁:
就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制
乐观锁:
就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量
乐观锁实例:
select version from user;update user set username='zhangsan1',version=version+1 where id=1 and version=10012;
悲观锁实例:
begin; select username from user where id = 1 and version=10014 for update; update user set username='zhangsan4',version=version+1 where id = 1; commit;
七:分布式与集群的区别
分布式: 牵扯到项目的拆分,将一个完整的项目拆分成多个模块,并且每个模块都能独立部署以及运行
集群: 项目的部署,将一个单独的项目部署在多台服务器上就叫做集群,将分布式项目中每一个模块都部署在多台服务器上就叫 分布式+集群
八:什么是rpc,为什么要用dubbo
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
通信框架:MINA 和 Netty。
- 透明化的远程方法调用,底层封装了 Java NIO 通信框架 Netty、序列化及反序列化框架、以及应用层提供线程池和消息调度,使业务可以快速的实现跨进程的远程通信,就像调用本地服务那样去调用远程服务,而不需要关系底层的通信细节,例如链路的闪断、失败重试等,极大的提高了应用的开发效率。
- 软负载均衡及容错机制,可以在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。
- 服务自动注册与发现,基于服务注册中心的订阅发布机制,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的ip地址,并且能够平滑添加或删除服务提供者。
- 服务治理,包括服务注册、服务降级、访问控制、动态配置路由规则、权重调节、负载均衡。
- Spring 框架无缝集成、配置化发布服务。
九:什么是nginx,什么是反向代理
是一个优秀的web服务器,其反向代理功能十分强大,依靠其反向代理可以实现负载均衡。
正向代理:
由用户告知代理服务器需要访问的真实服务器地址,而代理服务器根据用户指定的服务器地址去访问对应服务,并对服务器隐藏真实的用户信息。
反向代理:
客户端提供给用户的是代理服务器地址,对用户隐藏了真实服务器地址,对于用于用户而言并不知道自己使用了代理服务器。
正向代理代理的对象是客户端,反向代理代理的对象是服务端
十:支付宝支付流程
用户使用支付宝付款
1:商户客户端请求后台服务器获取签名后的订单信息
2:后台服务器返回给客户端签名后的信息
3:客户端调用支付宝客户端的支付接口
4:支付宝客户端向支付宝服务端发送支付请求
5:支付宝服务端完成支付
6:向支付宝客户端返回支付结果
7:支付宝客户端将支付结果显示给客户端
8:客户端将支付结果返回给服务器进行验签,解析
9:服务器将最终支付结果返回给客户端
10:客户端将支付结果显示给用户
11:支付宝服务端异步发送支付通知给服务器
12:服务器响应支付宝服务端的通知
简易流程:
1:服务器生成前面后的订单信息返回给客户端
2:客户端调用支付接口,并获取接口的支付结果
3:同步支付结果给服务器进行验签,解析
4:服务器将支付结果返回给客户端,并展示给用户
5:支付宝异步向服务器发送支付通知
6:服务器(修改订单状态并)响应支付宝的通知。