分层架构设计概念

技术架构分层设计

  系统分层设计是一种设计思想(分而治之),是让每层对象都有一个独立职责,再让多 层对象协同(耦合)完成一个完整的功能。这样做可以更好提高系统可扩展性,但同时也会 增加系统整体运维的难度

springBoot技术简介和特性

  Spring Boot 是 Java 软件开发框架(很多人现在把它理解为一个脚手架),其设计目 的是用来简化 Spring 项目的初始搭建以及开发过程。该框架使用了特定的注解方式来进行 配置,从而使开发人员不再需要大量的 xml 配置。不再需要大量的手动依赖管理。约定大于配置,开箱即用的方式
特性
SpringBoot 其核心特性包含如下几个方面:
▪ 起步依赖(Starter Dependency),
▪ 自动配置(Auto Configuration),
▪ 健康检查(Actator)-监控。
▪ 嵌入式服务(Tomcat,Jetty)等。

项目启动时基础操作

  1. 基于线程调用i/o从磁盘读取类,将其加载到内存,此时会基于类创建字节码对象(其类型 为 Class 类型)
  2. 基于 Class 对象(字节码对象)读取类的配置信息(例如类上有什么注解-例如 @Component,属性上有什么注解,…)
  3. 基于类的配置进行相应的配置存储( 交给 spring 管理的类的配置)Map<String,BeanDefinition>
  4. 基 于 类 的 配 置 借 助 BeanFactory 创 建 类 的 实 例 ( 对象), 多 个 对 象 存 储 到 Map<String,Object>

HikarCP连接池的应用

  是通过复用对象,以减少因创建和释放对象 所带来的资源消耗,进而来提升系统性能。
  用户通过 DataSource 对象的 getConnection()方法,获取一个连接。假 如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用 Dirver(驱动, 由数据库厂商进行实现)对象的 connect 方法从数据库获取,拿到连接以后,可以将连接 在池中放一份,然后将连接返回给调用方。连接需求方再次需要连接时,可以从池中获取, 用完以后再还给池对象。

数据库连接池(原理和构成)

原理:在系统初始化的时候,在内存中开辟一片空间,将一定数量的数据库连接作为对象存储 在对象池里,并对外提供数据库连接的获取和归还方法。
  用户访问数据库时,并不是建立一 个新的连接,而是从数据库连接池中取出一个已有的空闲连接对象;使用完毕归还后的连接 也不会马上关闭,而是由数据库连接池统一管理回收,为下一次借用做好准备。
  如果由于高 并发请求导致数据库连接池中的连接被借用完毕,其他线程就会等待,直到有连接被归还。
  整个过程中,连接并不会关闭,而是源源不断地循环使用,有借有还。
  数据库连接池还可以 通过设置其参数来控制连接池中的初始连接数、连接的上下限数,以及每个连接的最大使用 次数、最大空闲时间等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况 等。

构成:数据库连接池以连接池的管理为核心,主要支持连接池的建立和释放这两大核心功能。
  功能:

  1. 如并发(锁性能优化乃至无锁)
  2. 连接数控制 (不同的系统对连接数有不同的需求)
  3. 监控(一些自身管理机制来监视连接的数量及使用 情况等)
  4. 外部配置(各种主流数据库连接池官方文档最核心的部分)
  5. 资源重用(数据库连 接池的核心思想)
  6. 检测及容灾(面对一些网络、时间等问题的自愈)
  7. 多库多服务(如不同 的数据库、不同的用户名和密码分库分表等情况)
  8. 事务处理(对数据库的操作符合 ALLALL-NOTHING 原则)
  9. 定时任务(如空闲检查、最小连接数控制)
  10. 缓存(如 PSCache 等避 免对 SQL 重复解析)
  11. 异常处理(对 JDBC 访问的异常统一处理)
  12. 组件维护(如连接状态、 JDBC 封装的维护)等

MyBatis简介

  Mybatis 是一个优秀的持久层框架,底层基于 JDBC 实现与数据库的交互。并在 JDBC 操作的基础上做了封装和优化,它借助灵活的 SQL 定制,参数及结果集的映射方式,更好的 适应了当前互联网技术的发展。

spring Web 模块的设计及实现

核心组件分析:
▪ DispatcherServlet :前端控制器, 处理请求的入口。
▪ HandlerMapping:映射器对象, 用于管理 url 与对应 controller 的映射关系。
▪ Interceptors:拦截器,实现请求响应的共性处理。
▪ Controller:后端控制器-handler, 负责处理请求的控制逻辑。
▪ ViewResolver:视图解析器,解析对应的视图关系(前缀+viewname+后缀)。

请求处理流程分析如下:

  1. 基于域名获取 ip 地址(例如:127.0.0.1)
  2. 基于 ip 地址找到网络中计算机(ip 地址是网络中计算机的唯一标识)
  3. 基于端口找到 tomcat 服务(port 是计算机中应用的唯一标识)
  4. tomcat 服务会基于 thread 并借助 io 读取网络 http 协议中请求数据
  5. tomcat 内部会创建请求(request)和响应(response)对象,用于封装请求和响应信 息
  6. tomcat 会调用 Filter 对象对 request 数据进行过滤
  7. Filter 对 request 过滤以后,会将请求交给 DispatcherServlet 进行处理?
  8. DispatcherServlet 读取请求中的 url,并基于 url 从 requestMapping 中找到对 应的 handler 以及方法
  9. DispatcherServlet 基于反射技术调用 handler 方法
  10. DispatcherServlet 会将 handler 方法返回的 view 等相关信息进行封装,然后交 给视图解析器进行解析
  11. ViewResolver 视图解析器对为 view name 添加前缀,后缀,并将 model 中数据 填充到 view 中
  12. DispatcherServlet 将视图解析器解析的结果封装到 response 对象,并将其响应 到客户端

请求响应设计

▪ 请求方法参数描述设计

  1. @RequestParam(对传统风格 url 参数,请求方法中的 map 参数进行描述)
  2. @RequestBody (将客户端 post 请求的 json 值赋值给 pojo 或 map 参数) 3) @PathVariable (从 rest 风格 url 中取{}变量的值注入给参数)
  3. @DateTimeFormat (假如是 pojo 参数,可以直接描述 pojo 日期属性)

▪ 响应结果封装及转换

  1. 响应结果要做统一封装。
  2. @ResponseBody(尽量将响应结果转换为 json 格式)
  3. @JsonFormat(描述 pojo 属性或 get 方法,转 json 时按指定格式转换)

异常处理

  Java 项目中处理异常方式无非两种,要么执行 trycatch 操作,要么执行 throw 操作(抛 给其它对象处理)。

▪ 捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
▪ 避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应 使用有业务含义的自定义异常(例如 ServiceException)。
▪ 捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它 的调用者。
▪ 最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
▪ 避免出现重复的代码(Don’t Repeat Yourself),即 DAY 原则。

web全局异常处理

@RestControllerAdvice //@ControllerAdvice+@ResponseBody
▪ 此注解描述的类为全局异常处理类
@ExceptionHandler(RuntimeException.class)
▪ @ExceptionHandler 注解描述的方法为异常处理方法,
注解中定义的异常类型为方法可以处理的异常类型.

BUG分析

▪ 404 (资源没有找到)
▪ 400 (请求参数与服务端参数不匹配)
▪ 405 (请求方式与服务端不匹配)
▪ 500 (服务端处理请求的过程中出现了问题

Lombok简介

Lombok 是一个第三的 Java 库,它会自动插入编辑器和构建工具中。
  Lombok 提供了一 组有用的注释,用来告诉编译过程中的编译工具,在源代码编译成字节码的过程中,在字节码 中添加一些量样板代码。但是为哪些类或方法进行编译增强,需要通过注解对其进行描述,
常用注解有:
▪ @Setter 用于为描述的类生成 setter 方法,不包含 final 修饰属性。
▪ @Getter 用于为描述的类生成 getter 方法。
▪ @ToString 用于为描述的类添加 toString 方法。
▪ @EqualsAndHashCode 用于为描述的类,生成 hashCode 和 equals 方法。
▪ @NoArgsConstructor 用于为描述的类生成无参的构造方法。
▪ @AllArgsConstructor 用于为描述的类生成包含类中所有字段的构造方法。
▪ @Data 用于为描述的类生成 setter/getter、equals、canEqual、hashCode、toString 方法,如为 final 属性,则不会为该属性生成 setter 方法。
▪ @Slf4J 用于为描述的类添加一个日志属性对象。

AOP面向切面代理编程

  AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切 面编程,它是面向对象编程(OOP)的一种补充和完善。
AOP与OOP区别
  实际项目中我们通常将面向对象理解 为一个静态过程(例如一个系统有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面的运行期代理方式,理解为一个动态过程(在对象运行时动态织入一些扩展功能或控制对象执行)

相关术语分析
▪ 切面(aspect): 横切面对象,一般为一个具体类对象。

▪ 切入点(pointcut):定义了切入扩展业务逻辑的位置(哪些方法运行时切入扩展业务),一 般会通过表达式进行相关定义,一个切面中可以定义多个切入点。

▪ 通知(Advice): 内部封装扩展业务逻辑的具体方法对象,一个切面中可以有多个通知(在 切面的某个特定位置上执行的动作(扩展功能)。

▪ 连接点(joinpoint):程序执行过程中,封装了某个正在执行的目标方法信息的对象,可以 通过此对象获取具体的目标方法信息,甚至去调用目标方法

通知类型
▪ @Around (优先级最高的通知,可以在目标方法执行之前,之后灵活进行业务拓展.)
▪ @Before (目标方法执行之前调用)
▪ @AfterReturning (目标方法正常结束时执行)
▪ @AfterThrowing (目标方法异常结束时执行)
▪ @After (目标方法结束时执行,正常结束和异常结束它都会执行)

切面执行顺序
  切面的优先级需要借助@Order 注解进行描述,数字越小优先级越高,默认优先级比较低

spring工程中的异步

  1. 启动异步
    SpringBoot 工程中默认支持异步操作,但是我们需要首先在启动类的上面,添加启动 异步操作的注解(@EnableAsync)描述。

  2. 定义切入点方法
    某个业务方法需要执行异步操作,可以使用@Async 注解对方法进行描述。@Async 注解描述的方法,在 spring 中会认为这是一个异步切入点方法, 在这 个切入点方法执行时,底层会通过通知方法获取线程池中的线程,通过池中的线程调用切入点方法(底层默认池类型为 ThreadPoolExecutor 类型)

  3. 自定义线程池的配置(properties)
    #核心线程数
    spring.task.execution.pool.core-size=2
    #阻塞式队列容量
    spring.task.execution.pool.queue-capacity=1
    #池中允许的最大线程数
    spring.task.execution.pool.max-size=3
    #普通线程超出keep-alive属性设置的时间值,则释放线程
    spring.task.execution.pool.keep-alive=60000
    #配置线程名的前缀,设置的目的是了更好识别这些线程,出现问题便于调试
    spring.task.execution.thread-name-prefix=db-service-task-
    #是否允许核心线程被释放
    spring.task.execution.pool.allow-core-thread-timeout=false

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值