自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

唐欢

要做就做到最好

  • 博客(306)
  • 资源 (5)
  • 问答 (2)
  • 收藏
  • 关注

原创 springboot 集成Dubbo2.7.8 ,连接zookeeper 提示错误 zookeeper not connected

springboot 集成Dubbo2.7.8 ,连接zookeeper 提示错误 zookeeper not connected

2023-12-05 11:26:39 821

原创 为了深入理解优秀的RPC框架Dubbo,从基于Netty手写一个RPC框架开始

在分布式服务框架中,在java领域中有很多实现远程通讯的技术,例如RMI、Hessian、SOAP、ESB 和JMS。要实现网路机器间的通讯,首先需要看看计算机网络通信的基本原来,在底层层面看,网络通信需要做得就是将流从一台计算机传输到另一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有TCP、UDP ,而TCP 和UDP 都是基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO主要有BIO、NIO、AIO三种方式,所有的分布式应用通讯都基于这个原理而实现。

2023-11-27 14:24:27 976

原创 常用服务注册中心与发现(Eurake、zookeeper、Nacos)笔记(一)基础概念

在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单,服务注册中心还需要以心跳的方式去监控清单中的服务是否可用,若不可用需要从服务清单中剔除,达到排除故障服务的效果。服务注册中心的作用就是服务注册与服务发现。注册中心解决的是服务管理和服务的依赖关系管理,为了解耦服务提供者和服务消费者。

2023-11-23 14:52:54 670

原创 Netty 高性能原因之一 采用了高性能的NIO 模式

I/O 全称Input/Output,即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入/输出。涉及 I/O 的操作,不仅仅局限于硬件设备的读写,还要网络数据的传输。无论是从磁盘中读写文件,还是在网络中传输数据,可以说 I/O 主要为处理人机交互、机与机交互中获取和交换信息提供的一套解决方案。前两组主要从传输数据的数据格式不同,进行分组;后两组主要从传输数据的方式不同,进行分组。

2023-11-07 09:09:01 136

原创 用十万字讲明白linux和java的零复制技术

零拷贝(zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。实现零拷贝用到的最主要技术是 DMA 数据传输技术和内存区域映射技术。

2023-10-31 10:04:43 132

原创 面试中被问到:Netty中的零拷贝机制是怎么样的?

零拷贝(Zero-copy), CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。Zero Copy的模式中,避免了数据在用户空间和内存空间之间的拷贝,从而提高了系统的整体性能。

2023-10-23 09:07:34 271

原创 为什么说Decoder与Encoder 是Netty 的核心组件,Netty 是如何使用模板方法模式高效完成解码和编码的,用1万字进行一个彻底剖析

Netty 发送和读取数据的地方是ByteBuf缓冲区,对于发送端,每次发送就是向通道写入一个ByteBuf,发送数据时先填好ByteBuf,然后通过通道发送出去。对于接收端,每一次读取就是通过Handler业务业务处理器的入站方法,从通道读到一个ByteBuf。粘包,指 Receiver (接收端)收到一个 ByteBuf ,包含了 Sender (发送端)的多个 ByteBuf ,发送端的多个 ByteBuf 在接收端“粘”在了一起。

2023-10-16 10:51:13 127

原创 docker 安装mysql8

it:-i->以交互模式运行容器,-t->为容器重新分配一个伪输入终端,一般这2个都是一块用的。-p 3333:3306 没用默认的3306,改成了宿主机的3333映射容器的mysql3306。然后输入MYSQL_ROOT_PASSWORD 参数设置的密码;MYSQL_ROOT_PASSWORD设置root用户的密码。–name 位容器起一个名字 就要mysql01。使用navicat premium 测试远程连接。-e 配置容器内的应用,这里设置了一个密码。可以查看下mysql的版本号。

2023-10-10 09:06:52 149

原创 序列化和反序列化:将数据变得更加通用化

序列化和反序列化是计算机领域中常用的概念,用于将对象或数据结构转换为字节序列(序列化)和将字节序列转换回对象或数据结构(反序列化)。序列化是指将对象或数据结构转换为字节序列的过程。通过序列化,可以将对象保存到文件、数据库或进行网络传输。在序列化过程中,对象的状态和数据会被转换为一系列的字节,以便能够在不同的环境中进行传输或持久存储。反序列化则是将字节序列转换回对象或数据结构的过程。通过反序列化,可以重新构造出原始的对象或数据结构,使其可以被程序使用。序列化和反序列化可以实现跨平台的数据交换。

2023-09-18 10:00:00 174

原创 docker 容器编排工具 docker-compose从0到精通

Docker-Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用Compose 来进行编排管理。

2023-09-11 10:00:00 157

原创 centos7 下使用docker安装常见的软件:Redis

关于docker的基础知识,请见《在自己学习的过程中经常会需要动手安装一下常见的工具,本篇就手把手带你用docker安装一遍。

2023-09-06 21:43:10 358

原创 别在说自己不知道docker了,全文通俗易懂的给你说明白docker的基础与底层原理

Docker 是一个开源的应用容器引擎,基于Go语言进行开发实现并遵从Apache2.0 协议开源,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

2023-08-28 17:11:33 291

原创 mysql 笔记(三)-InnoDB存储引擎 锁定机制

数据库锁机制是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序锁设计的一种规则.Mysql 由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有比较大的区别.

2023-08-21 17:46:35 200

原创 mysql 笔记(二)-mysql存储引擎

InnoDB是从5.5版本开始的mysql默认事务型存储引擎, 它被设计用来处理大量的短期(short-lived)事务. 可以确保事务的完整提交(Commit)和回滚(Rollback).InnoDB 不仅缓存索引还要缓存真实数据,对内存要求比较高,而且内存大小对性能有决定性的影响.其数据文件结构:(1)表名.frm 存储表结构(mysql8 开始,合并在表名.ibd中);(2)表名.ibd 存储数据和索引InnoDB 存储引擎的特点是行锁设计、支持外键,默认读取操作不会产生锁。

2023-08-14 09:16:01 122

原创 mysql 笔记(一)-mysql的架构原理

查询缓存(Cache&Buffer),这是MySQL的一个可优化查询的地方,如果开启了查询缓存且在查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;存储引擎负责MySQL中数据的存储与提取,与底层系统文件进行交互.MySQL 存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异.最常见的存储引擎是MYISAM和InnoDB.1.查询缓存的效果取决于缓存的命中率,只有命中缓存的查询效果才能有改善,因此无法预测其性能。

2023-08-07 09:43:39 82

原创 全网最全讲的最详细的多线程原理

在我们开始讲多线程之前,我们先来了解一下什么是进程,什么是线程。进程和线程是操作系统中两个容易混淆的概念。

2023-07-31 20:48:46 334

原创 你知道 netty的ChannelInBoundHandler生命周期以及Pipeline入站处理流程吗?

当对端数据入站到Netty通道时,Netty将触发流水线Pipeline上开启入站操作处理,触发入站处理器ChannelInboundHandler多对应的入站API。入站处理器有两个接口,一个是超级接口ChannelHander,另一个是ChannelInboundHandler,ChannelInboundHandler接口继承了超级接口ChannelHandler,如下图所示:ChannelInboundHandler的常用方法如下图所示:/**

2023-07-24 13:26:50 229

原创 带你手写一个hashMap,通过手写hashMap带你剖析hashMap的源码

手写一个hashMap 是为了更好的理解hashMap的源码,一起来剖析一下hashMap的源码

2023-07-17 14:20:59 184

原创 30张图带你弄懂 二叉树、AVL、红黑树,他们之间有什么联系,AVL树和红黑树如何平衡

树(Tree)是若干个结点组成的有限集合,其中必须有一个结点是根结点,其余结点划分为若干个互不相交的集合,每一个集合还是一棵树,但被称为根的子树。注意,当树的结点个数为0时,我们称这棵树为空树,记为Φ。二叉树是树的其中一种。二叉树(Binary Tree)是一种每结点最多拥有2个子树的树结构,其中第1个子树被称为左子树,第2个子树被称为右子树。注意,当二叉树的结点个数为0时,我们称这个二叉树为空二叉树,记为Φ。二叉树是有序的,即若将其左、右子树颠倒,就成为另一棵不同的二叉树。

2023-07-10 14:34:28 681

原创 你知道零复制以及netty的零复制是怎么回事吗?

在开始介绍零复制之前,我们先来明确几个概念:(1) 上下文切换: 当用户程序向内核发起系统调用时 ,cpu将用户进程从用户态切换到内核态, 当系统调用返回时,cpu将用户进程从内核态切换回用户态.(2) cpu拷贝:由CPU直接处理数据的传送,数据拷贝时会一直占用cpu的资源(3) DMA拷贝: 由CPU向DMA磁盘控制器下达命令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,从而减轻了CPU资源的占有率.

2023-07-03 12:41:47 123

原创 通过netty源码带你一步步剖析NioEventLoop 的任务队列原理

NioEventLoop 的异步任务队列成员:NioEventLoop 中对newTaskQueue 接口的实现,返回的是JCTools工具包Mpsc队列(多生产者单一消费者无锁队列,(无界和有界都有实现)

2023-06-27 09:12:39 201

原创 从源码的角度带你一步步剖析NioEventLoop(反应器)的三步曲

Netty 中的反应器组件有多个实现类,这些实现类与其通道类型相互匹配. 对应于NioSocketChannel通道,Netty的反应器类为NioEventLoop(Nio事件轮询).

2023-06-19 14:53:25 55

原创 哈希表--想彻底了解哈希表,看这一篇文章就可以了

哈希表也叫散列表。从根本上来说,一个哈希表包含一个数组,通过特殊的关键码(也就是key)来访问数组中的元素。哈希表的主要思想:(1)存放Value的时候,通过一个哈希函数,通过关键码(key)进行哈希运算得到哈希值,然后得到映射的位置, 去寻找存放值的地方 ,(2)读取Value的时候,也是通过同一个哈希函数,通过关键码(key)进行哈希运算得到哈希值,然后得到 映射的位置,从那个位置去读取。

2023-06-12 14:35:41 905

原创 【数据结构】虽然很难很抽象,但是你还是得努力弄懂的数据结构——链表,基本上你每一段代码都可能会用到

要删除的第pos个结点,通过q引用,被删除结点的前一个结点,通过变量p引用。单链表进行插入操作的前提是链表不为空,条件满足之后,分别找到要删除的pos个结点,通过q引用,和被删除结点的前一个结点(通过变量p引用),修改p引用结点指针域的值即可完成删除操作,语句为p.next=q.next,删除操作完成后,链表长度减1,并返回被删除结点数据域的值。单链表的删除是指删除单链表的第pos个结点,要实现该结点的删除,可将删除位置之前的结点,即第pos-1个结点的指针域指向第pos+1个结点。其泛型类的定义如下,

2023-06-05 09:34:38 246

原创 【数据结构】虽然很难很抽象,但是你还是得努力弄懂的数据结构——数组,你常用但是你懂它吗

顺序表的插入是指在顺序表的第pos-1个元素和第pos个元素之间插入一个新的元素,此时,顺序表中插入位置前后的元素之间的逻辑关系将发生变化,除非pos=n+1,否则必须通过顺序移动数据元素的存储位置才能体现逻辑关系的变化。顺序表的删除是指删除顺序表中的第pos个元素,删除操作也会导致被删除位置前后的元素之间的逻辑关系发生变化,因此,除非删除位置是表中的最后一个元素,否则也必须通过顺序移动数据元素的存储位置才能体现逻辑关系上的变化。当在顺序表中某个位置上插入或删除一个数据元素时,其时间主要耗费在移动元素上。

2023-05-29 10:50:14 238

原创 从内核角度剖析Netty高性能的奥秘IO多路复用模型与Reactor模式

Netty 是Jboos 提供的java开源框架, 是基于非阻塞IO(NIO)的客户端/服务器编程框架, 它既能快速开发高并发、高可用、高可靠的网络服务器程序,也能开发高可用、高可靠的客户端程序。Netty 作为异步框架, Netty 的所有IO操作都是异步非阻塞的, 通过feature-Listener机制,用户可以方便地主动获取或者通过通知机制获取IO操作结果。相比JDK原生NIO,Netty具有API使用简单、功能强大、定制能力强、性能高、成熟稳定等优点。

2023-05-22 09:36:22 818

原创 解密Netty中的Reactor模式

如果使用EventLoopGroup的无参数构造函数,没有传入线程数量或者传入的数量为0,默认的EventLoopGroup内部线程数量为最大可用的CPU处理器数量的2倍。Reactor模式和通道紧密相关,反应器的查询和分发的IO事件都来自于Channel组件, 而Channel组件也是Netty中非常重要的组件,Netty中不直接使用java NIO的Channel组件,对Channel组件进行了自己封装,对于每一种通信连接协议,netty都实现了自己的通道,每一种协议基本上偶有NIO和OIO两个版本。

2023-05-15 09:23:31 350

原创 基于jdk11从源码角度剖析AQS 抽象同步其的核心原理

AQS是JUC提供的一个用于构建锁和同步容器的基础类,是CLH队列的一个变种。它实现了锁的基本抽象功能,支持独占锁与共享锁两种方式。AQS的类图如下:AQS队列内部维护的是一个FIFO的双向链表,其内部通过节点head和tail记录队首和队尾元素,队列元素的类型为Node。其中Node中的thread变量用来存放进入AQS队列里面的线程;Node节点内部的SHARED用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的,EXCLUSIVE用来标记线程是获取独占资源时被挂起后放入AQS队列的;

2023-05-08 16:10:46 553

原创 多线程的同步问题的经典案例生产者-消费者模式剖析

生产者-消费者问题(Producer-Consumer Problem)也称有限缓冲问题(Bounded-Buffer Problem),是一个多线程同步问题的经典案例。生产者-消费者问题描述了两个访问共享缓冲区的线程,即生产者线程和消费者线程,在实际运行时会发生的问题。生产者线程的主要功能是生成一定量的数据放到缓冲区中,然后重复此过程。消费者线程的主要功能是从缓冲区提取(或消耗)数据。

2023-04-23 12:39:33 904

原创 基于JDK11从源码角度剖析可重入锁ReentrantLock的获取锁和解锁

ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列里面。

2023-04-17 09:55:08 211

原创 从JVM 源码的角度深度剖析CAS是如何实现原子性的

CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。

2023-04-10 09:11:11 390

原创 以JDK11+AtomicInteger为例,从源码的角度清晰明白的剖析Atomic基础原子类是如何实现线程安全的

什么是线程安全呢? 当多个线程并发访问某个java对象时,无论系统如何调度这些线程,也无论这些线程将如何交替操作,这个对象都能表现出一致的、正确的行为,那么对这个对象的操作就是线程安全的。

2023-04-03 09:09:16 695

原创 【速看】一文清明讲明白线程同步关键字synchronized

synchronized 关键字是java的保留字,synchronized 关键字保障了原子性、可见性和有序性。在java中,线程同步使用最多的方法是使用synchronized关键字,使用synchronized(synchObject)调用相当于获取synchObject的内置锁,对临界区代码段进行排他性保护。synchronized块是java提供的一种原子性内置锁,java中的每个对象都可以把它当做一个同步锁来使用,这些java内置的使用者看不到的锁被称为内部锁,也叫做监视器锁。

2023-03-27 09:19:29 378

原创 从JVM源码角度解析设置了线程优先级为什么还不一定优先执行

从源码中可知,线程默认的级别是5,如果设定的线程级别大于10或者小于1就会抛出IllegalArgumentException异常,如果指定的线程优先级大于线程所在的group的优先级,那么指定的优先级将会失效,取而代之的是group的最大优先级,否则就调用native方法setPriority0(…从源代码可知道为什么我们在java代码中设置了比较高的线程优先级,但是不一定先执行的原因了, 因为java线程优先级对应的不同JVM操作系统的线程并不定是高的,有可能是低优先级也有可能是相同等级的优先级。

2023-03-20 09:39:05 181

原创 【权威说明】从JVM源码的角度带你看明白Thread.sleep() 是否占用CPU?

在示例中把进程的ID打印出来了,打印出来的原因是可以使用jstack (pid 表示java进程id,可用jps命令查看) 查看所有线程的状态,jstack可以生成或导出jvm 虚拟机运行实例当前时刻的线程快照。Thread.sleep的在jvm层面上是调用thread中SleepEvent对象的**park()**方法实现阻塞线程,在此过程中会通过判断时间戳来决定线程的睡眠时间是否达到了指定的毫秒。如果睡眠的时间为0,那么会调用系统级别的睡眠方法os::sleep(),睡眠时间为最小时间间隔。

2023-03-13 09:58:25 1327

原创 从JVM源代码的角度一步一步给你讲清楚线程状态的本质以及线程状态的由来

从源码可知,根据操作java字段把java状态的偏移量拿出来,java状态的偏移量就是thread中的成员threadstatus(线程状态)的相对于它对象的头部偏移量,然后把状态state放进去,简单说就是C++中操作java的成员变量,把threadstatus的地址拿出来,把线程的state值放进去,把线程状态修改为sleeping。接来敲黑板,考试重点来了, 线程状态是如何修改的,以javaThread::sleep(jlong millis)为例进行解释,这个过程是在C++中进行的。

2023-03-06 09:21:50 282

原创 【JDK源码】一文清晰明白的讲清楚多线程的ThreadLocal,避免因使用ThreadLocal导致内存泄漏

在java的多线程并发执行过程中,为保证多个线程对变量的安全访问,可以将变量放到TrheadLocal类型的对象中,使变量在每个线程中都有独立值,不会出现一个线程读取变量时被另一个线程修改的现象。ThreadLocal类通常被翻译为“线程本地变量”类或者“线程局部变量”类。ThreadLocal 位于JDK的java.lang核心包中,如果程序创建了一个ThreadLocal实例,那么在访问这个变量的值时,每个线程都会拥有一个独立、自己的本地值。ThreadLocal 代表的是线程本地变量,

2023-02-27 10:49:57 324

原创 从源码的角度弄明白BeanFactory的后处理的5件事

BeanFactory 作为Spring 中容器功能的基础,用于存放所有已经加载的bean,为了保证程序上的高可扩展性,Spring 针对BeanFactory做了大量的扩展,其中包括激活注册的BeanFactoryPostProcessor,注册BeanPostProcessor,初始化消息资源,初始化ApplicationEvenMulticaster,注册监听器.

2023-02-20 09:37:58 55

原创 源码深度解析Spring Bean的加载

如果从缓存职工得到了bean的原始状态,则需要对bean进行实例化,调用getObjectForBeanInstance()方法检测当前bean是否是FactoryBean类型的bean,如果是,那么需要调用该bean对应的FactoryBean实例中的getObject()作为返回值,具体代码实现实现如下,在Sring 的加载过程中,在初始化某一个bean的时候首先会初始化这个bean所对应的依赖。那么当依赖注入的时候,就会产生当A 还未创建完的时候因为对于B 的创建再次返回创建A,

2023-02-13 09:05:42 412

原创 手把手一步步带您解读创建AOP代理的源码

Spring AOP 的功能基本上都是由AnnotationAwareAspectJAutoPr oxyCreator 来实现的, 那具体是怎么实现的呢,我们先来看一张AnnotationAwareAspectJAutoPr oxyCreator的层次结构图(IDEA 在windows下F4快捷键查看 )到此为止,所有bean的增强器都获取完成并且已经挑选了最合适的增强器,接下来就该创建代理,由AbstractAutoProxyCreator.createProxy()方法实现。①获取当前类中的属性,

2023-02-06 09:28:21 359

Excel导入代码

减少Io 读写 的Excel导入,主要的使用的是POi方法,希望对你有帮组

2015-06-18

模拟activiti的拦截器

Activiti 提供了命令拦截器的功能,外界对Activiti流程中的各个实例进行操作,相当于对数据的相关操作.Activiti的拦截器使用命令模式和职责链模式实现的.

2015-04-14

quartz-1.5.0.jar

quartz-1.5.0.jar

2015-03-21

思维导图C盘文件包

四维导图安装时提示路径太长,把此文件包覆盖C盘下的Mindjet,就可以解决问题了!

2012-12-20

ie网页无法打开

当你的浏览器无法打开的时候,你可以尝试用用这个方法,挺好的!

2011-12-05

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

TA关注的人

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