自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

shixiaoling123的博客

变量变常量,发现新变量!

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

原创 spring源码学习_01 本地环境搭建

参考网上各种资源,终于把spring源码运行起来了;步骤总结如下:spring版本: 5.2.x本地系统macidea 2019.3.2 下载地址:https://www.jetbrains.com/idea/download/other.htmljdk 11 下载地址:https://repo.huaweicloud.com/java/jdk/

2023-05-17 00:10:28 886

原创 11 dubbo源码学习_dubbo协议通信

dubbo在通信上也支持非常多的网络协议,而dubbo协议属于dubbo框架自研,整体协议也比较有代表性,采用定长协议头+变长协议休的形式;

2023-05-14 23:58:50 490

原创 10 dubbo源码学习_线程池

dubbo内部采用netty做为通信工具,netty包括bossGroup和workerGroup,bossGroup负责接收accept连接,连接就绪后,将连接交给workerGroup进行处理;默认情况下:bossGroup:线程个数:1个,队列长度,Integer.MAX;创建1个NioEventLoop,这个NioEventLoop主要进行accept操作;

2023-04-27 12:17:44 1970

原创 09 dubbo源码学习_服务降级

使用方式:mock=“[fail|force]return|throw xxx”fail:表示调用失败时,执行mock方法;如果不指定关键字默认为 failforce:表示不执行远程调用,直接调用mock方法;return表示指定返回结果,throw表示抛出指定异常;当调用目标接口出现异常时,返回return 一个空,就是return null;

2023-04-23 21:48:41 187

原创 08 dubbo源码学习_LoadBalance

每收到一个请求,活跃数加1,完成请求后则将活跃数减1。在服务运行一段时间后,性能好的服务提供者处理请求的速度更快,因此活跃数下降的也越快,此时这样的服务提供者能够优先获取到新的服务请求、这就是最小活跃数负载均衡算法的基本思想。它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。一致性hash负载是参考着一致性hash算法来的,大概意思就是在一个环,节点散落在这个环上,每次获取时,生成一个hash值,在这个节点上获取对应的节点;

2023-04-21 23:54:37 439

原创 07 dubbo源码学习_集群Cluster

本篇主要介绍集群的容错,服务提供者一般会以多节点的形式存在,那么想象一下,如果调A提供者出timeout之后,该怎么办呢?对于不同的容错策略,对应到代码就是不同的invoker;cluster接口的作用就是创建一个对应策略的invoker;集群容错的入口是在com.alibaba.dubbo.registry.integration.RegistryProtocol#doRefer。有关select是下节要分析的负载均衡组件,而list就是前面的Directory的list方法;

2023-04-18 22:16:57 350

原创 06 dubbo源码学习_服务路由

参数值,号分隔多个值,比如:host!host = 10.20.153.10 =>以及 URL 上的所有参数,如:application, organization 等。服务调用信息,如:method, argument 等,暂不支持参数路由。URL 本身的字段,如:protocol, host, port 等。=号,表示不匹配,比如:host!=号,表示匹配,比如:host = 10.20.153.10。从这里也可以看出,dubbo的路由是可以方法级别配置的;号结尾表示通配符:host!

2023-04-09 23:09:38 155

原创 05 dubbo源码学习_服务目录

Direcotry它有一个核心的list方法,获取服务提供者的列表(消费者调用接口的所有提供者),当服务提供者新注册、下线、变更等操作时,Directory list会随注册中心的变化而变化;RegistryDirectory它实现了NotifyListener,当注册中心发生改变时,会通过NotifyListener.notify方法进行通知,之后会动态更新RegistryDirectory的Invokers list;从这里可以看出,doList其实只是做了通过方法名进行远程方法列表的匹配;

2023-04-09 16:55:11 337

原创 04 dubbo源码学习_服务引用

本地服务引用相对比较简单,要求服务暴露和服务引用是在同一个JVM进程内,服务暴露时将服务引用加入到了exportersMap中,那么服务引用时,就是从这个map中获取出服务对象进行调用;通过查看源码,本地引用就是通过exporterMap来存储服务暴露引用,在本地引用时,会对该接口生成一个动态代码的类,而这个Proxy持有着目标服务的引用;远程服务引用也分为两种,直接服务引用和多注册中心/服务提供者;上一篇分析了服务的暴露过程,服务暴露是服务端做的事情,对于客户端来说,他需要做的是服务的引用;

2023-03-25 13:01:35 74

原创 03 dubbo源码学习_服务暴露&服务注册

在了解了本地服务暴露之后,再来看一下远程服务暴露,它和本地暴露有非常多的不同,本地暴露只需要将Exporter加入到Map缓存;远程服务暴露的代码我们从:com.alibaba.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol。本地暴露的代码我们从这里开始:com.alibaba.dubbo.config.ServiceConfig#exportLocal。从上面这段代码我们找到了本地暴露和远程暴露的入口;这段代码主要是将远程暴露服务注册到注册中心;

2023-03-21 18:56:47 342

原创 02 dubbo源码学习_SPI

而有了生成的这个适配类,可以通过它,做一些条件的解析,查询出具体的实现类,通过调适配类的方式完成对最终实现类的调用;观察它的URL匹配原则,它会从URL中获取simple.ext参数,如果未设置,则默认使用impl1,是因为SimpleExt的SPI(“impl1”)的默认值是它;dubbo的SPI作用主要是扩展性,当一个接口存在多种实现,如何在代码运行过程中,根据不同的参数选择不同的实现;它的作用类似于Spring的IOC,开篇我说了java的SPI是不支持IOC的;

2023-03-14 16:23:08 243

原创 01 dubbo源码学习_本地启动源码

学习dubbo源码的第一步就是先把源码下载下来,跑一个demo示例;这里我使用的dubbo是2.6.x,zookeeper的版本是3.5.5。首先启动dubbo-demo-provider,之后再启动dubbo-demo-consumer,观察是否正常通信;github地址:https://github.com/apache/dubbo。源码下载之后,打开idea,导入项目,首先找到:dubbo-demo,分别打开。修改注册中心为zookeeper。

2023-03-12 15:46:34 253

原创 JUC——BlockingQueue

BlockingQueue它继承自Queue接口,核心方法主要包括:上面四种元素操作分类都是在需要阻塞时,处置结果的不同:BlockingQueue的实现类:ArrayBlockingQueue继承自AbstractQueue并实现了BlockingQueue接口,它在创建的时候必须传入数组的长度,而不像ArrayList一样有自己的扩容机制;并且队列长度一但创建不允许再修改;ArrayBlockingQueue依赖于ReentrantLock,所以它也提供公平和非公平的策略,默认是非公平模式;1.2

2022-07-03 21:45:00 225

原创 JUC——ReentrantReadWriteLock

ReentrantReadWriteLock是读写锁,写写互斥,读写互斥。它实现了ReadWriteLock接口,接口内定义了readLock和writeLock接口;ReentrantReadWriteLock是基于AQS实现的加锁功能,支持公平式抢占和非公平式抢占;2. WriteLock实现在创建WriteLock的时候,会将sync传递到WriteLock内,WirteLock的操作是基于sync(AQS)实现的;写锁在加锁时,需要注意:...

2022-07-01 00:31:00 136

原创 JUC——FutureTask

在使用多线程的场景中,线程A如何想要获取线程B的执行结果,则需要一直等待线程B执行完毕后才能取到结果,而Future则是线程A在提交线程B时,返回一个Future,线程A通过调用Future.get获取线程B的结果,如果此时线程B还未执行完毕,则线程A调用Future.get会阻塞;Future是一个接口,其中FutureTask是Future的一种实现;2. FutureTask状态FutureTask状态流转4. run方法FutureTask实现自RunnableFuture,而Runnab

2022-06-28 23:48:44 168

原创 JUC——CopyOnWriteArrayList

CopyOnWriteArrayList是java为了解决ArrayList并发容器提供的工具类,它通过对写操作加锁串行处理,当写操作在进行时,也不影响读操作;每次写操作都会复制一个副本出来,在副本没有指定真正的array引用之前,读请求可能会读到旧的数据,所以它比较适合读多写少,并且能够容忍最终一致性的问题;Arrays.copyOf也是复制一份数组,它的内部实现也是基础System.arraycopy来实现的,System.arraycopy也是一种浅拷贝;接下来做一个小实验:说明System.ar

2022-06-28 20:07:19 175

原创 JUC——CyclicBarrier

CyclicBarrier也是一个多线程通信工具,它支持一组线程都到达一个点之后再继续执行;它的内部实现是通过ReentrantLock和Condition来实现的,接下来看一下它的源码分析;// 可重入锁private final ReentrantLock lock = new ReentrantLock();// 条件队列private final Condition trip = lock.newCondition();// 参与的线程数量,它的值不会改变,当循环使用CyclicBarrie

2022-06-27 15:55:58 122

原创 JUC——Semaphore

Semaphore信号量也是基于AQS共享模式来实现的,通过AQS的state完成计数器,它可以用来保护一个或多个共享资源的访问,如果state>0则允许获取资源,否则阻塞等待;Semaphore支持公平式和非公平式抢占,默认为非公平式抢占,在创建Semaphore时,通过:Semaphore主要的方法 :获取许可释放许可从上面的源码中可以看出,在释放许可的时候,并没有做太多的限制,那如果acquire一次,release两次会有什么后果呢?获取许可...

2022-06-27 00:25:47 295

原创 JUC——CountDownLatch

上篇文章学习了ReentrantLock的实现,再来看一篇CountDownLatch的实现,CountDownLatch是基于AQS的共享模型实现的一种线程通信的工具;在开始之前先来看一下它的主要方法:

2022-06-26 15:26:58 109

原创 JUC——ReentrantLock

ReentrantLock是基于AQS来实现的,所以如果想对它有所了解,最好先熟悉一下AQS的内容,它继承了Lock接口,Lock接口定义了加锁释放锁的方法;ReentrantLock支持公平锁和非公平锁两种加锁方式,而不像synchronized只支持一种非公平锁;并且ReentrantLock也支持中断非中断加锁;ReentrantLock内部有三个内部类,Sync、NonfairSync、FairSync;其中FairSync是实现公平锁的子类,而NonfairSync和FairSync继承自Syn

2022-06-26 13:38:11 140

原创 JUC——AQS

AbstractQueuedSynchronizer是Java的并发基础,想学好Java的并发,还需要先从AQS开始学起,本节参考网络知识,学习AQS的实现原理;AQS是CLH锁的一个变种,了解CLH原理对学习AQS有一定理解上的帮助,CLH队列属于自旋锁的一种,先来看一下CLH队列锁的特点:参考网络中对CLH队列锁的一种实现:上述代码中使用到了ThreadLocal,可以方便的在加锁时将当前Node存放ThreadLocal,在释放锁时,只需要从ThreadLocal获取当前线程绑定的节点;通过图解的方

2022-06-25 17:54:53 190

原创 JUC——LockSupport & Condition

LockSupport和Condition功能和wait/notify类似,都可以完成线程阻塞唤醒或线程通信的功能;其中LockSupport的park和unpark(thread)可以随时随地使用,不需要像wait/notify必须在synchronized中使用;在JUC并发包中也大量的使用LockSupport的功能;本文主要介绍LockSupport和Condition功能和区别;LockSupport 工具可以帮助我们阻塞或唤醒一个线程,也是构建同步组件的基础工具,提供park(阻塞)和unpa

2022-06-18 20:07:07 346

原创 JUC——CAS

在多线程编程时,如果想保证一段代码具有原子性,通过会使用锁来解决,而CAS是通过硬件指令来达到比较并交换的过程;CAS原理2 CAS存在的问题2.1 ABA问题在多线程并发场景下:线程A、B、C 同时对资源 R=1进行修改,线程A期望将R修改为2,在修改之前,线程B拿到CPU资源将R修改为3,线程B结束后,线程C拿到CPU资源将R修改为1,此时线程A接着去做修改,成功了,在线程A看来,R=1一直没有被修改,所以造成ABA问题;通过控制线程执行顺序,复现此问题,但是我们发现如果是对于数值类型的ABA问

2022-06-18 20:06:29 131

原创 zookeeper单机客户端——源码01

1.ZK基本概念1.1 请求类型1.2 ZK集群角色1.3 ZAB两种模式2. 客户端源码2.1 客户端主要类说明2.2 SendThread2.2.1 客户端时间的配置2.2.2 客户端状态转换2.2.3 SendThread.run()2.3 客户端是如何保证发送顺序的;2.4 有关session超时;2.5 zookeeper异步创建节点;2.4 EventThread;原文链接:zookeeper单机客户端源码分析工作中有大量使用zookeeper实现分布式锁,所以打算研究一下zk源码,对今后.

2022-04-09 23:24:24 2162

原创 使用sharding-jdbc解决SaaS系统动态数据源问题2——回答粉丝问题

在上篇文章:使用sharding-jdbc解决SaaS系统动态数据源问题 文章中有些细节没有罗列,给部分读者造成疑惑统一在这里解答:1. 配置的动态数据源事务如何控制?其实无论我们创建了多少个数据源,都是交到了shardingjdbc里面进行管理了,shardingjdbc内部管理一个dataSourceMap,然后shardingjdbc对其dataSourceMap进行封装出一个新的dataSourceNew,我们接下来只需要对新的dataSourceNew将其交给spring进行事务管理就可以了;

2021-07-20 07:41:56 1219 1

原创 mysql与es列表分页调研

mysql与es列表分页调研随机深度分页:随机跳转页面滚动深度分页:只能一页一页往下查询1. 数据库分页性能环境:测试环境(172.20.202.220)数据库:test-data-center数据表:d_da_bom数据量:500W(单表)1.1 无条件limit分页select * from d_bom_temp where 1=1 LIMIT 0,10当分页条数超过500000(50W)时,耗时已经超过800ms;1.2 普通条件查询limit分页select

2021-05-22 09:10:37 403 1

原创 shardingjdbc服务治理自定义注册中心

1. 背景2. shardingjdbc分表实现2.1 数据源配置2.2 自定义分表策略3. 动态刷新shardingjdbc的1. 背景最近参与一个项目,涉及到多数据源,然后再对某一数据源进行分表操作;分表按月份进行分表,查询也只能查询出近3个月内的数据(相当于需要动态改变shardingjdbc的分表配置);2. shardingjdbc分表实现2.1 数据源配置@Configuration@Component@MapperScan(basePackages = "com.xxx.d.

2021-03-21 17:13:36 1504 3

原创 使用sharding-jdbc解决SaaS系统动态数据源问题

1. 需求背景2. 设计思路2.1 SaaS数据隔离的三种方案2.1.1 共享数据表(tenant_id)2.1.2 独立schema2.1.3 独立数据库2.2 创建租户思路2.2.1 创建租户时指定数据源2.2.2 创建租户流程3. 使用sharding-jdbc实现4. 总结1. 需求背景项目是toB系统,技术设计的时候需要考虑系统SaaS化,也就是实现多租户模式;2. 设计思路个人之前并未参与过SaaS系统的设计和开发,也参考了网上的大量资料学习,SaaS系统的核心个人感觉主要有三点:.

2021-02-19 09:28:49 5301 78

原创 你的场景真的适合使用分布式锁吗?

最近面试很多候选人的时候,在以往的工作中都使用过分布式锁,问他使用场景,都是认为并发了,要使用分布式锁控制;接着问:为什么要选用分布式锁呢?很多候选人就不知道该从何说起,这也表明了对技术的前期选型并没有思考,盲目的使用技术;关于分布式锁的文章我也写了很多篇了,都是自己工作中遇到的或者是和公司大佬讨论的结晶(当然,如果有错误的地方欢迎大佬评论纠正):1. redis实现分布式锁踩坑记录2. Redisson分布式锁——踩坑记录3. Redis分布式锁与Zk分布式锁的详解与选型4. zookeeper

2021-01-05 15:12:46 521 3

原创 Elasticsearch工作原理整理——学习笔记

1. ES的并发处理2. 请求是如何路由到分片的2.1 主分片与副本分片的交互2.2 新建、索引和删除文档2.3 检索文档2.4 更新文档2.5 批量文档操作这里主要记录一下es内部工作的原理,ES入门很简单,但想用好它我一直认为不是件简单的事情。本文的大部分内部是参考官方文档,内容如有错误欢迎指正;内容持续更新中…1. ES的并发处理在做商品库存扣减时,难免会出现库存并的情况,比如:web-1对库存count的数据量做了修改之后,并没有办法告知web-2库存的真实情况,就导致了商品超卖的情况.

2020-12-06 21:13:24 894

原创 Elasticsearch基本概念和简单使用——学习笔记

1. es的基本概念2. es的基本操作2.1 Index的基本操作2.2 mapping2.2.1 Es中的数据类型2.2.2 创建索引时指定Mapping2.3 Type的基本操作2.4 Document的基本操作3. DSL查询1. es的基本概念Elasticsearch底层是基于Lucene实现的一个搜索引擎,主要应用于:日志检索、Mysql实时数据快照、分布式文档数据库、搜索引擎等业务场景;Elasticsearch包含了非常多的名词,想学习Elasticsearch最好先了解一下这些名.

2020-11-29 17:32:30 241

原创 docker安装ES和Kibana:6.5.4版本

1、搜索es镜像docker pull docker.elastic.co/kibana/kibana:6.5.4docker pull docker.elastic.co/elasticsearch/elasticsearch:6.5.4docker search -s 50 elasticsearch2、安装elasticsearchdocker pull elasticsearch3、在本机创建es相关的目录cd /home/xiaoling/docker/mkdir elastics

2020-11-24 15:50:36 821

原创 Git在工作中常用的几个案例

1. 设置本地关联远程代码库2. 更新远程分支列表3. 删除本地及远程分支4. 删除远程分支的目录/文件5. 分支合并6. 本地A分支提到远程B分支7. 处理代码冲突8. 本地dev改动了太多文件,但现在需要紧急切换hotfix分支修复bug9. 放弃本地代码的修改10. 撤回add的文件11. 删除已经commit的文件12. 远端代码回滚1. 设置本地关联远程代码库 git remote add origin https://git.xxx.com/demo.git2. 更新远程分支列表 g.

2020-11-18 15:13:23 417

原创 Curator分布式锁源码讲解

Curator加锁源码走读1. 加锁过程2. 释放锁过程如果对Curator或zookeeper加锁不明白的可以参考我的这两篇文章:Redis分布式锁与Zk分布式锁的详解与选型zookeeper使用过程中需要注意的坑1. 加锁过程// 一直尝试加锁,简称无终止public void acquire() throws Exception { if (!this.internalLock(-1L, (TimeUnit)null)) { throw new IOExcepti

2020-11-11 13:39:39 118

原创 深入理解volatile关键字

关于volatile关键字的话,工作中没有遇到使用场景,大部分是面试的时候必问的一个题目;本文主要内容摘自《JAVA高并发编程详解》1. CPU Cache模型CPU Cache主要是为了解决CPU与内存之间访问速度的差异问题,Cache则是在程序运行的过程中会将运算的所需数据从主内存复制一份到CPU Cache中,这样CPU在计算的过程中,可以直接从CPU Cache中读取或写入,当运算结束之后,CPU Cache再将最新数据刷新到主内存当中,CPU直接通过访问Cache的方式替代直接访问主存的.

2020-11-07 15:08:38 670

原创 mysql分表在真实项目中的实践

1. 分表在项目的实践2. 分库分表带来的新挑战1. 分表在项目的实践2. 分库分表带来的新挑战

2020-10-30 18:56:47 301

原创 mysql分库分表基础知识介绍

1. 分库分表场景1.1 读写分离场景回顾1.2 分库分表场景2. 水平与垂直分库2.1 垂直分库2.2 水平分库3. 水平与垂直分表3.1 水平分表3.2 垂直分表1. 分库分表场景1.1 读写分离场景回顾在前两篇文章中说清楚了读写分离的场景,读写分离主要解决的是高并发场景下读多写少的场景,写入事务锁影响读效率的问题;可能有读者想问,那如果是高并发场景的多读多写呢?在读写分离中我们也说明了这种场景可能采用mysql的集群来实现,即多主多从;1.2 分库分表场景上面提到了多读多写的这种场景,.

2020-10-18 23:01:33 171 2

原创 mysql5.7主从复制常遇问题

1. 主从不一致问题1.1 由于Position不一致导致主从同步失败问题描述1.1.1 解决方案:选择跳过本次同步1.1.2 解决方案:将master binlog再次同步到slave2. mysql5.7 的并行复制2.1 回顾mysql5.7之前的并行复制2.1 mysql5.7的并行复制3. mysql8 write-set的并行复制4. mysql5.7主从复制压测1. 主从不一致问题1.1 由于Position不一致导致主从同步失败问题描述查看master库和slave库的状态show.

2020-10-14 17:34:08 780 1

原创 mysql读写分离详解及同步延迟问题

1. 读写分离的目的1.1 什么是读写分离是将mysql多实例化,写数据时,将数据写入main服务,读请求时,从slave服务读取数据,将读和写拆分开,每次main收到写数据时,会将binlog日志同步到slave服务,slave服务再将binlog在自己的实例中执行,以达到数据是一致性的;1.2 读写分离的场景当数据库系统出现瓶颈时,有很多种优化方式,读写分离只能算是其中的一种,它主要解决的问题是,数据库的读多写少,读请求非常多,但是写请求非常少;为什么呢?我们分几种情况讨论:读多写少:1)

2020-10-09 21:28:38 982

原创 分布式理论CAP与BASE模式

在上篇文章中,想到一个问题就是redis与zookeeper在CAP理论中的不同之处?今天就整理一份CAP与BASE理论,然后再讨论一下上面的这个问题;1. 分布式理论-CAP2. 分布式理论-BASE3. CAP在redis与zookeeper中的应用3.1 CAP在redis中的应用3.2 CAP在zookeeper中的应用...

2020-09-19 17:45:58 808

空空如也

空空如也

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

TA关注的人

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