自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

happyJared

做好寫代碼這事

  • 博客(322)
  • 收藏
  • 关注

原创 @EventListener VS @TransactionalEventListener

EventListenerTransactionalEventListenerTransactionPhase

2021-05-08 15:58:30 1022

原创 Json 扁平化对象 @JsonUnwrapped

@Datapublic class Account { @JsonUnwrapped private Location location; @JsonUnwrapped private PersonInfo personInfo; @Data public static class Location { private Stri...

2021-03-01 19:46:51 1011

原创 过滤 Json 数据

@JsonIgnoreProperties:作用在类上// 生成 json 时将 userRoles 属性过滤@JsonIgnoreProperties({"userRoles"})public class User { private String userName; private String fullName; private String password;...

2021-03-01 19:43:35 1241

原创 git clone 加速

image.png将 github.com 换为 github.com.cnpmjs.org

2021-01-29 16:12:10 167

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

最近碰到个非常有意思的坑,先来看段代码: 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 416

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

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

2019-12-09 09:00:28 921

原创 为什么要统一 API 网关

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

2019-12-08 10:57:15 2060

原创 API 网关

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

2019-12-07 14:33:31 133

原创 布隆过滤器之 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 152

原创 布隆过滤器之 Guava 实现

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

2019-12-05 07:46:24 456

原创 布隆过滤器使用场景

判断给定数据是否存在:比如判断一个数字是否在包含大量数字的数字集中、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单功能等等;去重:比如爬给定网址的时候对已经爬取过的 URL 去重。下面,我们再来看看如果想要手动实现一个的话,那么需要以下几步:合适大小的位数组保存数据几个不同的哈希函数添加元素到位数组(布隆过滤器)的...

2019-12-04 08:20:15 138

原创 布隆过滤器原理

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

2019-12-03 07:38:42 133

原创 布隆过滤器

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

2019-12-02 07:35:53 150

原创 数据库 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 364

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

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

2019-11-30 07:54:56 359

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

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

2019-11-29 13:43:56 863

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

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

2019-11-28 10:37:36 3103

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

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

2019-11-27 11:48:30 2264 2

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

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

2019-11-26 07:34:50 304

原创 数据库 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 1511

原创 Maven 生命周期

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

2019-11-24 10:23:24 125

原创 Maven 依赖

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

2019-11-23 14:53:00 134

原创 Maven 仓库和坐标

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

2019-11-22 12:38:46 560

原创 Maven 安装

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

2019-11-21 07:31:11 82

原创 Maven 优势

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

2019-11-20 07:35:44 245

原创 Maven 简述

Maven 是服务于 Java 平台的自动化构建工具,从工具的发展历程来看,经历过 Ant 到 Maven 再到 Gradle构建:一般的定义是把动态的 Web 工程编译,再把编译的工程部署到服务器上编译:java 源文件[.java] -> 编译 -> Clazz字节码文件[.class]部署:最终在 Sevlet 容器中部署的不是动态 web 工程,而是编译后...

2019-11-19 22:52:51 249

原创 Docker 删除镜像

通过标签删除镜像通过如下两个都可以删除镜像:docker rmi [image]或者:docker image rm [image]支持的子命令如下:-f , -force:强制删除镜像,即便有容器引用该镜像;-no-prune:不要删除未带标签的父镜像;docker images例如,删除 allen_mysql:5.7 镜像,命令如下:...

2019-11-18 23:53:47 158

原创 Docker 镜像历史

我们知道,一个镜像是由多个层(layer)组成的,那么,要如何查看各个层的具体内容呢?通过 docker history 命令,可以列出各个层(layer)的创建信息,如查看 redis 的各层信息:docker history redisdocker history redis如果想要看具体信息,可以通过添加 --no-trunc 选项,如下面命令:doc...

2019-11-18 08:41:56 1274

原创 Docker 搜索镜像

search 命令通过 search 命令进行搜索:docker search [option] keyword比如,搜索仓库中 mysql 相关的镜像,可以输入如下命令:docker search mysqldocker search mysqlsearch 子命令命令行输入 docker search --help, 输出如下:dock...

2019-11-17 19:47:24 3019

原创 Docker 镜像详情

借助 docker inspect 命令,我们可以获取镜像的详细信息,包括镜像 Id、创建时间、State、HostConfig、Config 等,如查看 redis :docker inspect redisDocker inspect 查看镜像详细信息从上图可以看到,docker inspect 返回的是 JSON 格式的信息,如果想要获取其中指定一项的内容...

2019-11-17 10:16:06 280

原创 Docker 添加标签

可以使用 docker tag 命令,为本地镜像添加新的标签,如下图所示:Docker tag 添加标签这里是为 mongo:4.1.6 镜像,添加新的镜像标签 mymongo,可以看到,本地多了一个 mymongo:latest 的镜像。事实上, mongo:4.1.6 和 mymongo:latest 的镜像 ID 是一模一样的,说明它们是同一个镜像,只是别名...

2019-11-16 08:56:21 3084

原创 Docker 查看镜像

首先,可使用如下两个命令,列出当前已有的镜像:docker images或:docker image ls如下图所示:Docker 查看镜像信息REPOSITORY: 来自于哪个仓库;TAG: 镜像的标签信息,比如 5.7、latest 表示不同的版本信息;IMAGE ID: 镜像的 ID, 如果看到两个 ID 完全相同,那么实际上,它们指向...

2019-11-15 08:06:33 1026

原创 Docker 下载镜像

要运行容器,就必须保证本地存在对应的镜像。所以,第一步是需要下载镜像。当尝试下载镜像时,Docker 会尝试先从默认的镜像仓库(默认使用 Docker Hub 公共仓库)去下载,此外,用户也可以自定义配置想要下载的镜像仓库。镜像是运行容器的前提,可以使用 docker pull [IMAGE_NAME]:[TAG] 命令来下载镜像,其中 IMAGE_NAME 表示的是镜像名称,而...

2019-11-14 22:51:27 541

原创 Docker Build Ship and Run

在 Docker 官网,挂着如下的字样:Docker - Build, Ship, and Run Any App, Anywhere。那么 Build, Ship, and Run 到底是做了什么呢?Build Ship and RunBuild(构建镜像) : 镜像就像是集装箱,包含文件以及运行环境等等资源;Ship(运输镜像) :在宿主机和仓库间进行运输,...

2019-11-13 10:04:44 1552

原创 Docker 命令

基本命令docker version # 查看docker版本docker images # 查看所有已下载镜像,等价于:docker image ls 命令docker container ls # 查看所有容器docker ps # 查看正在运行的容器docker image prune # 清理临时的、没有被使用的镜像文件。-a, --all: 删除所有没有用的...

2019-11-12 07:52:05 73

原创 Docker 仓库

仓库(Repository) : 集中存放镜像文件的地方镜像构建完成之后,就可以在当前宿主机上运行,但如果需要在其它服务器上使用这个镜像,就需要一个集中存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像 (Image)。...

2019-11-11 08:31:03 155

原创 Docker 容器

容器(Container) : 镜像运行时的实体镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等 。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于独立的命名空间。上一篇文章提到镜像使用的是分层存储,而容器也是如此。容器存储层的...

2019-11-10 07:15:31 82

原创 Docker 镜像

Docker 包括三个基本概念:镜像(Image)容器(Container)仓库(Repository)理解了这三个概念,可以说就理解了 Docker 的整个生命周期。Docker 三个基本概念镜像(Image) : 一个特殊的文件系统众所周知,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支...

2019-11-09 08:14:01 135

原创 Docker 容器与虚拟机

容器是一个应用层抽象,用于将代码和依赖资源打包在一起,多个容器可以在同一台机器上运行,共享操作系统的内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十M),瞬间就能完成启动 。虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个 VM 在一台机器上运行,每个 VM 都包含一整套操作系统...

2019-11-08 07:25:23 121

原创 Docker 优势

一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境的一致性;快速的启动时间:可以做到秒级、甚至毫秒级的启动时间,大大的节约了开发、测试、部署的时间;隔离性:避免同一服务器上的其它服务资源会影响当前服务;弹性伸缩,快速扩展:可以根据服务运行压力方便的进行扩容;迁移方便:能够轻易的将当前平台上运行的应用,迁移到另一个平台上,而不用担心运行环...

2019-11-07 07:18:21 94

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除