0%

Dubbo 标签解析过程

以 Spring Boot 配置的解析过程分析:

BeanDefinitionParser

这是 Spring 定义的一个用于解析标签的总接口,用于处理自定义的解析接口,该方法中只有一个 parser 方法。Dubbo 实现了该接口,通过查看实现类可以找到 DubboBeanDefinitionParser,这个就是 Duboo 的标签解析起。

阅读全文 »

Dubbo架构

Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Dubbo架构

async表示异步,sync表示同步

阅读全文 »

Nginx 高并发实现模型

Nginx 采用的是多进程(单线程)和多路IO复用模型。使用了 I/O 多路复用技术的 Nginx,就成了“并发事件驱动”的服务器。

阅读全文 »

集群实现方案

NGINX实现主从备份目前主流方案是 Keepalived + Nginx 实现双机热备。

Keepalived介绍

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

阅读全文 »

1. MyBatis 有什么特点?

  • MyBatis 中的 SQL 语句和主要业务代码分离,我们一般会把 MyBatis 中的 SQL 语句统一放在 XML 配置文件中,便于统一维护。

  • 解除 SQL 与程序代码的耦合,通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。SQL 和代码的分离,提高了可维护性。

  • MyBatis 比较简单和轻量:本身就很小且简单。没有任何第三方依赖,只要通过配置 jar 包,或者如果使用 Maven 项目的话只需要配置 Maven 以来就可以。易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

  • 屏蔽样板代码:MyBatis 会屏蔽原始的 JDBC 样板代码,让你把更多的精力专注于 SQL 的书写和属性-字段映射上。

  • 编写原生 SQL,支持多表关联:MyBatis 最主要的特点就是可以手动编写 SQL 语句,能够支持多表关联查询。

  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射

    对象关系映射(Object Relational Mapping,简称ORM) ,是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。

  • 提供 XML 标签,支持编写动态 SQL。可以使用 MyBatis XML 标签,起到 SQL 模版的效果,减少繁杂的 SQL 语句,便于维护。

阅读全文 »

1. DevOps有哪些优势?

技术优势:

  • 持续的软件交付
  • 修复不太复杂的问题
  • 更快地解决问题

商业利益:

  • 更快速地传递功能
  • 更稳定的操作环境
  • 有更多时间可以增加价值(而不是修复/维护)
阅读全文 »

缓存的基本思想

缓存的基本思想其实很简单,就是我们非常熟悉的空间换时间。它的确对系统的性能提升的性价比非常高。

其实,在使用缓存的时候,你发现缓存的思想实际在操作系统或者其他地方都被大量用到。 比如 CPU Cache 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题,内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。 再比如操作系统在页表方案基础之上引入了快表来加速虚拟地址到物理地址的转换。可以把快表理解为一种特殊的高速缓冲存储器(Cache)。

回归到业务系统来说:为了避免用户在请求数据的时候获取速度过于缓慢,所以在数据库之上增加了缓存这一层来弥补。

缓存特征

命中率

当某个请求能够通过访问缓存而得到响应时,称为缓存命中。

缓存命中率越高,缓存的利用率也就越高。

阅读全文 »

框架介绍

Swagger-UI 是 HTML, Javascript, CSS 的一个集合,可以动态地根据注解生成在线 API 文档。

常用注释

  • @Api:用于修饰 Controller 类,生成 Controller 相关文档信息
  • @ApiOperation:用于修饰 Controller 类中的方法,生成接口文档相关文档信息
  • @ApiParam:用于修饰接口中的参数,生成接口参数相关文档信息
  • @ApiModelProperty:用于修饰实体类的属性,当实体类是请求参数或返回结果时,直接生成相关文档信息
阅读全文 »

1. 数据库

  1. 数据表分类可以通过添加 parent_id 以及“第几级分类”字段来进行级别划分,避免一个级别建一个数据表的操作。
  2. 使用业务无关自增 id 作为主键:
  • 防止后期业务发生变化需要重构某个字段(方便业务扩展);
  • 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,在中间插入,B+ 树为了维持平衡,引起B+ 树的节点分裂。 总的来说用自增主键是可以提高查询和插入的性能。(性能考量)
  1. 课程模块:
  • 课程分类作为一张表
  • 课程作为一个单独的表
  • 课程内容表(一个课程对应多集课程内容)
  • 课程练习表(一集对应多道练习题:选择、填空)
  • 课程评价表
  1. 用户模块
  • 用户信息表
  • 用户订单表
  • 用户观看历史表
  • 用户答题信息表
  1. 题库模块
  • 试卷信息表
  • 题目信息表(所属试卷,题型题号,正确答案等)
  • 选项信息表

2. 项目使用的技术

使用 Redis

项目中使用 Redis 实现短信验证码的存储验证以及观看视频历史缓存。

阅读全文 »

各种排序算法比较:

排序算法比较

约定

待排序的元素需要实现 Java 的 Comparable 接口,该接口有 compareTo() 方法,可以用它来判断两个元素的大小关系。
使用辅助函数 less()swap() 来进行比较和交换的操作,使得代码的可读性和可移植性更好。
排序算法的成本模型是比较和交换的次数。

阅读全文 »