- 博客(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关注的人