- 博客(120)
- 资源 (2)
- 收藏
- 关注
原创 贝贝猫的文章目录
个人博客贝克街的流浪猫-技术博客文章目录Android非 ROOT 安卓内录ADB 工具包 ddmlib 的剖析与修改ContainerDocker为 Docker 配置 TLSKubernetesKubernetes 简介Kubernetes 常用功能Kubernetes 实现原理Kubernetes 网络实现——Pod 网络Kubernetes 网络实现——Service 网络Kubernetes 网络实现——外网通讯Kubernetes 高级特性Ku
2021-04-10 16:24:01
1380
原创 Sentinel 简介
引言随着微服务的流行,服务和服务之间的稳定性变得越来越重要。从本篇文章开始,我们将进入 Sentinel 的世界,看看它作为一个流量控制组件,是如何从流量控制、熔断降级、系统自适应保护等多个维度来保障微服务的稳定性的。本文作为 Sentinel 系列文章的开篇,会先简单地介绍一下 Sentinel 中的概念以及设计思想,在接下来的文章中,我们还会介绍 Sentinel 的使用方式,以及各个核心模块的实现原理。简介随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服
2021-04-07 09:37:57
809
1
原创 Sentinel 定义资源
引言在前面的文章中,我们已经简单地介绍了 Sentinel 的核心概念、核心功能以及实现的思想,从本篇文章开始,我将介绍一下如何使用 Sentinel 的核心功能,本文先介绍一下如何定义 Sentinel 中的资源。简介Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。这里所说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几
2021-04-07 09:37:51
843
原创 Sentinel 规则的种类
引言在前面的文章中,我们已经简单地介绍了如何在 Sentinel 中如何定义资源,本文将介绍 Sentinel 中所包含的各种类型的规则。规则的种类Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。流量控制流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数
2021-04-07 09:37:44
1026
原创 Sentinel 查看和定义规则
引言在前面的文章中,我们已经简单地介绍了 Sentinel 中所包含的各类规则,本文将介绍 Sentinel 中各类规则的查看和修改方式。查看和修改规则查询更改规则引入了 transport 模块后,可以通过以下的 HTTP API 来获取所有已加载的规则:http://localhost:8719/getRules?type=<XXXX>type=flow: 以 JSON 格式返回现有的限流规则type=degrade: 返回现有生效的降级规则列表type=system: 则
2021-04-07 09:37:37
962
原创 Sentinel 实现原理——概述
引言在前面的文章中,我已经介绍了 Sentinel 中的概念,以及所提供的各类功能如何使用。从本篇文章开始,我们将深入到源码中,自顶向下地介绍 Sentinel 整体的实现原理以及各个核心模块的实现原理。本文作为这一部分介绍的开篇,我会先介绍一下 Sentinel 的整体设计思想,以及下层包含的各个模块,后续的文章中会详细地介绍各个核心模块的实现原理。整体设计接下来,我们会分别从数据和处理过程这两个角度介绍 Sentinel 的设计原理,首先,我们先介绍一下 Sentinel 中内部是如何组织数据的
2021-04-07 09:37:32
1565
1
原创 Sentinel 实现原理——Context
引言在前面的文章中,我已经介绍了 Sentinel 的整体设计思想,本文主要介绍 Sentinel 中贯穿整个调用链路的 Context 容器实现。源码解读Context 容器所存储的数据并不多,只包含如下属性:// com.alibaba.csp.sentinel.context.Contextpublic class Context { /** * Context name. */ private final String name; /**
2021-04-07 09:37:25
520
原创 Sentinel 实现原理——处理链
引言从本篇文章开始,就要介绍 Sentinel 限流降级功能的核心了,前面也说过 Sentinel 使用了一套类似于责任链的模式来实现这个部分,这里我们展开一下,将责任链中的各个部分分别详细的介绍一下。源码解读上图仅作为设计思想的展示,图中 Slot 的顺序已和最新版 Sentinel Slot Chain 顺序不一致前面我们已解说了,Sentinel 中最核心的功能都是通过一套处理链(责任链)来实现,处理链中的每一个处理单元被称为一个 Slot。每个 Slot 执行完业务逻辑处理后,都会触
2021-04-07 09:37:10
488
原创 Java JUC 简介
引言本系列文章旨在介绍 Java 并发相关的知识,本文作为开篇主要介绍了 JDK 中常用的并发库(JUC)的使用方式, 后续的文章中我会自上而下地剖析了 JUC 中各个部门的实现原理,从直接下级框架 AbstractQueuedSynchronizer 也就是大家常说的 AQS,再到其中使用的 CAS, Wait,Park,最后到操作系统层面的 Mutex,Condition,希望通过这篇文章,大家能够对整个 Java 并发有一个清晰全面的认识,而且把这些内容串在一起你会发现它们本质上都是相通的。并发问
2021-04-07 09:36:55
615
原创 Java ThreadLocal 实现
引言前面我们已经介绍了 JDK 中常用的并发库(JUC)的使用方式, 本文我们着重介绍 JUC 中 ThreadLocal 的实现方式已经 Netty 对 ThreadLocal 的增强实现。ThreadLocal实现这里我们简单地介绍一下 ThreadLocal 的实现原理,在每个 Thread 对象中都保存了一个 ThreadLocal Map,其中 key 为 ThreadLocal 对象,Value 为 ThreadLocal 的值。这里 ThreadLocalMap 中的 Entry 使用
2021-04-07 09:36:49
302
1
原创 Java ThreadPool 实现
引言前面我们已经介绍了 JDK 中常用的并发库(JUC)的使用方式, 本文我们着重介绍 JUC 中 ThreadPool 的实现方式。ThreadPool 实现在介绍 ThreadPoolExecutor 的实现时,我们着重介绍它的 execute 函数和shutdown,shutdownNow,在介绍之前,让我们来看一看 ThreadPoolExecutor 是如何维护内部数据的。/** * The main pool control state, ctl, is an atomic inte
2021-04-07 09:36:43
244
原创 Java ConcurrentHashMap 实现
引言从本篇文章开始,我们将介绍 Java 并发容器的实现方式,本文会着重介绍其中的 ConcurrentHashMap 部分。ConcurrentHashMap用过 HashMap 的同学应该都知道,它不是线程安全的,在极端情况下可能会发生死循环,要想在多线程环境下使用 HashMap 一个简单的思路是加一个锁,在调用 HashMap 的函数前首先要获得该锁。但是这样做有一个问题就是效率会比较差。ConcurrentHashMap 的数据组织和 HashMap 基本相同。通过一个数组来实现 Has
2021-04-06 09:31:37
404
原创 Java ConcurrentLinkedQueue 实现
引言本文着重介绍 Java 并发容器中 ConcurrentLinkedQueue 的实现方式。ConcurrentLinkedQueueJava提供的线程安全的 Queue 可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是 BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 阻塞队列可以通过加锁来实现,非阻塞队列可以通过 CAS 操作实现。ConcurrentLinkedQueue 使用了链表
2021-04-06 09:31:30
516
原创 Java ConcurrentSkipListMap 实现
引言本文目前只是简单地介绍了 Java 并发容器中 ConcurrentSkipListMap 的实现方式,后续会考虑拓展本文,从源码的角度进行详细的分析。ConcurrentSkipListMap对于一个单链表,即使链表是有序的,如果我们想要在其中查找某个数据,也只能从头到尾遍历链表,这样效率自然就会很低。而跳表是在这个单链表的基础上同时维护了多个链表,并且链表是分层的。最低层的链表维护了跳表内所有的元素,每上面一层链表都是下面一层的子集。跳表内的所有链表的元素都是排序的。查找时,可以从顶级链
2021-04-06 09:31:25
234
1
原创 Java CoryOnWriteArrayList 实现
引言本文着重介绍 Java 并发容器中 CoryOnWriteArrayList 的实现方式。CopyOnWriteArrayListCopyOnWriteArrayList 用于读场景远多于写场景的情况,它能够让读与读之间不互斥,读与写也不互斥,只有写与写之间才会互斥。它的思路也很简单,内部通过一个数组来维护数据,正常读数据时直接通过索引从数组中提取数据。/** The array, accessed only via getArray/setArray. */private transien
2021-04-06 09:31:18
431
1
原创 Java LinkedBlockingQueue 实现
引言本文着重介绍 Java 并发容器中 LinkedBlockingQueue 的实现方式。LinkedBlockingQueueLinkedBlockingQueue 底层基于单向链表实现的阻塞队列,可以当做无界队列也可以当做有界队列来使用,满足FIFO的特性,为了防止 LinkedBlockingQueue 容量迅速增,损耗大量内存。通常在创建LinkedBlockingQueue 对象时,会指定其大小,如果未指定,容量等于Integer. MAX_VALUE。那么什么是阻塞队列呢?我们知道队列
2021-04-06 09:31:12
338
1
原创 Java PriorityBlockingQueue 实现
引言本文着重介绍 Java 并发容器中 PriorityBlockingQueue 的实现方式。PriorityBlockingQueuePriorityBlockingQueue 是一个带排序功能的阻塞队列,因为它是一个队列,没必要保证整个队列的内部顺序,只需要保证出队时按照排序结果出即可,所以其内部使用了二分堆得形式实现,同时,PriorityBlockingQueue 也是线程安全的,内部通过一个锁来控制堆数据的维护。PriorityBlockingQueue 的堆数据都保存在如下的 queu
2021-04-06 09:31:06
250
原创 Java Lock
引言本文着重介绍 Java 中 Lock 的不同实现方式。锁的种类在 JUC 中,大量使用到了锁,而 Java 中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:悲观锁与乐观锁对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和大部分Lock的实现类都是悲观锁。
2021-04-06 09:31:00
433
原创 Java AQS 实现——数据组织
引言从本篇文章开始,我们将介绍 Java AQS 的实现方式,本文先介绍 AQS 的内部数据是如何组织的,后面的文章中再分别介绍 AQS 的各个部门实现。AQS通过前面的介绍,大家一定看出来了,上述的各种类型的锁和一些线程控制接口(CountDownLatch 等),最终都是通过 AQS 来实现的,不同之处只在于 tryAcquire 等抽象函数如何实现。从这个角度来看,AQS(AbstractQueuedSynchronizer) 这个基类设计的真的很不错,能够包容各种同步控制方案,并提供了必须的
2021-04-06 09:30:53
231
1
原创 Java AQS 实现——排他模式
引言本文着重介绍 AQS 的排他模式的实现方式。排他模式获取资源入队操作介绍完之后,我们来看一下什么情况下需要执行入队操作,我们先从排他模式说起。下面的 acquire 是 AQS 提供的一个以排他模式获取资源的函数,我们可以看到它的执行流程是:先尝试获取资源 tryAcquire,tryAcquire 是一个抽象函数,看完前面的锁的分类部分大家应该对它比较熟悉,因为通过 AQS 实现的各类锁实际上就是通过对 tryAcquire 这类抽象函数的覆写来达到各种锁的效果的。如果尝试加锁失败,也
2021-04-06 09:30:47
261
原创 Java AQS 实现——共享模式
引言本文着重介绍 AQS 的共享模式的实现方式。共享模式通过 AQS 不仅能够实现排他锁,而且也能够实现共享锁,就像前面介绍过的 ReentrantReadWriteLock,其中读锁就是共享锁,这部分是通过 AQS 的共享模式实现的。注意:这里我们只是以 ReentrantReadWriteLock 作为一个例子,这并不是说要想使用 AQS 的共享模式,就一定要同时使用它的排他模式,AQS 是很灵活的,你可以只使用它的共享模式,比如 CountDownLatch,也可以只使用它的排他模式,比如 R
2021-04-06 09:30:41
475
原创 Java AQS 实现——Condition
引言本文着重介绍 AQS 的 Condition 实现方式。Condition介绍完 AQS 的共享模式和互斥模式后,我们来看一看 AQS 是如何实现条件等待的,即 Condition。在 AQS 中通过 ConditionObject 实现 Condition。从 ConditionObject 的核心数据中,我们会发现它内部也会维护一个 Node 的队列。public class ConditionObject implements Condition, java.io.Serializabl
2021-04-05 11:16:08
316
1
原创 Java Thread 和 Park
引言从本篇文章开始,将会是一些和 Java 多线程相关的杂谈,本篇文章主要介绍 JVM 对 JavaThread 实现,以及 Thread Park 的实现。多线程相关知识ThreadHotSpot里的Thread类对应着一个OS的Thread, JavaThread类继承自Thread, 一个JavaThread实例对应着一个Java层的Thread。所以, Java层的每一个Thread在操作系统上对应一个thread, linux上就是一个轻量级task。// thread.hppcla
2021-04-05 11:16:02
1269
原创 Java Yield Wait Park Sleep
引言前面我们已经介绍了 Java Thread 的实现以及用来进行线程等待的 Parker 和 ParkEvent 的实现,本篇文章中我们介绍一下 Parker 和 ParkEvent 的使用,即 Yield、Wait、Park、Sleep。Yield Wait Park Sleep和 Java 并发打交道,可能经常会有让当前线程先等一等,等待某一事件发生再继续向下执行的情况。而 Thread 的 Yield Wait Park Sleep 都能造成线程的等待,并让出 CPU 执行权,那么它们都有什么
2021-04-05 11:15:55
278
原创 Java Interrupt
引言本文中,我们主要介绍一下 Java 提供的 Interrupt 机制的常见使用方法,以及 Interrupt 的实现。Interrupt在 Java 中,如果我们想要操作一个线程的执行状态,可以直接调用 Thread::stop 停止它的运行,但是这样显然有些粗暴,如果线程正处于临界区进行数据修改,可能会导致数据的错乱。同样,我们也可以通过 Thread::suspend 和 Thread::resume 来暂停和恢复一个线程的运行。但是上述的这些方式,都是在比较下层的方式来控制一个线程的运行,
2021-04-05 11:15:41
530
原创 算法——排序
引言本文整理了常见的排序算法,方便以后查阅。排序算法package bbm.sort;/** * 排序接口 * * @author bbm */public interface Sorter { /** * Sort * * @param nums source data * @return sorted data */ int[] sort(int[] nums); /** * print data
2021-04-05 11:15:24
168
1
原创 算法——序列
引言本文整理了常见的序列相关算法,方便以后查阅。最大子序列package bbm.sequence;/** * 基于分治思想的最大子序列,递归地将序列分割成两半,然后比较左半段,右半段,和中间跨越的段,最终取最大的作为结果 * * 时间复杂度: O(n*log(n)) * 空间复杂度: O(log(n)) 栈 * * @author bbm */public class MaxSubSequence { public int maxSubArray(int[] nums)
2021-04-05 11:15:17
521
原创 算法——字符串
引言本文整理了常见的字符串相关算法,方便以后查阅。字符串匹配接口:package bbm.match;import java.util.List;/** * @author bbm */public interface StringMatcher { List<Integer> match(String string, String pattern);}测试:package bbm.match;import java.util.ArrayList;im
2021-04-05 11:15:10
125
1
原创 算法——贪心和动态规划
引言本文整理了常见的动态规划和贪心的相关算法,方便以后查阅。动态规划切割钢条问题package bbm.dp;/** * Serling 公司购买长钢条, 将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。 * 假定我们知道 Seling 公司出售一段长度为 i 英寸的钢条的价格为P(i=1,2,⋯,单位为美元)。钢条的长度均为整英寸。下图图给出了一个价格表的样例。 * 长度i: 1 2 3 4 5 6 7 8 9 10 *
2021-04-05 11:15:03
252
原创 算法——B 树
引言本文整理了B-树的实现,方便以后查阅。B 树实现代码package bbm.tree;/** * B树是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是 * 一个一般化的二叉查找树一个节点可以拥有2个以上的子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。B树减少 * 定位记录时所经历的中间过程,从而加快存取速度。B树这种数据结构可以用来描述外部存储。这种数据结构常被应用在
2021-04-05 11:14:56
208
原创 算法——红黑树
引言本文整理了红黑树的实现,方便以后查阅。红黑树package bbm.tree;import static bbm.tree.RedBlackTree.Color.BLACK;import static bbm.tree.RedBlackTree.Color.RED;/** * 1.每个结点或是红色的, 或是黑色的。 * 2.根结点是黑色的。 * 3.每个叶结点(NIL)是黑色的。 * 4.如果一个结点是红色的, 则它的两个子结点都是黑色的。 * 5.对每个结点, 从该结点到其所
2021-04-05 11:14:48
180
原创 算法——流
引言本文整理了常见的流相关算法,方便以后查阅。最大流package bbm.graph;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Optional;import java.util.Queue;import java.util.Set;import j
2021-04-04 12:37:51
214
原创 算法——图的排序
引言本文整理了常见的图排序相关算法,方便以后查阅。图BFSpackage bbm.graph;import java.util.LinkedList;import java.util.List;import java.util.concurrent.LinkedBlockingQueue;import static bbm.graph.BFS.Color.BLACK;import static bbm.graph.BFS.Color.GRAY;import static bbm.g
2021-04-04 12:37:45
926
原创 算法——图的最小生成树
引言本文整理了常见的图最小生成树相关算法,方便以后查阅。Kruskalpackage bbm.graph;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Set;/** * 最小权重生成树 *
2021-04-04 12:37:39
286
原创 算法——图的最短距离
引言本文整理了常见的图的最短距离相关算法,方便以后查阅。BellmanFordpackage bbm.graph;import java.util.Arrays;import java.util.LinkedList;import java.util.List;/** * 解决单源最短路径问题, 本例中使用的 Bellman-Ford 算法能够处理有负权重的问题,它的思想是通过对每一条边进行松弛化,重复遍历 V-1 次所有边 * (V = 节点数)。 * 这里的松弛化过程就是:我们用
2021-04-04 12:37:20
2946
原创 JNI 调试技术
引言如果你像我一样是一个 Java 程序员,并且经常进行 JNI 代码的开发,那么你一定也体会到了调试 JNI 代码的困难,比如有一天突然程序意外崩溃了,我们很难搞清楚它到底是因为什么崩溃的。接下来我要介绍的这几个技术,可以帮助我们快速的解决上述问题。解读 hs_err_pid 文件如果 JVM 在执行 native c++ 代码(JNI)的时候崩溃了,一般来说 JVM 会将错误报告写到一个文件中,在 Linux 平台上这个文件形如 /tmp/jvm-8666/hs_error.log, 而在 Ma
2021-04-04 12:37:05
739
原创 JSON Web Token
引言本文由我的同事 @like 投稿,介绍了 JWT(JSON Web Token)是什么,以及它的一些应用场景。背景前段时间看 Kubernetes 认证相关的内容,发现如果 Pod 要和 API Server 交互,需要为该 Pod 创建 ServiceAccount 并绑定相应的角色。比如 Dashboard 的配置文件如下:# ------------------- Dashboard Service Account ------------------- #apiVersion: v
2021-04-04 12:36:41
251
原创 JVM 简介
引言本系列文章整理了 JVM 相关的知识,本文作为开篇简单地介绍一下 JVM 的组成和结构。简介所谓虚拟机,就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统级虚拟机和程序虚拟机。前者有 Visual Box 等,是对真实物理计算机的仿真,提供一个完整的可运行操作系统的平台。而后者则专门为执行单个计算机程序设计,在 Java 虚拟机中执行的指令被称为 Java 字节码指令。Java 程序可以通过 Java 虚拟机运行于各大主流体系结构的平台上,它以虚拟机为
2021-04-04 12:36:09
299
原创 JVM GC
引言前面我们已经在整体上简单地介绍了一下 JVM 组成部分,本文着重介绍其中 GC 相关的内容。垃圾回收相信在前面的 JVM 基本结构中,大家已经认识到了 JVM 中内存的结构,即方法区,堆,Java 栈,本地方法栈,PC 计数器,这些是由 JVM 维护的供 Java 程序使用的内存,我们称之为运行时数据区。除此之外,还有 JVM 自身要使用的内存,如执行引擎和本地库接口使用的内存,这些是在运行时数据区之外的。而我们接下来要谈论的垃圾回收,主要的回收目标就是堆空间。而这里所说的垃圾,特指内存中不
2021-04-04 12:35:59
309
原创 JVM 线程模型
引言本文着重介绍 JVM 线程模型相关的内容。线程模型我们知道,线程是比进程更轻量级的调度执行单元,而主流的操作系统都提供了线程的实现,Java 语言则提供了不同硬件和操作系统平台下对线程操作的统一抽象,每个执行了 start 函数且未结束的 java.lang.Thread 类实例就代表了一个线程。要想实现线程,主要有 3 种方式:使用内核线程实现、使用用户线程实现、使用用户线程加轻量级进程混合实现。可选方案使用内核线程实现内核线程(Kernel-Level Thread, KLT)就是直接
2021-04-04 12:35:52
1038
1
WebRTC-master.zip
2021-03-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人