自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:BTC原理(二):网络

这个是不可能的,不论算力再强,因为没法伪造别人账户的签名(除非获得其私钥),所以没法伪造交易将别人账户上的钱转走。即便是仗着自己算力强,强行将不合法的区块发布到区块链上并沿着这条链继续延伸,诚实的节点依然不会沿着这条不合法的长链延伸,所以还是没用的。..................

2022-07-31 15:40:49 1962

原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:BTC原理(一):密码学原理、数据结构、协议、实现

比特币被称为加密货币(crypto-currency),但其实加密货币是不加密的,区块链上所有交易内容(包括账户地址、转账金额等)都是公开的。比特币中主要用到了密码学中的两个功能:哈希和签名在密码学中用的哈希函数被称为cryptographic hash function,其两个重要性质分别为collision resistance(抗碰撞性)和hiding(隐藏性)哈希碰撞:有两个输入x和y,且x!=y,给定一个哈希函数H(),算出来H(x)=H(y),则称为哈希碰撞,即两个不同的输入算出来的哈希值是相等

2022-07-24 17:13:12 4678 1

原创 Go基础学习笔记(二):错误处理和资源管理、Goroutine、Channel、迷宫的广度优先搜索、http及其他标准库

1)defer调用2)何时使用defer调用3)、服务器统一出错处理项目根目录下有hello world.txt,访问http://localhost:8888/list/hello%20world.txt,返回hello world访问http://localhost:8888/list/,返回Not Found拷贝一个hello world2.txt文件,修改访问权限访问http://localhost:8888/list/hello%20world2.txt,返回Forbidden1)

2022-07-02 11:03:11 559

原创 Go基础学习笔记(一):基础语法、内建容器、面向对象、依赖管理、面向接口、函数式编程

1)使用var关键字可放在函数内,或直接放在包内使用var()集中定义让编辑器自动决定类型2)使用:=定义变量只能在函数内使用1)内建变量类型2)强制类型转换:类型转换是强制的,Go语言只有强制类型转换没有隐式类型转换3)、常量与枚举1)常量定义const数值可作为各种类型使用2)使用常量定义枚举类型3)变量定义要点回顾1)ifif的条件里不需要括号if的条件里可以赋值if的条件里赋值的变量作用域就在这个if语句里2)switchswitch会自动break,除非使用fall

2022-06-20 08:38:31 738 2

原创 SkyWalking8.7源码解析(六):ExitSpan和LocalSpan、链路追踪上下文、上下文适配器ContextManager、DataCarrier、链路数据发送到OAP

27、ExitSpan和LocalSpan1)、ExitSpanExitSpan代表服务消费侧,比如Feign、Okhttp。ExitSpan是链路中一个退出的点或者离开的Span。在一个RPC调用中,会有多层退出的点,而ExitSpan永远表示第一个。比如,Dubbox中使用HttpComponent发起远程调用。ExitSpan表示Dubbox的Span,并忽略HttpComponent的Span信息EntrySpan和ExitSpan的区别就在于:EntrySpan记录的是更靠近服务这一侧的

2022-05-30 09:10:34 3614 1

原创 SkyWalking8.7源码解析(五):链路基本知识、链路ID生成、TraceSegment、Span基本概念、Span完整模型、StackBasedTracingSpan

21、链路基本知识 上图是一个下单接口的链路,在链路中首先要理解的概念是Segment,Segment表示一个JVM进程内的所有操作,上图中有6个Segment。Gateway Segment是Mall Segment的parent,通过parent关系就可以把多个Segment按顺序拼起来组装成一个链路 一个Segment里可能发生多个操作,如上图Segment中操作1是查Redis,操作2是查MySQL,这就是两个Span,Span表示一个具体的操作。Span之间也是基于parent的关系构建起

2022-05-15 09:40:21 4830 3

原创 SkyWalking8.7源码解析(四):服务GRPCChannelManager、ServiceManagementClient、CommandService、SamplingService

14、服务-GRPCChannelManagerorg.apache.skywalking.apm.agent.core.boot.BootService是SkyWalking Agent中所有服务的顶层接口,这个接口定义了一个服务的生命周期,分为prepare、boot、onComplete、shutdown四个阶段public interface BootService { /** * 准备阶段 * * @throws Throwable */

2022-05-03 09:44:31 2617 1

原创 Kubernetes容器网络(三):容器跨主机Overlay网络、路由模式实验

前言前三篇文章我们分别介绍了Docker网络原理、Flannel网络原理、Calico网络原理,本文将通过实验的方式带你进一步理解容器跨主机网络实现 两个容器docker1和docker2分别位于节点Node1和Node2,如何实现容器的跨主机通信呢?一般来说有两种实现方式:封包模式:利用Overlay网络协议在节点间建立隧道,容器之间的网络包被封装在外层的网络协议包中进行传输,例如:Flannel UDP、Flannel VXLAN、Calico IPIP路由模式:容器间的网络包传输全部用三层

2022-05-01 14:44:45 2295

原创 Kubernetes容器网络(二):Calico网络原理

1、前置网络知识1)、BGP自治系统AS:在单一的技术管理下的一组路由器,而这些路由器使用一种AS内部的路由选择协议和共同的度量以确定分组在该AS内的路由,同时还使用一种AS之间的路由协议以确定在AS之间的路由路由选择协议分为:内部网关协议IGP:一个AS内使用的,如RIP、OSPF外部网关协议EGP:AS之间使用的,如BGP边界网关协议(BGP)是不同自治系统的路由器之间交换路由信息的协议,是一种外部网关协议BGP的工作原理如下:每个自治系统的管理员要选择至少一个路由器(可以有多个)作

2022-04-16 16:36:42 7437

原创 Kubernetes容器网络(一):Flannel网络原理

前言本文主要分享Flannel如何解决跨主机容器之间通信问题的,如果你对主机内容器之间通信流程还不了解,建议先看下这篇文章:Docker网络原理1、前置网络知识1)、tun/tap设备tun/tap设备在虚拟机的组网过程中起到作用。tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装tun/tap设备到底是什么?从Linux文件系统的角度看,它是用户可以用文件句柄操作的字符设备;从网络虚拟化角度看,它是虚拟网卡,一端连着网络协议栈,另一端连着用户态程序t

2022-04-05 09:40:18 7338 5

原创 Docker网络原理

前言Docker有4种网络通信模型,分别是:bridge、host、none、container,默认使用的网络模型是bridge,本文中用到的也是bridge网络模型本文分享Docker网络原理,主要包含三部分内容:容器之间通信容器访问外网外部访问容器1、前置网络知识1)、veth pairveth是虚拟以太网卡(Virtual Ethernet)的缩写。veth设备总是成对的,因此称之为veth pair。veth pair一端发送的数据会在另外一端接收。根据这一特性,veth pa

2022-03-19 18:03:51 4383 2

原创 Kubernetes学习笔记(四):持久化存储与安全认证

一、持久化存储容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,Kubernetes引入了Volume的概念Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,Kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当

2022-03-12 09:56:03 1113

原创 Kubernetes学习笔记(三):Service与Ingress

一、Service详解1、Service介绍在Kubernetes中,Pod是应用程序的载体,我们可以通过Pod的IP来访问应用程序,但是Pod的IP地址不是固定的,这也就意味着不方便直接采用Pod的IP对服务进行访问为了解决这个问题,Kubernetes提供了Service资源,Service会对提供同一个服务的多个Pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的Pod服务Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服

2022-03-05 16:59:45 3587

原创 Kubernetes学习笔记(二):Pod控制器详解:资源元信息、ReplicaSet、Deployment、DaemonSet、Job、CronJob

1、资源元信息 Kubernetes的资源对象组成:主要包括了Spec、Status两部分。其中Spec部分用来描述期望的状态,Status部分用来描述观测到的状态Kubernetes的元数据部分。该部分主要包括了用来识别资源的标签:Label;用来描述资源的注解:Annotation;用来描述多个资源之间相互关系的OwnerReference1)、LabelLabel是Kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择Label的特点:一个La

2022-02-22 08:37:43 2207

原创 Kubernetes学习笔记(一):Pod详解:Pod配置、Pod生命周期、Pod调度、容器设计模式

1、Pod介绍Pod是Kubernetes进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器1)、Pod=进程组在Kubernetes里面,Pod实际上正是Kubernetes抽象出来的一个可以类比为进程组的概念由四个进程共同组成的一个应用Helloworld,在Kubernetes里面,实际上会被定义为一个拥有四个容器的Pod就是说现在有四个职责不同、相互协作的进程,需要放在容器里去运行,在Kubernet

2022-02-13 14:51:25 3642 1

原创 Kubernetes集群环境搭建&部署Dashboard

1、Kubernetes集群搭建本次环境搭建需要三台CentOS服务器(一主二从),然后在每台服务器中分别安装Docker(18.06.3)、kubeadm(1.18.0)、kubectl(1.18.0)和kubelet(1.18.0)三台主机配置信息如下:角色IP地址操作系统配置Master192.168.56.20CentOS7.5+2C2GNode1192.168.56.21CentOS7.5+2C2GNode2192.168.56.22Cen

2022-02-07 10:54:41 3064 1

原创 SkyWalking8.7源码解析(三):静态方法插桩、构造器和实例方法插桩、插件拦截器加载流程、JDK类库插件工作原理

10、静态方法插桩Transform的transform()方法中调用每个插件的define()方法去做字节码增强,AbstractClassEnhancePluginDefine的define()方法中再调用自己的enhance()方法做字节码增强,enhance()方法源码如下:public abstract class AbstractClassEnhancePluginDefine { /** * Begin to define how to enhance class. A

2022-01-02 17:41:32 3298 6

原创 SkyWalking8.7源码解析(二):定制Agent、服务加载、witness组件版本识别、Transform工作流程

6、定制Agentpublic class SkyWalkingAgent { private static ILog LOGGER = LogManager.getLogger(SkyWalkingAgent.class); /** * Main entrance. Use byte-buddy transform to enhance all classes, which define in plugins. * -javaagent:/path/to/agent

2021-12-25 16:53:37 3123 1

原创 SkyWalking8.7源码解析(一):Agent启动流程、Agent配置加载流程、自定义类加载器AgentClassLoader、插件定义体系、插件加载

1、Agent启动流程找到入口方法SkyWalkingAgent的premain()方法,源码如下:public class SkyWalkingAgent { /** * Main entrance. Use byte-buddy transform to enhance all classes, which define in plugins. * -javaagent:/path/to/agent.jar=agentArgs * -javaagent:

2021-12-12 08:42:43 12052

原创 synthetic关键字和NBAC机制

1、synthetic关键字根据Java语言规范,所有存在于字节码文件中,但是不存在于源代码文件中的构造,都应该被synthetic关键字标注这里的构造,原文是Constructs,实际上指的是字段、方法和构造器([构造] => Constructs => Field、Method、Constructor)由Java编译器在编译阶段自动生成的构造都要被synthetic关键字标注1)、isSynthetic()java.lang.reflect中的Field、Method、Const

2021-12-05 16:07:52 1003

原创 《王道操作系统》:第二章 进程管理:进程的同步与互斥、死锁

2.3_进程的同步与互斥2.3.1_进程的同步与互斥1)、进程同步同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进2)、进程互斥两种资源共享方式:互斥共享方式(系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源)同时共享方式(系统中的某些资

2021-10-31 15:24:16 605

原创 Disruptor核心原理、源码解析

前言前两篇Disruptor学习笔记:基本使用、核心概念和原理和Netty整合Disruptor实战文章中,主要讲解了Disruptor的一些API的使用、概念等,本文会进一步来解析Disruptor的核心原理和相关源码1、Disruptor的性能为什么这么高?内存分配更加合理,使用RingBuffer数据结构,数组元素在初始化时一次性全部创建,提升缓存命中率;对象循环利用,避免频繁GC能够避免伪共享,提升缓存利用率采用无锁算法,避免频繁加锁、解锁的性能消耗(CAS操作代替锁)支持批量消费,消

2021-10-10 17:24:34 2591

原创 ClickHouse MergeTree原理解析

一、MergeTree原理解析1、MergeTree的创建方式与存储结构MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合并成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来1)、MergeTree的创建方式创建MergeTree数据表的完整语法如下所示:CREATE TABLE [IF NOT EXISTS] [db.]table_nam

2021-10-05 09:22:49 1694

原创 ClickHouse学习笔记(二):执行计划、建表优化、语法优化规则、查询优化、数据一致性

本文档基于目前较新稳定版21.7.3.14一、Explain查看执行计划在ClickHouse 20.6版本之前要查看SQL语句的执行计划需要设置日志级别为trace才能可以看到,并且只能真正执行sql,在执行日志里面查看。在20.6版本引入了原生的执行计划的语法。在20.6.3版本成为正式版本的功能1、基本语法EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]1)PLAN

2021-09-25 16:04:36 3708

原创 Netty整合Disruptor实战

1、Netty实现服务端与客户端数据传输1)、依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.12.Final</version> </dependency>

2021-09-20 17:26:52 1519

原创 Disruptor学习笔记:基本使用、核心概念和原理

Disruptor是英国外汇交易公司LMAX开发的一个高性能队列(系统内部的内存队列),研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖1、快速入门1)、步骤创建一个工厂Event类,用于创建Event类实例对象需要有一个监听事件类,用于处

2021-09-20 09:29:48 1577

原创 ClickHouse学习笔记(一):ClickHouse安装、数据类型、表引擎、SQL操作

ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告一、ClickHouse的特点1、列式存储以下面的表为例:1)采用行式存储时,数据在磁盘上的组织结构为:好处是想查某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的2)采用列式存储时,数据在磁盘上的组织结构为:这时

2021-09-12 22:01:26 4221

原创 Jedis源码解析(二):JedisCluster模块源码解析

三、JedisCluster模块源码解析1、JedisCluster类结构由于Jedis本身不是线程安全的,所以选择使用对象池JedisPool来保证线程安全在JedisClusterInfoCache中,保存了节点和槽位的一一对应关系,为每个节点建立一个对象JedisPool,并保存在map中。这个类主要用于保存集群的配置信息2、JedisCluster的初始化public class JedisCluster extends BinaryJedisCluster implements J

2021-09-05 15:57:13 3660

原创 Jedis源码解析(一):Jedis简介、Jedis模块源码解析

一、Jedis简介1、Jedis对应Redis的四种工作模式对应关系如下:Jedis主要模块Redis工作模式JedisRedis Standalone(单节点模式)JedisClusterRedis Cluster(集群模式)JedisSentinelRedis Sentinel(哨兵模式)ShardedJedisRedis Sharding(分片模式)2、Jedis三种请求模式Jedis实例有3种请求模式:Client、Pipeline和Tra

2021-09-04 20:21:26 3137

原创 findLoadedClass详解

问题AClassLoader的parent为BClassLoader,BClassLoader的parent为CClassLoader,当AClassLoader调用loadClass()加载类,并最终由CClassLoader加载的类,到底算谁加载的?后续AClassLoader再加载相同类时,是否能直接从AClassLoader的findLoadedClass0()中找到该类并返回,还是说再走一次双亲委派最终从CClassLoader的findLoadedClass0()中找到该类并返回?Syste

2021-08-28 21:40:46 1718

原创 Netty学习笔记(二):Netty核心模块组件

二、Netty核心模块组件1、Bootstrap、ServerBootstrap一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类常用方法:public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup):该方法用于服务器端,用来设置两个Ev

2021-08-28 14:27:37 1093

原创 Netty学习笔记(一):Netty高性能架构设计

一、Netty高性能架构设计1、线程模型基本介绍目前存在的线程模型有:传统阻塞I/O服务模型Reactor模式根据Reactor的数量和处理资源池线程的数量不同,有3种典型的实现单Reactor单线程、单Reactor多线程、主从Reactor多线程Netty线程模型:Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor2、传统阻塞I/O服务模型1)、模型特点采用阻塞IO模式获取输入的数据每个连接都需要独立的线程完成数据的

2021-08-21 21:57:50 627

原创 BIO、NIO、AIO详解

一、Java的I/O演进之路Java共支持3种网络编程的I/O模型:BIO、NIO、AIOBIO:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 NIO:同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理 AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求

2021-08-15 10:41:15 19091 6

原创 ContextClassLoader详解

ContextClassLoader是通过Thread.currentThread().getContextClassLoader()返回该线程上下文的ClassLoader1、前置知识在讲解ContextClassLoader之前,需要先提两个知识点:1)双亲委派模型启动类加载器(Bootstrap ClassLoader):负责将放在<JAVA HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加

2021-08-14 11:27:44 2472

原创 vue中使用Echarts

安装echarts依赖npm install echarts --save代码实现封装Echarts组件Echarts.vue:<template> <div :id="id" :style="styleObject" /></template><script>import * as echarts from "echarts";import "echarts/lib/chart/pie";import "echarts/lib/com

2021-08-12 21:42:27 561 2

原创 Eureka核心源码解析(二):Eureka Server自我保护机制、失效剔除、Eureka Server集群复制

本文主要来解析Eureka应用实例下线、自我保护机制、失效剔除核心源码,基于1.9.8版本一、应用实例下线1、Eureka Client发起下线应用实例关闭时,Eureka Client向Eureka Server发起下线应用实例。需要满足如下条件才可发起:配置eureka.registration.enabled=true,应用实例开启注册开关。默认为false配置eureka.shouldUnregisterOnShutdown=true,应用实例开启关闭时下线开关。默认为truepub

2021-07-25 17:22:05 984

原创 Eureka核心源码解析(一):应用实例注册、续约、下线

本文主要来解析Eureka应用实例注册、续约的核心源码,基于1.9.8版本一、应用实例注册1、Eureka Client发起注册Eureka Client向Eureka Server发起注册应用实例需要符合如下条件:配置eureka.registration.enabled=true,Eureka Client向Eureka Server发起注册应用实例的开关InstanceInfo在Eureka Client和Eureka Server数据不一致每次InstanceInfo发生属性变化时,

2021-07-25 11:15:34 689 2

原创 Kafka复习(二):控制器、Kafka副本机制、为什么Kafka不支持主从读写分离、高水位和Leader Epoch、Kafka重平衡

四、控制器控制器组件(Controller)主要作用是在ZooKeeper的帮助下管理和协调整个Kafka集群。集群中任意一台Broker都能充当控制器角色,在运行过程中,只能有一个Broker成为控制器。控制器是重度依赖ZooKeeper的1、控制器的选举Broker在启动时,会尝试去ZooKeeper中创建/controller临时节点,第一个成功创建/controller临时节点的Broker会被指定为控制器ZooKeeper中还有一个与控制器有关的持久节点/controller_epoch,

2021-07-07 08:06:35 895 2

原创 Kafka复习(一):基本概念、生产者分区策略、生产者实现原理、消费者组、位移主题、重平衡、消费者分区分配策略

一、基本概念1、Producer+Consumer+BrokerProducer(生产者)将消息发送到Broker,Broker将收到的消息存储到磁盘中,而Consumer(消费者)负责从Broker订阅并消费消息,Consumer使用拉(Pull)模式从服务端拉取消息ZooKeeper是负责集群元数据的管理、控制器的选举2、Topic+Partition在Kafka中,发布订阅的对象是主题(Topic),生产者负责将消息发送到特定的主题(每一条消息都要指定一个主题),而消费者负责订阅主题并进行

2021-06-27 21:35:31 1240 2

原创 一致性哈希算法详解

1、使用哈希算法有什么问题?假设有一个由A、B、C三个节点组成的KV服务,每个节点存放不同的KV数据。通过哈希算法,每个key都可以寻址到对应的服务器,比如,查询key是key-01,计算公式为hash(key-01)%3,经过计算寻址到了编号为1的服务器节点A 但如果服务器数量发生变化,基于新的服务器数量来执行哈希算法的时候,就会出现路由寻址失败的情况,Proxy无法找到之前寻址到的那个服务器节点假如3个节点不能满足业务需求了,这时增加了一个节点,节点的数量从3变化为4,那么之前的hash(key

2021-06-13 10:33:31 9847 3

空空如也

空空如也

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

TA关注的人

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