Love Story
We were both young, when i first saw you
I close my eye and the flashback starts
I’m standing there, On a balcony in summer air
See the lights, see the party the ball gowns, see you make your way through the crowd and say hello
Little did I know
That you were Romeo you were throwing pebbles
And my daddy said stay away from Juliet
And i was crying on the staircase begging you don’t go
And i said: Remeo take me somewhere we can be alone, I’ll be waiting all there’s left to do is run You’ll be prin ...
一文读懂JavaScript测试框架Jest
一、基础知识
可参考下面代码一同学习:
reader.test.js
writer.test.js
1.1 是什么Jest是一个流行的JavaScript测试框架,由Facebook开发,可以让我们在开发过程中更方便地进行单元测试。它提供了很多有用的功能,例如:
快速和可靠的测试运行器:可以快速地运行测试用例,并在测试用例间进行快速切换
断言库:在测试用例中进行断言
模拟函数:模拟函数的行为
异步测试支持:方便地测试异步代码。
自动模块打包:在测试用例中轻松加载依赖模块
自动运行测试:在文件发生变化时自动运行测试用例
可视化报告:生成详细的可视化报告,以更好地理解测试结果
Jest可以运行在NodeJS环境中,也可以运行在浏览器中,因此可以用于测试各种类型的JavaScript代码。它的语法简单易懂,易于学习,因此是一个非常流行的JavaScript测试框架。
1.2 使用步骤123456789101112131415161718192021222324252627// 1. 安装npm i --save-dev jest// 2. 创建一个包含需要被测试的代码的文件sum. ...
一致性哈希算法详解(原理与Java实现)
1. 是什么哈希算法的一种,由麻省理工学院提出,目的是解决:传统哈希算法中,哈希表内槽数量变更时导致的大量键重映射问题。
如下内容引用自维基百科:
In computer science, consistent hashing is a special kind of hashing technique such that when a hash table is resized, only n/m keys need to be remapped on average where n is the number of keys and m is the number of slots. In contrast, in most traditional hash tables, a change in the number of array slots causes nearly all keys to be remapped because the mapping between the keys and the slots is defined by a modular ...
如何将artifact发布到Maven中央仓库
1. 背景最近写了一个分布式锁组件,并在另一个项目中引用了该组件。由于组件lib没有发布到远程仓库,导致每次环境变更,我都要将该分布式组件代码拉下来,然后install到本地Maven仓库,非常麻烦。因此,趁周末决定学习下如何发布到远程的中央仓库,并通过该博文来对整个过程做一个分享。
2. 正文要将artifact发布到Maven中央仓库,只需要按以下4个步骤走:
在sonatype.org上注册账号
申请pom.xml内使用的groupId的所有权,申请地址点这里
构建项目并部署到“OSSRH Nexus Repository Manager”
发布版本到中央仓库
2.1 注册账号
点击sonatype.org进入账号注册页面并填写你的信息:
之后会收到一封注册成功的通知邮件:
2.2 申请groupId的所有权
在能够将指定groupId的artifact发布到中央仓库前,必须申请获得groupId的所有权。申请表单链接在这里,表单内容可按如下填写:
表单提交后会生成一个issue页面,几分钟后刷新页面,会看到有机器人回复:
主要内容是让你加一条解析记录到正在申 ...
sofa-rpc专栏简介
1. 为什么要写这个专栏接触SOFA-RPC已一年多,但对它的熟悉程度还是比较低,遇到线上问题需要花费比较长的时间来处理,而且在过去的时间里,处理完相关问题后也没有将解决方案沉淀下来。因此,在接下来的两个月里,我会将所有空闲时间都花费在分析SOFA-RPC的实现上,并将我的所学输出到这个专栏。两个月后的今天,这个专栏应该具有以下内容:
供入门者学习的SOFA-RPC教程:让从未接触过SOFA-Stack的朋友能快速上手使用SOFA-RPC(官方文档过于简洁)。
供框架使用者查阅的配置参考手册:让普通开发者无需阅读源码即可知道配置项的作用,并快速进行功能配置(还是因为官方文档过于简介,不看代码无法知道配置项具体作用是什么)。
源码实现分析:SOFA-RPC的整体架构设计,核心功能的架构设计、代码实现及流程分析。
一个简版RPC框架的实现:分析并研究SOFA-RPC的实现细节后,动手去实现自己的RPC框架,只有动手去写才能发现其中会有哪些难点,从而加深对整个框架原理的理解。
2. 专栏文章导航[todo….]
机器重启worker线程打满问题处理及sofa-rpc预热原理分析
1. 背景降本增效后,服务A集群C1内的实例由6台4c8g容器降为4台2c4g,服务日常运行情况及资源利用率还算稳定。但发现的问题是:部署新版本重启应用时,偶发会收到大量的工作线程打满告警。
2. 问题分析
告警产生的原因:应用底层框架sofa-rpc的worker线程池配置为:corePoolSize=a、maxPoolSize=a * 10、queueSize=0。即:该应用最多可同时处理a * 10个rpc client请求(更严谨地:对sofa-rpc来说粒度是到端口的,应该为“该应用的某端口P1最多可同时处理a * 10个rpc client请求”,也就是说应用内的两个服务提供者ProviderA和ProviderB分别映射到了端口P1和端口P2并分别设置了最大a * 10个线程,那么同一时刻内该应用最多可处理2 * (a * 10)个客户端请求),多余的请求进来会直接打日志并抛服务拒绝处理异常。而当告警平台检测到某个时间段内有超过指定数量的异常时就会给开发发送告警。很明显,主要原因是应用处理请求的速度跟不上产生请求的速度,即CPU资源不足。
重 ...
雪花算法原理与Java实现
1. 是什么推特公司创建的一种在分布式系统中生成全局唯一ID的算法。
2. 原理一个由雪花算法生成的ID由64个bit组成,其中:
第1位:占用1个bit,其值始终为0,表示是正整数。
第2-42位:占用41个bit,表示时间戳(即所选epoch以来的毫秒数),共可使用69年。
第43-52位:占用10个bit,表示不同实例。可以按需拆分使用,如2bit表示机房id,8bit表示机器ID,这样可以部署到2^2个机房,每个机房部署2^8台机器。
第43-64位:占用12个bit,记录同一毫秒内产生的不同ID,即一毫秒内同一机器可产生的ID数为2^12=4096个。
3. 时钟回拨机器时间是动态调整的,如果出现时间倒退,那么可能会出现生成重复ID的问题:机器M1在时间A生成了ID”0 A M1 1”,绝对时间来到了B,但由于各种原因,机器M1发生了时钟回退,时间被设置回了A,此时使用雪花算法生成ID,是存在再次生成ID”0 A M1 1”的可能的。
4. 优点及缺点
优点:纯内存操作,速度极快
缺点:TPS有上限,每秒最多只能生成2^12 * 1000 = 409 ...
Redis知识点总结
一、安装、配置及Jedis客户端
安装:docker
配置:暂无
Jedis客户端:
12345<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.0.0</version></dependency>
二、基本功能2.1 字符串(string)字符串类型的值可以为字符串、数字或二进制。Redis提供命令支持常规的字符串操作,如append,range等。当实际类型为数字时,还可对它进行数学运算,如自增自减的原子操作。
123456789# 自增1/自减1set incr_t1 1incr incr_t1decr decr_t1# 增加指定值/减少指定值set incrby_t1 1incrby incrby_t1 5decrby decrby_t1 2
2.2 列表(list)每个节点都包含一个字符串,可以从链表的两端推入或者弹出元素等。
lpush ...
MySQL知识点总结
一、基础概念
数据库和表:一个MySQL实例可能存在许多数据库(database),一个数据库可能存在许多张表(table)。
AUTO_INCREMENT:该关键字是用于修饰表的列的,在每个行添加到数据表中的时候,MySQL可以自动地为每个行分配下一个可用的编号,而不用在添加一行时手动地分配唯一值。
schema:在MySQL中schema可以看作是database的同义词。
DDL, DML, DCL:
DDL:全称data definition language。主要是用于定义或改变表结构,数据类型等。主要命令有:CREATE,ALTER,DROP。
DML:全称data manipulation language。主要用于对数据表记录进行操作。主要命令有:SELECT,UPDATE,INSERT,DELETE。
DCL:全称data control language。主要用于设置或更改数据库用户或角色权限的语句。主要命令有:GRANT,DENY,REVOKE等。
注释:在MySQL中,有三种风格的注释:#(单行注释),-(单行注释, 后面至少需要跟一个空格), /* */( ...
为什么shell脚本的文件名以sh结尾
在Unix和类Unix操作系统中,脚本文件的文件名以.sh结尾是一种约定俗成的做法,但这并非强制性要求。这个约定主要是为了让使用者或开发者在阅读文件列表时能够快速识别出哪些文件是shell脚本。
使用.sh作为文件名后缀有以下几个好处:
易于辨认:当在一个目录中浏览文件时,看到以.sh结尾的文件名,可以立刻知道这些文件是shell脚本,而不是其他类型的文件。
语法高亮:在许多文本编辑器和集成开发环境中,文件后缀能触发相应的语法高亮显示,使代码更易于阅读和编辑。
避免冲突:使用.sh后缀可以避免与其他类型的文件发生冲突。例如,如果脚本没有后缀,可能会与其他脚本或可执行文件同名,导致混淆和错误。
安全性: 以.sh结尾的文件名可以在一定程度上提醒用户要小心处理这些文件,因为它们可能包含系统级别的命令,不当的操作可能会导致意外的结果。
需要强调的是,这只是一种约定,并非强制性的规则。可以创建不以.sh结尾的shell脚本文件,只要确保在文件的开头使用正确的shebang(以#!开头的一行),来指定要使用的shell解释器。例如,如果脚本是用bash编写的,可以在脚本开头加上这样的 ...