自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dubbo序列化源码分析3-MessagePack协议

JSON格式:{"age":23,"cache":{"test2":"qunge2","test1":"qunge1","test3":"qunge3"},"dataList":["tiancai1","tiancai2","tiancai3"],"id":11,"name":"changqun"}messagepack格式: :��changqun��tiancai1�tiancai2�ti...

2020-08-14 21:25:23 314

原创 dubbo序列化源码分析2-深入JDK,hessian序列化

JDK序列化实现Serializable接口被序列化的Object中的 Object属性必须实现 Serializable接口,否则报异常, 基本类型默认可以序列化。static 和transient关键字修饰的变量不会被实例化父类A没有实现Serializable 接口,子类B实现了Serializable 接口, A a=new B() 此时a可以序列化A a=new A() 此时 a不可以序列化,也就是 被序列化的是指向的是实现了 Serializable 接口的实例才可以。.

2020-08-14 21:21:39 445

原创 dubbo序列化源码分析1-序列化接口设计

分析 dubbo 序列化实现选中几个协议分析 源码 必选FastJson, jdk hessian2, msgpack 主流 序列化协议性能对比先找个简单的分析FastJsonSerializationdubbo FastJson序列化public class FastJsonSerialization implements Serialization { @Override public byte getContentTypeId() { //获取协议ID...

2020-08-14 20:34:31 331

原创 dubbo序列化源码分析0-jdk,hessian序列化性能测试

序列化长度对比数据内容:{"cache":{"test2":"qunge2","test1":"qunge1","test3":"qunge3"},"dataList":["tiancai1","tiancai2","tiancai3"],"id":256,"name":"hessian"}jdk serialize result length = 387hessian1 serialize result length = 194hessian2 serialize result lengt.

2020-08-14 20:28:11 258

原创 dubbo源码分析12-server代理创建和执行bind

之前 分析 consumer代理创建和发送请求的时候,进行了简单的分层,实际上并不准确, 本文将根据 dubbo开发文档中的分层进行分析,下面列出整体设计图例说明:图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。图中绿色小块的为扩展接口,蓝色小

2020-08-14 20:14:48 211

原创 dubbo源码分析10-zookeeper注册中心

zookeeper注册中心 中比较重要的内容 父子类继承, 失败重试机制, 注册和订阅实现。下面逐个分析。父子类分析RegistryService:定义了注册,取消注册,订阅,取消订阅方法Registry:未定义方法AbstractRegistry:配置持久化功能。调用listenner。FailbackRegistry: subscribe,notify模板类, 提供 容错,独立线程失败重试,校验。ZookeeperRegistry:具体的注册订阅实现,依赖 Zookeeper...

2020-08-14 20:02:35 237

原创 dubbo源码分析9-心跳机制

服务端心跳机制分析启动心跳检测 public HeaderExchangeServer(Server server) { if (server == null) { throw new IllegalArgumentException("server == null"); } this.server = server; this.heartbeat = server.getUrl().getParameter(...

2020-08-14 19:57:20 671

原创 dubbo源码分析8-动态代理原理

javassist动态代理分析dubbo Javassist创建代理方法JavassistProxyFactory(AbstractProxyFactory).getProxy(Invoker<T>)public <T> T getProxy(Invoker<T> invoker) throws RpcException {Class<?>[] interfaces = null;String config = invoker.getUrl

2020-08-14 19:53:02 629

原创 netty源码分析2-3-server启动-动态分析

分享内容如下client请求连接后,sever端的处理 网络标识位的变化 子Reactor启动1.client请求连接后,sever端的处理client连接时创建NioSocketChannel,触发DefaultChannelPipeline.read()AbstractNioMessageChannel$NioMessageUnsafe.read()@Overridepublic void read() {for (;;) {//创建int l...

2020-08-03 16:40:52 232

原创 redis5.0源码浅析5-跳跃表skiplist

1.skiplist介绍定义:跳跃表是一个有序链表,其中每个节点包含不定数量的链接,节点中的第i个链接构成的单向链表跳过含有少于i个链接的节点。 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,大部分情况下,跳跃表的效率可以和平衡树相媲美。 跳跃表在redis中当数据较多时作为有序集合键的实现方式之一。接下来,还是举个有序集合键的例子:有序集合键详解127.0.0.1:6379> ZADD score 95.5 Mike 98 Li 96 Wang //socre是一个有序集

2020-06-22 18:11:51 196

原创 JUC源码分析-容器-ConcurrentHashMap

概述HashMap是线程不安全的map, ConcurrentHashMap 是线程安全的map,并能适应高并发的场景。核心属性和数据结构final int segmentMask;final int segmentShift;key生成的hash值 位移segmentShift 并与上segmentMask 就是 这个key的Segment在segments数组中的索引位置。...

2020-03-16 18:33:35 167

原创 JUC源码分析-容器-ConcurrentSkipListMap和ConcurrentSkipListSet

概述ConcurrentSkipListMap:线程安全的有序Map,TreeMap是线程不安全的有序Map. 数据使用表单项链表存储,它借助一种跳表(Skip Lisy)的数据结构,可简单理解为 附加的索引,后面有详细分析。ConcurrentSkipListSet:借助ConcurrentSkipListMap 实现的线程安全的有序Set,它们俩的关系就像 TreeMap 和TreeS...

2020-03-16 12:09:53 268

原创 JUC源码分析-容器-ConcurrentLinkedQueue

ConcurrentLinkedQueue 是单向链表结构的无界并发队列。从JDK1.7开始加入到J.U.C的行列中。使用CAS实现并发安全,元素操作按照 FIFO (first-in-first-out 先入先出) 的顺序。适合“单生产,多消费”的场景。内存一致性遵循对ConcurrentLinkedQueue的插入操作先行发生于(happen-before)访问或移除操作。、??...

2020-03-11 20:40:28 200

原创 JUC源码分析-容器-SynchronousQueue

SynchronousQueue无界队列, TransferStack从head 前面插入节点,TransferQueue从tail后写入节点公平和非公平只是 FIFO 和LIFO的区别?源码中实现了一种队列结构的算法队列中有两个角色 传递者和接受者, 传递者之间排队,接受者之间排队,默认第一个入队的节点是接受者,后面入队的节点的模式与这个节点相同的为接受者,不同的为传...

2020-03-07 19:08:42 154

原创 JUC源码分析-辅助类-Phaser

概述Phaser 是一个同步辅助类,与CyclicBarrier和CountDownLatch功能相似,用于栅栏条件的相互等待,支持更丰富的用法, 可以将一个的程序的等待分为多个阶段。主状态分为 4部分,1~15位 未到达者数,16~31位参与数 parties,32~62 阶段值 phase 63位 结束标识, 64位正负标识private volatile long state;...

2020-03-03 10:50:58 191

原创 JUC源码分析-辅助类-CountDownLatch,Semaphore,CyclicBarrier,Exchanger

本文分析并发辅助类 CountDownLatch,Semaphore,CyclicBarrier,ExchangerCountDownLatch同步辅助类 实现一个线程 等待其他1~N个线程执行完成,再继续执行其他代码。构造方法跟踪构造方法 依赖一个 内部类,这个内部类Sync 继承了AbstractQueuedSynchronizerpublic CountDownLatch...

2020-03-02 16:39:42 165

原创 JUC源码分析-Reetrantlock-Condition

Condition是Reerantlock 实现了 wait- notify 模式的类synchronized锁 wait- notify 模式 实现的 是 Object.wait(),Object.notify()。so 重入锁 Reerantlock 也要有wait- notify 模式 的实现,他就是 ConditionCondition在ArrayBlockingQueue和 ...

2020-03-01 15:38:35 208

原创 JUC源码分析-ScheduledThreadPoolExecutor

概述ScheduledThreadPoolExecutor 预定任务线程池,用于执行延迟和周期性任务。核心属性和数据结构//是否应该废弃周期任务 当关闭时private volatile boolean continueExistingPeriodicTasksAfterShutdown;//是否应该取消非周期任务 当关闭时private volatile bo...

2020-02-25 15:13:48 168

原创 JUC源码分析-容器-PriorityBlockingQueue

概述PriorityBlockingQueue:二叉堆结构优先级阻塞队列,FIFO,通过显式的lock锁保证线程安全,是一个线程安全的BlockingQueue,加入队列的数据实例按照指定优先级升序排列,这个规则通过赋值 实现了Comparator的字段或数据实例类实现Comparable接口自定义,都定义的情况下 字段比较器优先。它一个老牌的队列,在JDK1.5已经加入,如果队列加入的数据实...

2020-02-25 15:00:41 135

原创 JUC源码分析-读写锁-ReentrantReadWriteLock

概述ReentrantReadWriteLock 有2个锁,读锁和写锁。读读不加锁,读写,写读,写写都加锁。读锁是共享锁,写锁是排他锁。 读锁和写锁的状态值被保存在int的值中,前16位表示 共享读锁状态值,后16位表示排他写锁状态值。数据结构和核心参数分析一下有关的属性static final int SHARED_SHIFT = 16;//共享锁占据16位static ...

2020-02-25 14:47:41 185

原创 JUC源码分析-ThreadPool-jdk7

ThreadPool源码分析-jdk7jdk7 并发包中的线程代码被重写。线程池中原来代表线程数的poolSize 和代表状态的state被合并到ctl中int类型共有32位,ctl的高三位用来表示状态,剩下的28位用来表示工作线程数private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0))...

2020-01-23 12:05:05 167

原创 JUC源码分析-ThreadPool-jdk6

ThreadPool源码分析-jdk6execute方法分析public void execute(Runnable command) {if (command == null)throw new NullPointerException();//poolSize初始值为0,先启动corePoolSize数量的线程执行if (poolSize >= corePoolS...

2020-01-23 12:00:53 209

原创 JUC源码分析-容器-LinkedBlockingQueue和ArrayBlockingQueue

BlockingQueue先进先出,出队列即移除。可用来实现消费者模式BlockingQueue的核心方法:放入数据:  offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.(本方法不阻塞当前执行方法的线程)  offer(E o, long t...

2020-01-23 11:32:51 186

原创 JUC源码分析-容器-List和set

CopyOnWriteArrayList写加锁 ,读不加锁。CopyOnWrite 读写分离的思想, 修改的时候copy出一个副本,读还是使用原内存,修改期间不影响读,当修改完成,副本替换原来的内存。适用于读多写少的场景。聊聊并发-Java中的Copy-On-Write容器:http://ifeve.com/java-copy-on-write/适用场景:白名单,黑名单,商品类...

2020-01-23 11:00:34 125

原创 JUC源码分析-容器-简介

list和setCopyOnWriteArrayList:相当于线程安全的ArrayList,通过显式锁 ReentrantLock 实现线程安全。允许存储null值。CopyOnWriteArraySet:相当于线程安全的HashSet,内部使用 CopyOnWriteArrayList 实现。允许存储null值。MapConcurrentHashMap:线程安全的HashMap...

2020-01-23 10:57:53 290

原创 JUC源码分析-FutureTask,CompletionService

FutureTask的几个关联方法<T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); <T> Future<T> submit(Runnable task); void execu...

2020-01-22 18:53:24 190

原创 JUC源码分析-AQS

AbstractQueuedSynchronizer分析AQS独占锁方法分析互斥模式也可以称为独占模式,独占锁是互斥模式的实现(互斥模式的代码 在公平锁和非公平锁有讲解,这里不再详述)//互斥模式获取锁的模板方法, tryAcquire 尝试通过CAS方式获取锁,由子类实现。public final void acquire(int arg) {if (!tryAcquire(...

2020-01-09 18:17:36 148

原创 JUC源码分析-重入锁-Reetrantlock

非公平锁和公平锁NonfairSync-lockfinal void lock() {//第一次尝试获取锁if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}AbstractQueuedSynchronizer-addWaiter...

2020-01-09 18:01:36 170

原创 dubbo源码分析5-负载均衡算法

本文分享内容如下随机算法分析 轮询算法分析 最小活动数算法分析 一致性hash算法分析下面逐个进行分析随机算法分析实现类:RandomLoadBalanceprotected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invoc...

2019-12-20 17:22:25 163

原创 dubbo源码分析4-consumer发送请求

下面对调用链的方法进行简要的分析, 疑难的部分会重点分析。同时也会根据 上篇文章 创建代理 的分层逐个进行分析。直连方式的前半部分直连方式的后半部分,这部分与订阅方式的后半部分是相同的,所以单独提出来consumer发送请求调用链分析NettyChannel.send(Object, boolean) //调用 NioClientSocketChannel执行wri...

2019-12-20 17:21:17 243

原创 dubbo源码分析11-SPI机制分析

SPI 用于插件化设计,使具体实现和接口解耦,是一种 接口实现的发现机制。mysql jdbc就是 jdk SPI的经典应用jdk SPI的实现有一些优缺点优点:扩展功能实现了解耦缺点:(1)浪费:将接口的实现类全部加载并实例化一遍,不想用某些实现类,它也被加载并实例化了,(2)不灵活:不能获取指定的实现类,只能通过Iterator形式获取(3)线程不安全:多线程使用S...

2019-12-20 17:20:53 172

原创 dubbo源码分析6-consumer请求响应

consumer同步实现分析send执行链中HeaderExchangeChannel-request() 创建了 DefaultFuture,依赖 DefaultFuture实现同步功能。DefaultFuture 通过await,signal();实现请求和响应同步HeaderExchangeChannelpublic ResponseFuture request(Objec...

2019-12-20 17:18:51 173

原创 dubbo源码分析7-编码解码

本文分享内容如下:编码和解码入口分析 编码流程分析 编码-dubbo协议分析 解码流程分析 解码疑难代码分析编码和解码入口分析通过netty支持实现NettyClientprotected void doOpen() throws Throwable {NettyHelper.setNettyLoggerFactory();bootstrap = new C...

2019-12-20 17:18:16 382

原创 dubbo源码分析1-consumer代理创建和连接分析1

创建代理和连接server详细分析由于整个过程超级复杂,整个分析的思路是先整体再局部,将复杂的流程拆分为多个部分逐个分析,这样比较容易理解。整理连接server流程图如下如果直连方式直接调用 DubboProtocol,如果配置了注册中心则通过注册中心获取 server url列表。然后调用DubboProtocol。(DubboProtocol代表与服务端建立连接创建执行代...

2019-12-20 17:17:45 208

原创 dubbo源码分析3-consumer订阅创建代理

订阅创建代理的第一部分红框之前的部分已经分析过,本文分析红框内的部分。private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {RegistryDirectory<T> directory = new ...

2019-12-20 17:17:23 387

原创 dubbo源码分析2-consumer代理创建和连接分析2

直连方式 源码分析直连创建代理的前半部分如下下面详细分析ProtocolFilterWrapper.refer(Class<T>, URL)创建包含 Filter的invoker执行链。public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException...

2019-12-20 17:16:57 232

原创 netty源码分析11-ByteBuf

本文分享内容如下AbstractByteBuf分析 readXXX系列方法 读写方法分析 ensureWritable分析 capacity分析 setBytes(int, byte[], int, int) 分析 AbstractReferenceCountedByteBuf分析 ByteBuffer-put系列方法分析 UnpooledHeapByteBuf分...

2019-12-20 16:32:37 285

原创 netty源码分析10-写数据

本文分享内容如下ChannelOutboundBuffer分析 AbstractUnsafe.write分析 flush流程分析ChannelOutboundBuffer分析它是一个环形数组,用于缓存还没发送出去的数据,每一个ChannelOutboundBuffer都存放在ThreadLocal中。内部维护一个定长的数组,按照顺序,从头到尾使用,如果到达尾部再从头开始使用,循环...

2019-12-06 21:40:57 207

原创 netty源码分析9-Unsafe

本文分享以下内容Unsafe概况 AbstractUnsafe 分析 AbstractNioUnsafe分析 NioByteUnsafe分析 NioMessageUnsafe分析Unsafe概况unsafe是Channel的内部逻辑实现,实际的IO操作都是由unsafe完成的。unsafe调用原生的NIO API处理IO操作,使用Pipeline传递触发的channel...

2019-12-06 17:58:46 171

原创 netty源码分析2-2-NioSocketChanel初始化

本文分享内容初始化NioSocketChannel初始化NioSocketChannel当客户端发起连接时,服务端建立与客户端的连接的过程,实际上就是NioSocketChanel初始化的过程。这个过程依赖NioMessageUnsafe.read(),下面分析一下其源码@Overridepublic void read() {assert eventLoop()....

2019-12-06 11:25:05 169

空空如也

空空如也

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

TA关注的人

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