5 happyJared

尚未进行身份认证

我要认证

保持勤學習的心,做好寫代碼這事

等级
TA的排名 3w+

习惯用三元运算符?那你需要知道这个坑

最近碰到个非常有意思的坑,先来看段代码: Test test = new Test(); Integer age = Objects.nonNull(test) ? test.getAge() : 18; System.out.println("age = " + age);猜猜运行后会输出什么?是 null 吗?不对,是 jav...

2020-03-01 18:17:33

API 网关的设计:异步化请求

对于内部系统使用的网关层,如果对于吞吐量的要求并不高,一般同步请求调用即可。对于统一的网关层,如何用少量的机器接入更多的服务,这就需要用异步来实现,用来提高更多的吞吐量。对于异步化,一般有以下两种策略:Tomcat/Jetty + NIO + Servlet3这种策略使用的比较普遍,京东、有赞、Zuul,选取的都是这个策略,这种策略比较使用于 HTTP 的场景,在 Ser...

2019-12-09 09:00:28

为什么要统一 API 网关

统一的 API 网关不仅有 API 网关的所有特点,还有以下几个好处:统一组件升级在公司内部,如果有某个技术组件需要升级,通常是需要和每个业务线沟通,有可能是几个月都搞不定。举个例子,如果对于入口的鉴权有重大的安全隐患需要升级,沟通效率这么低肯定是不行,而有了统一的网关,修复问题也是非常快的。统一服务接入通常来说,对于某个服务的接入是比较困难的,比如公司已经研发出了...

2019-12-08 10:57:15

API 网关

API 网关可以看做是系统与外界联通的入口,我们可以在网关处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等。那为什么需要 API 网关呢?它有以下几个好点:RPC 协议转成 HTTP在内部开发中,通常都是以 RPC 协议去做开发,然后暴露给内部服务,当外部服务需要使用这个接口的时候,往往就需要将 RPC 协议转换成 HTTP 协议。请求路由在某些系...

2019-12-07 14:33:31

布隆过滤器之 Redis

Redis v4.0 之后有了 Module(模块/插件) 功能,Redis Modules 让 Redis 可以使用外部模块扩展其功能,布隆过滤器就是其中的 Module,详情可以查看 Redis 官方对 Redis Modules 的介绍 :https://redis.io/modules。另外,官网推荐了 RedisBloom 作为 Redis 布隆过滤器的 Module,...

2019-12-06 08:54:45

布隆过滤器之 Guava 实现

首先,在项目中引入 Guava 的依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28...

2019-12-05 07:46:24

布隆过滤器原理

当一个元素加入布隆过滤器中的时候,会进行如下操作:使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值);根据得到的哈希值,在位数组中把对应下标的值置为 1。当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行如下操作:对给定元素再次进行相同的哈希计算;得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在...

2019-12-03 07:38:42

布隆过滤器

首先,先来了解布隆过滤器的概念。布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的...

2019-12-02 07:35:53

数据库 ID 生成方案:Redis

使用 Redis 来生成分布式 ID,其实和利用 Mysql 自增 ID 类似,可以利用 Redis 中的 incr 命令来实现原子性的自增与返回,比如:127.0.0.1:6379> set id 1 // 初始化自增 ID 为1OK127.0.0.1:6379> incr id // 增加1,并返回(integer) 2127.0.0.1:6379...

2019-12-01 08:58:28

数据库 ID 生成方案:美团 Leaf

在美团早期,有的业务直接通过 DB 自增的方式生成 ID,有的业务通过 Redis 缓存来生成 ID,也有的业务直接用 UUID 这种方式来生成 ID。以上的方式各自有各自的问题,因此美团实现了一套分布式 ID 生成服务来满足需求。具体 Leaf 设计文档见: Leaf 美团分布式 ID 生成服务美团的 Leaf 也是一个分布式 ID 生成框架。它非常全面,即支持号段模式,也...

2019-11-30 07:54:56

数据库 ID 生成方案:百度 UidGenerator

UidGenerator 是用 Java 语言实现的基于 Snowflake 算法的唯一 ID 生成器。UidGenerator 是以组件形式工作在应用项目中, 支持自定义 workerId 位数和初始化策略, 从而适用于 Docker 等虚拟化环境下实例自动重启、漂移等场景。在实现上,UidGenerator 通过借用未来时间来解决 Sequence 天然存在的并发限制;采用 ...

2019-11-29 13:43:56

数据库 ID 生成方案:雪花算法

上面的三种方法总的来说是基于自增思想的,而接下来就介绍比较著名的雪花算法-snowflake。我们可以换个角度来对分布式ID进行思考,只要能让负责生成分布式ID的每台机器在每毫秒内生成不一样的ID就行了。snowflake是twitter开源的分布式ID生成算法,是一种算法,所以它和上面的三种生成分布式ID机制不太一样,它不依赖数据库。核心思想是:分布式ID固定是一个long...

2019-11-28 10:37:36

数据库 ID 生成方案:号段模式

还可以使用号段的方式来获取自增 ID,号段可以理解成批量获取。比如从数据库获取 ID 时,就可以批量获取多个 ID 并缓存在本地,提升效率。比如每次从数据库获取 ID 时,就获取一个号段,如 (1,1000],这个范围表示1000个 ID,业务应用在请求提供 ID 时,只需要在本地从1开始自增并返回,而不需要每次都取请求数据库,一直到本地自增到1000时,也就是当前号段已经用完...

2019-11-27 11:48:30

数据库 ID 生成方案:数据库多主模式

将两个数据库组成主从模式的集群,正常情况下,是可以解决数据库的可靠性问题,但如果主库挂掉后,数据没有及时同步到从库,这个时候就会出现 ID 重复的问题。可以使用双主模式集群,也就是两个实例都能单独的生产自增ID,这样能够提高效率,不过就需要单独给每个数据库实例配置不同的起始值和自增步长。第一台 MySQL 实例配置:set @@auto_increment_offset = ...

2019-11-26 07:34:50

数据库 ID 生成方案:数据库自增

创建一个数据库实例,在这个实例中新建一个单独的表:表结构如下:CREATE DATABASE `Test`;CREATE TABLE Test.test01 ( id bigint(20) unsigned NOT NULL auto_increment, phone char(11) NOT NULL default '', PRIMARY KE...

2019-11-25 22:44:31

Maven 生命周期

Maven 有三套且相互独立的生命周期,这三套生命周期分别是:① Clean Lifecycle 在进行真正的构建之前进行一些清理工作。Clean 生命周期一共包含了三个阶段:pre-clean 执行一些需要在 clean 之前完成的工作clean 移除所有上一次构建生成的文件post-clean 执行一些需要在 clean 之后立刻完成的工作② Default Li...

2019-11-24 10:23:24

Maven 依赖

① Maven 解析依赖信息时,首先会到本地仓库中查找依赖的 Jar 包对于本地仓库中没有的依赖,就会去中央仓库查找,通过 Maven 坐标来获取 jar 包,获取到后会先下载到本地仓库对于中央仓库中不存在的依赖包,就会显示编译失败② 如果依赖的是自己或者团队开发的 Maven 工程,需要先使用 install 命令把被依赖的 maven 工程的 jar 包安装到本地仓库...

2019-11-23 14:53:00

Maven 仓库和坐标

① pom.xml:Project Object Model 项目对象模型。它是maven的核心配置文件,所有的构建的配置都在这里设置。② 坐标:使用下面的三个向量在仓库中唯一的定位一个maven工程image③ maven工程的坐标与仓库中路径的关系:imagemaven坐标和仓库对应的映射关系:[groupId][artifactId][ver...

2019-11-22 12:38:46

Maven 安装

① 当前系统需要先配置 JAVA_HOME 的环境变量;② 到官网下载 Maven,解压 Maven 即可,建议放到非中文无空格的路径下;③ 配置 Maven 的相关环境变量;在环境变量增加 M2_HOME,路径是 Maven 解压后的根目录在环境变量里的 Path 中增加 maven/bin 的目录④ 验证:mvn -v 查看 Maven 版本,看到版本信息,这时已...

2019-11-21 07:31:11

Maven 优势

① 一个项目就是一个工程如果项目非常庞大,就不适合使用 package 来划分模块,最好是每个模块对应一个工程,利于分工协作,而借助于 maven 就可以将项目拆分成多个工程② 项目中使用 jar 包,需要重复复制和粘贴同样的 Jar 包可能会重复的出现在不同的项目工程中,需要做重复的复制粘贴的工作。借助于 maven,可以将 jar 包保存在本地仓库中,不管在哪个项目,只要...

2019-11-20 07:35:44

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。