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

Golang Context包

本文是我的context学习记录,由于还没怎么使用过context,所以不甚详细,后续会逐渐补充细节。 context包概述 context包定义了Context类型,它在API边界和进程之间携带截止时间、取消信号和其他的请求范围的值。 对于服务器的进入请求应该创建一个Context,向服务器发出的调用应该接收一个Context。他们之间的函数调用链必须传播Context,可以选择将它们替换为使用WithCancel、WithDeadline、WithTimeout或者W

第一个Kubernetes应用

这两天搭建了一个Kubernetes集群,包含三个节点,如图所示: 接下来该学习如何在k8s集群上运行第一个k8s应用了。 准备镜像 首先第一步,我们应该准备我们运行这个应用所需要的容器镜像。 编写应用配置文件 有了容器镜像之后,我们需要编写应用配置文件告诉k8s我们想要如何运行我们的容器。 应用配置文件一般是YAML格式的,其中包含容器的定义、参数、配置等等信息,然后只需一条指令(kubectl create -f)就可以通过这个YAML文件把容器运行起来。

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