自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 支持分表的ORM框架实现

本文带大家实现一个支持分表的ORM框架,通过简单代码实现来理解核心原理惯例贴出GitHub地址:https://github.com/whiteBX/worm首先明确一个我们要实现的效果,然后再考虑实现,下面以user表作为例子:@Table("user_")@SplitKey(column = "id", tableNum = 8)public class UserDO { ...

2019-09-03 20:52:18 668

原创 生成支持分布式部署的唯一id代码实现

在我们工作中,很多场景下都需要生成唯一id,比如订单号、优惠券码等,本篇文章就给大家带来如何用java实现生成唯一id。首先还是按惯例贴出github地址,可直接从github下载源码运行:https://github.com/whiteBX/IDGenerator唯一ID的核心点效率高。id生成器一般作为基础服务,需要有很良好的性能保证,不能让业务感知到明显的延时。支持分布式部署。...

2019-09-03 20:51:37 316

原创 【RPC】一步一步实现基于netty+zookeeper的RPC框架(六)

上一篇实现了服务的限流,本篇来实现服务的熔断。    首先还是贴出github代码地址,想直接看代码的可以直接下载运行:https://github.com/whiteBX/wrpc    在现在的微服务架构下,由于服务众多,调用链路长,很可能其中某个服务有时会出现异常导致服务不可用,例如发布导致bug、机房网...

2019-09-03 20:50:47 266

原创 【RPC】一步一步实现基于netty+zookeeper的RPC框架(五)

上一篇实现了服务的链路追踪,本篇带来限流。关于服务限流,比较流行的是1:令牌桶算法:桶算法的升级版,实现简单,应对热点请求效果更理想。2:动态限流:根据实时的统计当前时间段请求响应时间来动态调整限流数量,实现复杂,但应对各种情况效果更好。这里还是贴出github代码地址,想直接看代码的可以直接下载运行:https://github.com/whiteBX/wrpc本篇带来令牌桶实现限...

2019-09-03 20:50:08 279

原创 【RPC】一步一步实现基于netty+zookeeper的RPC框架(四)

上一篇实现了服务的负载均衡,本篇带来链路追踪。关于链路追踪,大部分都是参考了谷歌的dapper论文:https://bigbully.github.io/Dapper-translation/。    通过论文总结,其中span的核心元素为:traceId,name,spanId,parentSpanId,其他则根据自身业务需要来定义即可。&nbs...

2019-09-03 20:49:31 272

原创 【RPC】一步一步实现基于netty+zookeeper的RPC框架(三)

上一篇写完咱们已经具备服务注册发现/通信/通过接口调用功能了,本篇带来负载均衡策略。RPC框架中,负载均衡策略提供,其实就是根据配置,选择不同的负载策略,常见的有随机/轮询/权重几种负载策略,本篇就带大家来实现它。这里还是贴出github代码地址,想直接看代码的可以直接下载运行:https://github.com/whiteBX/wrpc首先这里主要用到了设计模式中的策略模式,定义一个...

2019-09-03 20:48:39 255

原创 【RPC】一步一步实现基于netty+zookeeper的RPC框架(二)

上一篇实现了服务注册发现和基本的字符串通信功能,这一篇则是实现我们平常使用RPC框架的使用类来调用的功能。实现consumer端通过接口类来调用远程服务,主要核心在于使用动态代理和反射,这里就一步一步来实现。这里贴出github代码地址,想直接看代码的可以直接下载运行:https://github.com/whiteBX/wrpc首先来看consumer端代码,RPCConsumer完整...

2019-09-03 20:47:51 278

原创 【RPC】一步一步实现基于netty+zookeeper的RPC框架(一)

随着分布式架构运用的越来越多,RPC框架成为了我们不得不掌握的知识,这里一步一步来手写一个简单的RPC框架,以博文作为记录及自我监督。首先是技术选型,这边我选用的是当前比较流行的Netty+Zookeeper来实现,通过zookeeper的特性来实现服务注册与发现,通信则使用netty框架。这里贴出github代码地址,想直接看代码的可以直接下载运行:https://github.com/...

2019-09-03 20:46:30 469

原创 【spring】spring boot多数据源配置(方式二)

上篇文章讲述了一种简单粗暴的多数据源配置方式,这篇来讲一下动态切换数据源的方式配置。动态切换数据源,其核心在于一个AbstractRoutingDataSource类,通过继承此类并重写determineCurrentLookupKey方法可以实现动态切换数据源,具体切换方式可点进去看源码的determineTargetDataSource方法,比较简单,这里只记录实现。数据库准备参考上...

2019-09-03 20:45:26 213

原创 你的单例真的写对了吗?能经受住反射的考验吗

在我们日常的用法以及面试过程中,说到写单例,绝大部分都是采用二段锁写的,代码如下:public class Singleton { private volatile static Singleton singleton; /** * 私有构造器 */ private Singleton() { } public static ...

2018-05-01 21:09:22 229

原创 发奖控制数量的几种方式(锁,数据库锁,分布式锁,无锁)

在我们日常编码过程中,做营销类系统时,一定会遇到发奖、秒杀等业务,在这些业务中,奖品数量的控制尤为重要,如果没控制好,多发了奖品,会对运营成本造成超支,或者影响用户体验。本篇就介绍几种数量控制方案,供大家讨论。一:通过锁控制数量最简单直白的方式就是通过java自带的锁来控制数量的发放,伪代码如下: synchronized(this) { int coun...

2018-04-19 22:37:16 798

原创 【设计模式】状态模式

状态模式定义:当一个对象内在状态改变时运行其改变行为,这个对象看起来像改变了其类。    在我们if else超过3层的时候,很多时候我们会想到状态模式,其可以使代码结构看起来更清晰也利于扩展,其核心就是封装性,将状态的改变封装起来,客户端不用关心状态的改变,但是实际内部是有状态的转换的。    首先依旧是假定一个场景:我们平常玩网游的时候都会有杀人系统,这里简化一下,玩家分为白名,黄名,红名玩家

2017-04-10 19:48:15 379

原创 【Spring源码】AOP部分源码解读

在之前的文章【设计模式】动态代理模式和【设计模式】策略模式中都讲到了AOP中有用到,今天就带领大家读读部分源码。    话不多说,我们直接先来看类图,之后再逐步分析:    首先根据类图中的入口,直接来看类ProxyFactoryBean,可以看到类ProxyFactoryBean实现了FactoryBean接口,实现这个接口的方法,我们就直接去看他的getObject方法(关于这点不太清楚的同学

2017-03-13 21:30:34 376

原创 【设计模式】责任链模式

责任链模式是一种很常见的模式,我们平常开发中都会用到它,比如我们常用的Filter,就是一种责任链模式。    依旧举例说明,先来看如下一个例子:假如我们想买车,需要问老婆是否同意,你老婆要是做不了主,就要去问你的妈妈,同样你妈妈也做不了主呢,那么就要去问你的爸爸。这样形成的链路就是责任链,有权处理就直接处理,无权处理则交由下一级处理。下面来看类图:    接下来来看实现:    首先是我们的请求

2017-03-12 17:20:22 447

原创 【Spring源码解读】BeanFactory和FactoryBean区别及类装载源码解读

最近读代码读到Bean装载过程,顺带上网搜了下BeanFactory和FactoryBean,发现好多文章都讲的不清不楚,特此自己来整理了一份BeanFactory和FactoryBean的区别及讲下bean的装载和读取过程的源码.    首先来看下BeanFactory和FactoryBean,借着例子作为入口来进行后面的源码分析.BeanFactory和FactoryBean的定义:publi

2017-03-09 20:23:46 1695 1

原创 【设计模式】策略模式

策略模式是一种很常用的模式,尽管他有一些缺点,但是在我们日常代码中依旧经常用到,另外大家可以看Spring的AopProxy就有用到,今天比较晚了,下次抽时间给大家带来那段源码解析。    首先来看策略模式的定义:定义一组算法,将每个算法都封装 起来,并且使它们之间可以互换。这里依旧举例来说明:假定现有需求,对于用户的各种不同行为增加不同的积分,比如用户登录一次增加5积分,用户注册增加15积分,这

2017-03-07 22:07:43 369 1

原创 【漫谈】跨库事务控制方案

很多时候我们都会接触到跨库事务的问题,本篇就以常说的跨行转账作为例子来提供一种方案,供大家参考。    首先,我们知道跨库的话,数据库层级是做不到事务控制的,只能通过逻辑层实现事务控制,那么本篇文章就给大家提供一种方案:利用中间表实现跨库事务控制。    先大致讲述下方案:新建中间库,在用户调用转账逻辑时,生成唯一凭证,此凭证作为接口幂等依据,入库一条数据,状态为待处理,并通知用户转账请求已提交

2017-03-05 22:24:01 2554

原创 【并发编程】当我们谈论线程安全时我们在谈论什么

线程安全是一个老生长谈的话题,做开发的人人都会碰到且谈论这个话题,今天就来从内存角度上深入剖析一下什么是线程安全。       首先,我们知道jvm内存总体来讲分为:栈、堆、程序计数器、方法区。其中又分为线程私有(每个线程单独维护)和线程共享的区域,线程私有区域不会涉及多线程间通信和同步问题,所以线程安全肯定是出现在线程共享区域的。       接下来提出一个问题,上述4个内存区域中,哪些是线程私

2017-03-04 13:38:06 2266 3

原创 【设计模式】动态代理模式

上篇讲述了普通代理模式,今天来讲讲动态代理.说起动态代理,大家可能首先想到的就是Spring的AOP.我们天天在说AOP是通过动态代理实现的,那么动态代理到底是个什么呢?看完这篇文章你就会明白,同时也明白AOP到底是哪里用到了动态代理.    首先,我们来看动态代理的定义:动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象的一种特殊代理模式。    接下来还是通过实例来学习吧,假

2017-03-03 16:53:15 812

原创 【设计模式】代理模式

代理模式是一个使用率非常高的模式,其定义为:为其他对象提供一种代理以控制对这个对象的访问.    这里举一个日常生活中我们都会碰到过的例子,比如我们在玩网游时,不想自己去重复的打怪升级,只想安安心心跟人PK娱乐,但是不升级又跟不上大众的步伐,这时怎么办呢?游戏代练这个行业就由此而生,我们可以把账号交给代练,由他们帮我们打怪升级,等升级完后,我们再拿账号玩别的.这里的游戏代练过程就相当于对于玩家玩游

2017-03-02 16:17:53 371

原创 【设计模式】建造者模式详解

建造者模式也叫生成器模式,具有封装性、易扩展等优势,其定义为:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。    假定我们现在接到一个需求,要造出一辆奔驰,那么我们可以做如下设计:    首先,本着抽象原则,我们肯定是会先定义一个接口Car,里面包含了车子都会有的部件,如下:public abstract class Car { /** 引擎 */ p

2017-03-01 21:59:24 325

原创 【GC算法】jvm垃圾收集算法详解

GC算法是作为一个java程序猿所必须了解的东西,不仅在日常生活中有助于我们更深入的理解代码,也是在面试中必定会考的东西。一:标记-清除算法    标记-清除算法作为最基础的收集算法,其分为“标记”与“清除”两个阶段,当触发GC时,jvm会暂停所有工作,第一阶段阶段会通过标记算法标记出所有需回收的对象,在之后的第二阶段回收所有被标记的对象。    市场上主流的标记算法都是可达性分析算法。这个算法的

2017-02-28 20:46:46 487

原创 【并发编程】ReentrantLock使用介绍

Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。java 5.0增加了一种新的机制:ReentrantLock,用以当内置枷锁机制不适用时,作为一种可选择的高级功能。       Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,下面来看Lock接口提供了哪些方法:public interface Lock {

2017-02-21 21:17:01 367

原创 【并发编程】concurrent包的Condition使用详解

最近使用Condition时有一些疑惑,于是自己做了几个实验,了解了Condition的具体用法,现记录如下。       首先我们直接来看一段之前网上看到的一个输出1-9的例子,当然网上那个例子是有缺陷的,并不能保证每次都能输出1-9,后面会介绍原因,先看如下代码:public class ConditionTest { public static void main(String[] a

2017-02-20 22:45:33 1373

原创 String类的intern方法随笔

最近看书看到了String的intern()方法,特此记录以下首先,来看源码中的定义:/** * When the intern method is invoked, if the pool already contains a * string equal to this {@code String} object as determined by * the {@link #equals

2017-01-15 22:52:08 617 2

原创 【JAVA数据结构】先进先出队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。下面直接来看实现:/** * <p>先进先出队列</p> * * @author white * @version $Id: MyQueen, v 0.1 2016/9/21 00

2016-09-21 22:11:00 6261

原创 【JAVA数据结构】双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点下面直接来看实现:/** * <p>双向链表实现(先进后出)</p> * @author white * @version $Id: MyLinkedList, v 0.1 2016/9/21 0021 下午 8:32 w

2016-09-21 22:07:29 360

原创 【JAVA数据结构】栈(数组实现)

栈是一种先进后出的数据结构套用现成的术语来讲:是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。下面直接来看实现:/** * <p>基于数组的栈表实现<

2016-09-21 22:00:25 346

原创 堆排序原理(图)及java版代码

数据结构中的堆可看做完全二叉树结构,其特性是任意一父节点的值分别大于或小于其左右子节点的值(大根堆和小根堆)完全二叉树一般采用数组结构来表示,根据完全二叉树特性任意一父节点的值都大于(或小于)其子节点的值可知其第一个节点的值为树中的最大(最小)值,则每次将第一个父节点的值放到数组最后则可以实现排序。首先来看一个图例: 点击查看大图图中详细描述了如何将一组数构建成一个完全二叉树以及通过二叉树来排序

2016-09-15 15:42:04 720

原创 [swift实战入门]手把手教你编写2048(三)

上篇地址:swift实战入门之手把手教你编写2048(二) github地址:https://github.com/scarlettbai/2048.git。今天给大家带来2048最后一篇,之前已经实现了向游戏区域中随机插入数字块,接下来要做的,就是当我们滑动屏幕时移动及合并数字块以及插入一个新的数字块。本篇的难点就是移动时的算法问题,首先来给大家讲一下算法。 2048的算法实现其实很简单

2016-04-24 21:25:55 5616 2

原创 Java 爬虫入门(网易云音乐和知乎实例)

最近公司赶项目,过上了996的生活,周日还要陪老婆,实在没时间静下来写点东西,于是导致了swift编写2048的第三篇迟迟没有开工,在此说声抱歉,尽量抽时间在这周末补出来。首先来介绍下爬虫的作用,爬虫主要用于大批量抓取网站中我们所需数据,其实就是模拟出http请求,之后解析分析所得的数据获取我们需要的信息的这么一个过程。 由于网上已经有很多现成的爬虫框架了,这里就不重复造轮子了,先给大家说一下原

2016-04-20 20:33:27 12285 3

原创 [swift实战入门]手把手教你编写2048(二)

上篇地址:swift实战入门之手把手教你编写2048(一) github地址:https://github.com/scarlettbai/2048.git。上篇文章已经中已经把2048的游戏区块画好了,这篇来加入计分板以及往游戏面板中插入数字块 计分板同样作为一个view,我们新建一个ScoreView.swift文件,代码如下: import UIKit//这里协议的作用是方便别的

2016-04-10 23:23:27 4755 4

原创 [swift实战入门]手把手教你编写2048(一)

苹果设备越来越普及,拿着个手机就想捣鼓点啥,于是乎就有了这个系列,会一步一步教大家学习swift编程,学会自己做一个自己的app,github地址:https://github.com/scarlettbai/2048.git。这篇文章需要大家了解一些swift基本语法,这里注重实践,就不讲太多基本语法了,不懂的大家可以Google一下,swift开发环境也很简单,直接在mac上安装一个XCode

2016-04-09 23:17:50 9612 2

原创 Java NIO源码剖析及使用实例(一):Buffer

现在越来越多的公司开始使用NIO,面试中也经常被问到NIO的知识,这里给大家介绍下,包括基本使用方法以及一些实现原理等,因为NIO知识较多,会分多篇介绍。首先来说NIO是做什么的,Java中NIO大家可以理解为new io,即新出的一个处理io流的包,它最重要的几个特性就是Channel(管道)、Buffer(缓冲区)、Selector(选择器)。相较与IO,NIO新增了缓冲区以及非阻塞读取等特效

2016-04-08 18:05:07 669

原创 Java多线程之synchronized及死锁编写

java中锁很常见,尤其是在多线程的情况下,我们会经常使用到锁。面试中我们也会经常被问到如何编写一个死锁。java提供synchronized关键字来提供锁机制,在多线程中为了使程序并行我们会常使用到锁,synchronized就是其中最简单的实现方式,首先我们来看一下synchronized最基本的用法: 首先我们新建Person类,其中包含如下代码:public class Person {

2016-04-03 19:44:03 3935

原创 Java8 Lambda表达式介绍

欢迎进入我的博客:blog.scarlettbai.com查看更多文章Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍。Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲

2016-04-02 00:09:37 3465

原创 Java生成随机不重复推广码邀请码

欢迎进入我的博客:blog.scarlettbai.com查看更多文章最近接到一个需求,要批量生成推广码,首先我们知道推广码的特效有如下两点: 1:不可重复 2:不可以被推测出关于这两点,我们的思路大体分为如下几类: 1:每次生成一个随机码后查数据库是否有相同的,有则重新生成(每次都要访问数据库,导致效率极低,不推荐)2:依据数据库的主键作为唯一键,进行打乱或插入操作,如主键为8000001

2016-04-02 00:03:27 46848 24

原创 Https加密及攻防

欢迎进入我的博客:blog.scarlettbai.com查看更多文章    最近公司用到了Https,出于好奇,研究了下Https加密过程,现在记录下。    众所周知,Http协议传输数据都是未加密的,因此非常不安全。于是网景公司设计了SSL协议用于对Http传输的内容进行加密,以达到更安全的信息交互效果,首先我们看一张图: 由图中可以看到,TLS/SSL是工作在TCP协议之上的,应用层不再

2016-04-01 23:54:24 1031

原创 java接口不能实例化原因浅谈

java的接口为什么不能实例化呢,图中可以看到,栈中存放的是per,值是堆中具体Person这个对象的地址,也就是per指向这个具体类的引用。而堆中一块地址,存放的值是Person这个类的成员变量(局部变量在执行时存放在栈中)。java的内存空间分为四类:栈(stack)、堆(heap)、代码(code)、静态数据(data)。

2015-01-09 20:43:33 16575 6

原创 补充另一版ArrayList的初始化过程

之前写过一篇关于集合的初始化容量的问题,当时提到

2014-07-19 21:19:21 815

空空如也

空空如也

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

TA关注的人

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