动手实践Redis主从复制、Sentinel主从切换、Cluster分片 背景简介Redis 提供的如下技术「Redis Sentinel『主从切换』、Redis Cluster『分片』」,有效实现了 Redis 的高可用、高性能、高可伸缩性,本文对以上技术进行亲自动手实践。1. Redis Sentinel「主从切换」监控主从节点的在线状态,并根据配置自行完成切换「基于raft协议」。主从复制从容量角度来说,还是单机。2. Redis Cluster「分片」通过一致性 hash 的方式,将数据分散到多个服务器节点:设计了 16384 个哈希槽,并分配到多台 r
搭建基于 docker 的 Kafka 集群及 Spring Boot 应用访问 需求搭建一个 3 节点 kafka 集群,测试功能和性能实现 Spring kafka 下对 kafka 集群的操作一、搭建精简版 kafka 集群参考排名第一的 kafka 镜像 wurstmeister/kafka 的官方文档,进行如下操作:创建 docker-compose.yml 文件,内容如下:version: '1'services: zookeeper: image: zookeeper container_name: bitkylin-kafka-
仿照Kafka,从零开始自实现 MQ 仿照Kafka,从零开始自实现 MQ,实现了 Kafka 中 80% 的基础功能。学习 Kafka 的话如果只是看文章和源码,可能不久就会忘了,还是自己实现一个「精简版」的 Kafka 吧,实现功能概览1、基于内存Queue实现生产和消费API 1) 创建内存Queue, 作为底层消息存储 2) 定义Topic, 支持多个Topic 3) 定义Producer, 支持Send消息 4) 定义Consumer, 支持Poll消息2、设计自定义Queue,实现消息确认和消费offset 1
亲自动手设计一个高并发的秒杀系统 一、需求有多款商品,每款商品均100件,每人限每款商品最多购买一件。在X月X日 X时X分0秒开启购买。在约定时间之前,只能看到产品页面,购买按钮置灰。二、活动预估预计每种商品数万人参与活动开始后半分钟内,预计每种商品收到10W次交易请求,预计总TPS:20W/s活动开始半分钟后,预计绝大多数商品已售罄,剩下的商品仍支持秒杀,预计总TPS:2000/s三、系统现状系统可保持长期稳定运行的最大TPS:1000/s短时间「1分钟内」系统未拒绝服务的最高TPS:1500/s四、设计预
Multi Module Spring Boot集成测试使用JaCoCo生成测试覆盖率 一般的SpringBoot项目会由多Module组成,每个Module为不同的功能模块。项目启动时,多个Module提供不同的服务,共同支持了本项目所提供的服务。若采用启动SpringBoot的方式进行多Module集成测试,一般test case会放在SpringApplication类所在的Module中,该Module一般仅提供了服务的入口,并无太多实际业务功能「简单来说,业务代码都不在这个Module中」。本文探讨运行集成测试,对多Module测试覆盖率合并统计的方法。项目结构本文所述的项目具有
基于 Hexo + NexT + GitHub 的静态博客,2020 年 8 月升级过程记录 早在 2017 年,我基于 Hexo + NexT 搭建了 GitHub 托管的静态博客。到现在快 3 年了,发生了很多变化,比如 Hexo 脚手架升级了 2 个大版本「目前最新 5.0 版」,Node.js 也升级了多个大版本,静态博客的功能进行了很多增强,为了赶上时代的潮流,故需要对之前搭建的静态博客底层框架进行全方面的升级。本文记载了完整的升级过程。本文演示在 Mac 系统下的操作过程。首先展示升级后,主页最终效果:本次升级方案如下:使用最新版脚手架工具创建新的静态博客项目将文章、Next
「原理分析」Spring Boot启动时基于spring.factories自动读取远端Environment实现的原理源码分析 采用Spring标准的事件/监听器模型,通过Spring SPI的方式,在Spring Boot启动时,自动读取远端「远程服务器、本地硬盘等」Environment配置,方便在Spring Boot启动前,对配置进行灵活调整,增加灵活性,减少硬编码。本文先从原理进行分析,表明其可行性,下一篇文章再展示具体的代码实现。首先从SPI的基础开始讲起。1. 服务发现的基础:SPI注:此小节内容描述主要参考此文章 spring.factories在Spring Boot中有一种非常解耦的扩展机制:Spring
Ubuntu 下 Oh My Zsh 的最佳实践「安装及配置」 Oh My Zsh 是一款社区驱动的命令行工具,是基于 zsh 命令行的一个扩展工具集,提供了丰富的扩展功能,如:主题配置,插件机制,内置的便捷操作等,可以给我们一种全新的命令行使用体验。下文对 oh-my-zsh 的安装及配置方法进行总结,只总结最佳的实践。1. 安装 oh-my-zsh第一步:安装 zsh# 安装 zshsudo apt install zsh# 将z...
Spring Boot + MongoDB 应用的 Docker 化实践 本文旨在通过将一个具体的 Spring Boot + MongoDB 项目进行 Docker 化处理,从而对 Docker 的基本用法进行一次实践。该项目 Docker 化后,后端服务访问数据库正常,仍然可以打开后端服务托管的单页 Web 应用,总之项目运行状态符合预期。具体使用的项目见 这个 GitHub 仓库。学习 Docker 的基本原理、基本用法可以参考这本开源电子书《Docker —...
基于 Netty 的可插拔业务通信协议的实现「3」业务注册及实际工作流程 本文为该系列的第三篇文章,设计需求为:服务端程序和众多客户端程序通过 TCP 协议进行通信,通信双方需通信的消息种类众多。上一篇文章以一个具体的需求为例,探讨了指定的 Java 消息对象与其相应的二进制数据帧相互转换的方法。本文仍以该实例为例,探讨该自定义通信协议的具体工作流程,以及如何以注册的形式灵活插拔通信消息对象。1. 以注册的形式实现通信消息对象的统一管理通过该系列的第二篇文章...
基于 Netty 的可插拔业务通信协议的实现「2」特定业务消息对象的设计 本文为该系列的第二篇文章,设计需求为:服务端程序和众多客户端程序通过 TCP 协议进行通信,通信双方需通信的消息种类众多。上一篇文章详细描述了该通信协议的二进制数据帧格式以及基本 Java 消息类,假设通信双方「服务端、客户端」均由 Netty 框架构建而成,双方在程序内部使用 Java 消息对象,通信双方信息交互采用的是自定义二进制帧格式,本文通过一个具体实例,探讨指定的 Java 消息对象与其...
基于 Netty 的可插拔业务通信协议的实现「1」协议描述及基本消息对象设计 开发工程中,有一个常见的需求:服务端程序和多个客户端程序通过 TCP 协议进行通信,通信双方需通信的消息种类众多,并且客户端的数量可能有数万个。为此,双方需要约定尽可能丰富、灵活的数据帧「数据包」协议,方便后续业务功能的设计。本文设计了一种通信协议,为压缩数据量,该协议的数据帧以二进制方式进行传输并识别,即其基本单位为字节,必要时将部分字节流手动转化为可读文本。通过设定功能位来实现丰富的通信消...
Windows 10 用于 Linux 子系统的一键构建、打包脚本「 Node、Gradle 项目」 最近正在开发一个 Java & Vue.js 全栈项目,该项目由以下几部分组成:Java 后端服务器、基于 Vue.js 的单页应用、基于 JavaFX 的 GUI 客户端以及其他辅助工具等。如果对项目中的某个子模块进行修改,需要对其手动编译、移动,再对父模块进行编译,操作繁琐,本文探讨通过 Windows 10 的 Linux 子系统运行 Shell 脚本简化上述操作并进行扩展。
使用 Linux 子系统部署 Node、Gradle 项目的构建工具 最近的一个项目,由三个 Gradle「Java」工程以及一个 Node「Vue.js」工程组成。为了使用 Linux 下的各种工具提升效率,本文探讨 Linux 子系统的使用及在该系统下,Java、Node.js、Gradle 等工具的配置。并在后一篇文章中,探讨该项目的一键构建、打包脚本,从而根本上提升开发效率。1. Windows 10 秋季创意者更新下的 Linux 子系统我目前...
基于 Vue.js 2.0 酷炫自适应背景视频登录页面的设计 本文讲述如何实现拥有酷炫背景视频的登录页面,浏览器窗口随意拉伸,背景视频及前景登录组件均能完美适配,背景视频可始终铺满窗口,前景组件始终居中,视频的内容始终得到最大限度的保留,可以得到最好的视觉效果。并且基于 Vue.js 2.0 全家桶。具体效果如下图所示:最终效果可以翻到文章最后观看。1. 背景视频 Web 页面的既有实现方式国外有一个很好的网站「Coverr」,提供了完善的教
经典排序算法及其 Java 实现 网上有很多排序算法的总结,不过有很多缺点,比如有些根本就是错的,无法通过测试用例,有些过于冗长。所以我总结了一套短小精悍的 Java 实现,经测试,该套实现可通过牛客网的关于此的所有测试用例。1. 冒泡排序public class BubbleSort implements KySort { public void kySort(int[] a, int size) {
基于 Netty 的帧调度策略,自行实现流量控制及可靠性通信 Java 服务器和硬件设备通信的过程中,众多的硬件设备可能数据帧处理能力较差,可靠性较差,所以在 Netty 模块中使用了帧调度算法。服务器大规模下发数据帧时,可进行有效的拥塞控制、超时重发,可有效提升集群设备的可靠性,降低集群设备的研发难度。