Spring框架的理解与总结

Spring 是 Java 生态中一个举足轻重的框架,大大简化了开发,它的主要核心特性包括两个,分别是 控制反转 以及 依赖注入。 控制反转 Inversion of control ,简写为 IoC ,译为 控制反转,是一种设计思想,它将对象的 创建 和 管理 交给了 Spring 来管理,更具体地说,是交给了 IoC 容器来管理。 IoC 容器是控制反转的一个实现,它存放着开发者交给 Spring 管理的对象,其底层是一个 Map。 IoC 的好处是可以帮我们管理对

Raft 共识算法总结

Raft 算法是目前应用广泛的分布式共识算法,在许多知名的开源项目比如 etcd 中,都有 Raft 的身影。同时,随着 MIT6.824 课程的普及,Raft 俨然成为了最广为人知的分布式共识算法。 Raft 的设计动机之一就是为解决 Paxos 算法的难以理解性,因此 Raft 的一个大的特性就是易于理解。 直接啃论文是困难的,本文旨在以简洁的文字总结 Raft 算法,让第一次认识 Raft 算法的同学也可以很快有一个整体上的理解。 Raft is a con

The Google File System

今天看了The Google File System的论文,我们简称其为GFS。GFS是谷歌的分布式文件存储系统,这篇论文是现代分布式软件系统入门的经典论文,并由此诞生了Hadoop生态中HDFS的开源实现。 我不会一字一句地翻译这篇论文,因为我并不是想实现这样一个系统,我打算将一些关键点提炼出来以供学习。 介绍 GFS shares many of the same goals as previous distributed file systems such

RPC协议介绍

RPC,是Remote Procedure Call的缩写,意为远程过程调用,使得调用远程服务的方法,就像我们调用本地方法一样简单,并且我们不需要关心整个过程底层的细节。 RPC协议被广泛应用于分布式系统节点间的通信,我所接触的分布式存储Curve就广泛使用了RPC协议. 关于RPC协议的实现,有很多RPC框架可以为我们所用,比如gRPC dubbo等,因此我们一般不需要去自己实现RPC。 RPC架构 整个RPC架构可以看做五个部分: 客户端,调用远程方法

IO及IO模型

IO,即Input/Output,指的是程序从外部设备或者网络读取数据到用户态内存/从用户态内存写数据到外部设备或者网络的过程。 普通的IO过程 一般的IO,其流程为, Java进程调用read() write()系统调用函数,进入内核态; 内核中的相关程序将数据从设备缓冲区拷贝到内核缓冲区中; 把数据从内核缓冲区拷贝到进程的地址空间中去 这就完成了一次Input,Output反之。 以磁盘IO为例,一次普通IO的流程如下: 这里有两个耗时的操作,一

Java IO知识总结

IO也就是Input/Output ,数据拿到计算机内存中的过程即为输入,反之,数据从内存输出到外部存储(可以是远程主机、磁盘、数据库等)的过程即为输出。数据传输过程类似于水流,因此称作IO流。IO流在Java中分为输出流和输入流,根据数据的处理方式又分为字节流和字符流。(这里的输入输出是以程序为中心的,输入指程序接收输入,输出指程序把数据输出到外部存储) Java IO流 Java IO流有四个基类,分别是输入流InputStream(字节输入流),Reader(字符输入

一致性哈希算法

一致性哈希是一种哈希算法,主要用于分布式系统中数据的分片和负载均衡,一致性哈希算法解决了传统哈希算法在节点动态增减时可能导致数据迁移量过大的问题,能够提供更好的扩展性和性能。 普通的哈希算法 众所周知,哈希算法用于将字符串映射到固定长度的哈希值上,应用广泛,譬如Java中的HashMap,C++中的unordered_map,都是用到了哈希算法。 在分布式缓存中,数据被缓存到了不同的节点上,那么具体到一个数据的缓存或者访问,分布式缓存系统应该如何选择节点呢? 这里会遇到一

缓存击穿、缓存穿透与缓存雪崩

缓存是计算机系统中应用非常广泛的技术,最经典的,操作系统中处处是缓存,缓存可以大大提升数据访问速率。 在业务中,数据库(MySQL)面对大量的并发请求,会出现两个问题: 每次请求都需要查询数据库,速度很慢; 数据库无法承受如此大的请求流量,可能引起数据库宕机; 为解决这两个问题,一般会在内存中设置缓存,通常是使用Redis作为缓存,对于数据库的查询请求首先查询缓存,如果查不到,再去查询数据库。 引入缓存之后又会面临三个新的问题,即缓存击穿、缓存穿透以及缓存雪

Java反射机制

在Java中,所有对象都有两种类型,即编译时类型和运行时类型。 编译时类型是在程序代码编译解决确定的类型,而运行时类型是在程序运行时根据实际的对象类型确定的。 并且由于多态机制,很多时候一个对象的编译时类型和运行时类型并不是一致的。 譬如,对于如下代码: Object i = new String(qwe); i.getClass(); 对象i的编译时类型为Object,但是当我们使用getClass()获取它的所属类的Class类对象时,得到的结果却是java.la

Springboot自动配置原理

Springboot只需要导入starter,就可以愉快地写代码了,其余的配置都不需要我们来考虑,显得十分便捷,那么Springboot这种自动配置机制的原理是怎样的呢? Springboot开发流程 以web应用程序开发为例: 导入starter-web,即导入了web开发场景 编写主程序,并且主程序类被注解@SpringBootApplication标识 编写业务代码,全程无需关心各种业务整合(Springboot代替我们完成了) 导入 starter