- 博客(169)
- 收藏
- 关注
原创 容器文件系统
特别是这样的情况:假如这100个容器镜像都是基于”ubuntu:18.04”的,每个容器镜像只是额外复制了50MB左右自己的应用程序到”ubuntu: 18.04”里,那么就是说在总共50GB的数据里,有90%的数据是冗余的。每个容器都有对应的一个镜像,镜像是容器的静态形式,镜像包含容器运行所需要的各种二进制文件,库文件,配置文件等等,由这些文件打包共同组成容器的镜像。此时就会引入写复制技术,专门复制一份要修改的文件,然后任由对其进行更改,并不会影响原来的文件。,这个特性正好可以解决容器镜像的问题。
2025-04-04 21:16:13
375
原创 容器CPU解析
通过Cgroup来限制进程资源的使用,CPU Cgroup 是 Cgroups 其中的一个 Cgroups 子系统,它是用来限制进程的 CPU 使用的。其中容器相关的配置在这个目录下,对应的文件也是这些,可以针对每个容器中的所有进程进行cpu的限制。如图所示:容器中所有进程和的CPU使用率都是0.0但是总的CPU使用率却是25%,这是为什么呢?可以看到已经被限制住了。因此这个例子说明,在容器中使用top命令获取容器的cpu使用率是有问题的。不难发现宿宿主机上的cpu使用率和容器上的cpu使用率是一样的。
2025-04-03 23:09:18
399
原创 容器内存解析
容器本质上还是一个进程,是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的,这块主要涉及三部分内容:RSS,page cache和swap这三部分,容器基于memory Cgroup对内存进行限制,但是具体限制的什么呢?又有哪些参数可以对其进行控制呢?memory cgroup 限制的是容器真正使用到的内存,对于swap和page cache 都是内核级别的,是由操作系统进行管理的,是所有进程共享的,是不能被memory cgroup所限制的。
2024-07-02 22:19:33
989
原创 oauth2.0 授权码模式的一些思考
如果没有code,在用户授权完成后,授权服务携带access_token调用三方服务的后端接口,将access_token 交给第三方服务的后端,不能通过重定向的方式进行(access_token 不能暴露在浏览器中,避免泄漏)。这样的话,用户点击完授权后,不能跳转回第三方软件,一直在授权页面 体验不好,当然 第三方服务拿到token后,可以自己重定向回自己的页面。相对来说比较麻烦。
2023-02-21 19:04:44
446
原创 JVM常用工具
JVM常用工具1、JPS 查看Java进程简化版的 ps -ef | grep java一切操作的基础,需要先获取进程号。-l 参数,显示应用程序主类完整全路径-v参数,列出应用程序启动时的JVM启动参数2、JStat查看JVM运气时期的一些状态信息。如查看类型的加载,垃圾回收等。主要用来看一段时间的GC及内存使用情况。使用方式: jstat -gc 进程ID 时间 次数每1s时间查看一次JVM的垃圾收集情况,一共查看10次对应的命令为:jstat -gc xxx 1000 1
2022-08-03 16:49:08
1100
原创 synchronized 遇上 @Transactional
一、开篇初始情况下,我们的表格中只有一条id为2的数据,姓名为wangjie,年龄设置为0岁image.png1 不添加synchronized关键字首先,大家先来看看这个程序有没有什么问题 @Transactional public void transactionalMethod(){ User user = userDao.findOne(2); user.setAge(user.getAge()+1); userDao.up
2022-05-03 09:41:28
2241
2
原创 【记】自定义切面导致的事务失效问题
自定义切面导致的事务失效问题1、问题引出在本地测试中,发现在一段被@Transaction注解标注的方法即使抛出了RunTimeException,数据库依然会有新的记录产生,也就是事务没有回滚,代码如下:多次检查事务相关都没有的配置都没有问题,然后在Spring的事务方法中,打上断点,看下具体的执行逻辑:后来发现,retVal = invocation.proceedWithInvocation(); 执行完后,没有进cache代码块,而是直接进入commitTransactionAfterR
2021-12-01 23:58:12
2677
原创 MySql
MySql关联查询中的on和where要回答这个问题,需要知道SQL语句的执行顺序。SQL并不是按照书写的顺序来依次执行,每一次的执行都会形成一个虚拟的表,但是这个虚拟的表对用户是不可见的。FROM语句,对FROM前后的表做笛卡尔积。形成虚拟表1。ON语句,对虚拟表1 进行筛选,筛选条件用的是join_coddition,然后形成虚拟表2。JOIN语句,如果是外连接如left join和right join 则on 筛选条件对关联表无效,仅会用来过滤被关联表,关联表中的所有数据都会显示,而被关联表
2021-11-22 23:07:13
792
原创 RocketMQ存储设计
RocketMQ存储设计1、消息存储结构RocketMQ和大多数MQ一样,采用文件存储,消息存储在磁盘,这样broker宕机也不丢失数据。1.1、commitlog不区分topic,所有的消息,都存储在一个commitlog这个目录下面。这个目录下,默认的一个文件大小为1G,当一个文件满1G后,自动生成下一个文件,文件的命名采用的是偏移量的方式。这样的设计的主要目的是顺序写,目前的高性能磁盘,顺序写速度可以达到600MB/s ,超过了一般网卡的传输速度,这是磁盘比想象的快的地方 但是磁盘随
2021-11-14 18:21:41
1460
原创 Netty的writeAndFlush流程分析
Netty的writeAndFlush流程分析1、Write操作writeAndFlush是一个典型的出站操作,如果调用者是channel则从tail节点向前传播。 public final ChannelFuture writeAndFlush(Object msg) { return tail.writeAndFlush(msg); }看TailContext的writeAndFlush方法。会调用write方法,其中flush参数的值为true。先调用write
2021-07-19 21:56:12
3237
2
原创 RPC实战与核心原理笔记<四>
RPC实战与核心原理笔记<四>1、异常重试1.1、为什么需要异常重试当组装好数据,发起一次RPC调用的时候,由于网络抖动,导致RPC调用失败,如果此时距离超时时间还有一段距离,那么可以在可用的时间范围内,再重试一次,提高业务的可用率。1.2、重试的一些注意事项其实比起重试,最好还是不要重试,因为重试的局限性还是比较大。一方面需要保证业务的幂等性,也就是不论多少次调用,最终的结果都是一样的,如查询操作,更新操作,删除操作。另外重试的话,可能导致重试风暴,例如:A调用B的时候,B需要调用C,假设B
2021-07-18 22:30:55
317
1
原创 LengthFieldBasedFrameDecoder解析
LengthFieldBasedFrameDecoder源码解析LengthFieldBasedFrameDecoder 是netty中功能最强大,应用最广泛的一个解码器,可以方便的用其解析用户的自定义协议。1、参数说明lengthFieldOffset 长度域的偏移量,简单而言就是偏移几个字节是长度域lengthFieldLength : 长度域的所占的字节数lengthAdjustment : 长度值的调整值initialBytesToStrip : 需要跳过的长度值如图所示:上面
2021-07-18 11:41:53
6205
2
原创 IP协议详解
IP协议详解1、IP协议的特点IP协议是TCP/IP协议簇的动力,位于第三层的位置,为上层协议提供无状态,不可靠,无连接的服务能力。无状态,无连接,是指IP通信双方不同步传输的数据信息,在发送前也不考虑建立连接,每次数据都是独立的,与上次发送的数据没有联系。这样做有优点也有缺点,优点呢,就是效率高,简单,不用为了维护状态,存储 / 传输一些别的信息。缺点:数据会乱序,重复。如:同一个IP报文经过不同的路径到达接收端。不可靠是指IP协议不能保证IP数据包百分之百的到达接收端,只是尽最大努力的进行交付,
2021-07-17 00:13:13
1136
原创 RPC实战与核心原理笔记<三>
RPC实战与核心原理笔记<三>1、服务的发现1.1、为什么需要服务发现在RPC调用中,consumer端需要知道provider的ip和端口分别是多少,只有这样才可以建立TCP连接,才能发送数据。那么如何告诉consumer关于provider的这些信息呢?另外,这些信息可能会随时发生变化,例如provider扩容了,缩容了,重启端口变化了…因此这个如果写死,或者类似的方式肯定是不行的,因为这个信息是随时变化的,那么如何解决呢?这里便引入了服务发现。提供服务发现的是注册中心。之所以和注册中心之间
2021-07-14 22:02:14
739
1
原创 RPC实战与核心原理笔记<二>
RPC实战与核心原理笔记<二>1、通信协议提到协议,可能最熟悉不过的就是HTTP,HTTPS协议,TCP,UDP协议等等。那么什么是协议呢?简单而言协议就是一种规定,或者说是一种规定,就像咱们的语言一样,要有一个统一的标准,不然是无法通信的,不能互相理解。2、协议的作用只有二进制数据才能在网络中进行传播,应用程序将数据写到socket缓冲区后,通过网卡发送到网络中,由于缓冲区和滑动窗口的存在,可能将一个包分成好几个小包进行发送,也有可能将几个小包合成一个大包进行发送,至于如何合并或者拆分,这个是程序
2021-07-13 22:12:57
1268
1
原创 RPC实战与核心原理笔记<一>
RPC实战与核心原理笔记<一>1、什么是RPCRPC 远程过程调用,听起来比较抽象,其实调用已经很熟悉了,如方法调用,方法A调用方法B这个过程就是一次调用,只不过通常方法A和方法B都是在一个进程内的。而远程调用,之所以称之为远程因为方法A和方法B在不同的进程中。两张图对比后者是不同进程之间的方法调用,数据传输是通过网络完成的。其实这个调用不仅仅局限于方法,方法 / 函数,是完成一件事的统称,而这一件事不仅仅局限于程序中的方法调用,例如对mysql的访问,前端使用HTTP调用后端提供的
2021-07-11 23:45:04
2184
3
原创 Innodb 的buffer pool
Innodb 的buffer pool1、buffer pool的由来在innodb存储引擎中,数据是以页为单位,存储在表空间中的,而表空间只不过是对一个或者几个实际文件的抽象,也就是说数据最终是存储在磁盘上的。而磁盘的访问速度慢,而且innodb存储引擎访问磁盘中的数据时是以页为单位访问的,即使仅仅读取一条数据,也需要将这个数据所在的页全部加载进内存。为了提升性能,innodb引入了类似缓存的一种结构,叫做buffer pool,将热点数据缓存起来,然后按照一定的淘汰策略进行淘汰,这样在读取时如果
2021-06-14 20:38:52
477
原创 Mysql MVCC
Mysql MVCCMVCC Multi Version Concurrency Control ,多版本并发控制。主要为了提高数据库的并发性能。在对同一行数据同时进行读写时,一般会采取加锁的方式来保证一致性,但是这样会变为串行,因此MVCC采取更好的方式去处理读–写请求,做到在发生读写冲突的时候不用加锁,提高性能。当前读和快照读当前读:当前即是最新,顾名思义就是读取的最新版本,因为要读去最新版本,所以在读取的时候,其他事务不能修改,所有需要进行加锁。常见的sql如:select … lock i
2021-06-12 19:44:41
204
原创 Mysql中的redo log
Mysql中的redo log1、什么是redo logredo log叫做重做日志,目的是为了保证事务持久性的一种机制。保证在mysql服务器意味崩溃或者宕机后,保证对已经提交的事务,可以确定持久化到磁盘中的一种措施。2、为什么需要redo loginnodb是以页为单位来管理存储空间的,任何的增删改差操作最终都会操作完整的一个页,会将整个页加载到buffer pool中,然后对需要修改的记录进行修改,修改完毕不会立即刷新到磁盘,因为此时的刷新是一个随机io,而且仅仅修改了一条记录,刷新一个完整的
2021-06-02 22:30:57
12829
3
原创 索引使用策略
索引使用策略即使数据库表已经建立了索引,但是当不合理的使用,也可能造成索引失效,为了充分的利用索引,避免索引失效,因此也需要一定的策略。1、不在索引列上进行操作当查询时的列不是独立的,则mysql就不会使用到索引。独立的代表索引所在的列不能进行运算,不能作为函数参数。2、尽量全值匹配在使用联合索引的时候,尽量都可以用到,这样可以最大程度的减少扫描的区间,提升查询的效率。3、最左匹配原则当不能全值匹配的时候,需要考虑最左匹配原则,也就是再用到后面的索引的时候,需要先用到前面的索引,否则索引会失效
2021-05-23 22:30:40
385
原创 Mysql执行计划
MySql执行计划通过分析sql的执行计划,可以清晰的知道,该sql是如何被mysql解析的。如表的关联顺序,可能会用到的索引,真正用到的索引,索引的长度,扫描的记录行数等等信息。执行计划的语法语法很简单,只要在要分析的sql前面加上explain关键字即可。执行计划分析大概看一下,执行计划都有哪些数据id 每一个查询都对应一个idselectType 查询类型table 表名partitions:匹配的分区信息type : 针对该表的访问方法possible_key :可能用得
2021-05-23 21:58:59
168
原创 Mysql索引
MySql索引一、索引定义索引是帮助Mysql高效获取数据的一种数据结构,简而言之,索引就是一种数据结构。一种便于数据库查找数据的数据结构。二、Mysql中的索引在mysql中,我们可以为一张表建立一系列的索引,当查询的时候,首先查找到索引,然后根据索引快速的定位到真正的数据。三、数据结构的选择日常开发中,针对Mysql最主要的是为了查询。1、暴力遍历这个肯定是最直接的办法,将所有数据存储到线性表中,查询的时候依次遍历,这样可以获取到想要的数据,这样的话,存储比较方便,直接存储到线性表的后
2021-05-15 17:09:28
186
2
原创 Mysql的体系结构
Mysql基础一、MySql体系架构Mysql体系架构,主要由以下几部分组成:连接池:用户连接维护及管理,提升访问性能。角色权限认证。管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql 复制、集群 等sql接口:接收用户的sql命令,并且返回sql执行后的结果解析器:对sql进行解析,语法验证优化器:对用户书写的sql进行优化,如索引的选择,表的读取顺序等。缓存:对结果进行缓存,包含表缓存,记录缓存,权限缓存,key缓存等。插件式存储引擎:数据的组织格式文件系统二、M
2021-05-09 20:56:12
1313
1
原创 线程池源码分析
线程池源码分析线程池的核心类是ThreadPoolExecutor,该类中有一个AtomicInteger类型的变量,其高三位用来表示线程池的状态,低29位表示线程池中线程的个数。线程池总共有如下几种状态,用高三位来表示: private static final int RUNNING = -1 << COUNT_BITS; private static final int SHUTDOWN = 0 << COUNT_BITS; privat
2021-04-18 09:59:30
204
原创 ReentrantReadWriteLock分析
ReentrantReadWriteLock分析依然使用state变量表示锁的获取状态,因为读写锁涉及读锁和写锁,因此用state变量的高16位和低16位作为区分,分别代表读锁的获取次数,以及写锁的重入次数。1、写锁加锁过程 protected final boolean tryAcquire(int acquires) { // 当前获取锁的线程 Thread current = Thread.currentThread(); //
2021-04-05 13:35:33
163
原创 LockSupport工具类
LockSupport工具类主要用来,阻塞和唤醒线程,可以方便的用来实现线程间的通信,public class LockDemo { static final Logger LOGGER = LoggerFactory.getLogger(LockDemo.class); static volatile Object result = null; public static void main(String[] args) throws InterruptedException
2021-04-04 21:22:35
100
原创 【Netty报错:】XXXDecoder.decode() did not read anything but decoded a message.
Netty解码器报错:XXXDecoder.decode() did not read anything but decoded a message.从字面意思来看,就是说没有读取任何数据,但是却解析出来了一个对象。1、问题引出在写自定义的基于String的解码器的时候,在使用该解码器进行解码的时候会抛出这个异常。对应的解码器代码很简单,就是将ByteBuf转化为一个字符串,然后添加到list中,供后面的handler进行处理。编码器代码也很简单,就是将字符串变成一个byte数组,写到Byt
2020-11-25 10:18:30
3096
1
原创 Java垃圾回收器
JVM垃圾回收器JVM垃圾回收算法只是一种思想,一种方法论,而垃圾回收器是垃圾回收的具体实现。1、Serival收集器串行收集器,是最古老,最稳定的垃圾收集器,效率也比较高。单线程收集需要暂停用户线程新生代复制算法,老年代标记整理算法参数控制:-XX:+UseSerival串行收集器由于是单线程的原因,回收速度比较慢,可管理的堆内存空间比较小。2、ParNew收集器多线程版本的Serival收集器吞吐量比较高:并发收集,利用多核CPU的优势,大幅度降低gc时间。需要暂停用户线程
2020-11-04 22:26:53
319
原创 mybatis源码分析 ----- Mybatis为什么只写接口就能执行sql?
Mybatis为什么只写接口就能执行sql?至于这个问题,也算是一个常见的面试题,基本都会答动态代理,那么动态代理到底是如何做的呢?Configuration对象Mybatis会将配置文件和映射文件中的所有信息保存在这个对象中。其中有一个属性为mapperRegistry。这个属性保存接口和它对应的代理工厂 // 接口和代理类的注册中心 protected final MapperRegistry mapperRegistry = new MapperRegistry(this);Mappe
2020-07-10 21:44:14
594
原创 mybatis源码 ----- 解析Settings节点
解析Settings节点<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="autoMappingBehavior" value="PARTIAL"/></settings>settings节点中的内容较多,用于一些全局性的配置。m
2020-07-10 21:27:16
167
原创 mybatis源码分析 ---- Properties节点解析
解析Properties节点Properties节点用来引入外部文件,或者存储一些配置的值。在后面可以通过${name}的值直接使用<!--<properties resource=""></properties>--><!--<properties url=""></properties>--><properties resource="db.properties"> <property name="
2020-07-10 21:26:21
214
原创 Mybatis缓存模块源码分析
Mybatis缓存模块源码分析Mybatis中提供了缓存机制,而且有很多中不同策略的缓存,如LRU,FIFO,Schedule等等,那么Mybatis如何设计这些功能繁多的缓存呢?1、装饰者模式设计缓存1.1 提供统一的Cache接口:public interface Cache { String getId(); void putObject(Object key, Object value); Object getObject(Object key); Object re
2020-06-06 17:01:03
201
原创 Mybatis日志源码分析
Mybatis的日志分析在使用Mybatis的时候,可以看到控制台的日志输出。有很多的日志框架,那么Mybatis如何与这些日志框架进行整合呢?优先级又如何确定?日志信息如何优雅的输出?1、统一日志标准使用接口进行标准统一。public interface Log { boolean isDebugEnabled(); boolean isTraceEnabled(); void error(String s, Throwable e); void error(String
2020-06-05 23:33:27
198
原创 RabbitMQ进阶知识
RabbitMQ进阶知识1、消费端的确认 channel.basicConsume(QUEUE_NAME,false,consumer);将autoAck设置为false,当消费端收到消息之后,队列不会立即删除这条消息,只有当消费端进行手动确认后才会进行删除即调用:这样可以允许一条消息的处理时间可以很长。 channel.basicAck(envelope.getDeliveryTag(),true);当消费者设置为手动签收,但在处理消息的过程中,连接断开了,此时这些消息会发送给其它客户端。
2020-05-28 17:13:10
486
原创 RabbitMQ学习笔记
RabbitMQRabbitMQ是一个开源的消息中间件,可以通过普通协议在不同的应用之间传递数据(跨语言),通过Erlang语言编写,基于AMQP协议。AMQP协议AMQP全称:Advanced Message Queuing Protocol 高级消息队列协议,应用层协议。早期的消息中间件没有统一的标准,各自有自己的一套体系,各自的API,各自的协议。相互不能通信,Java方面针对此问题提出了JMS规范协议,提供了统一的Java接口,此时Java应用程序只需要选择合适的驱动即可,JMS会处理好其
2020-05-28 17:12:27
225
原创 ActiveMQ的高级特性
ActiveMQ的高级特性1、消息的持久订阅在之前的pub/sub模式中,消费者只能消费自它订阅之后的消息,这显然是不合理的,有的应用场景就需要获取之前的历史信息。因此需要设置消息的持久化订阅。connection = factory.createConnection();// 设置客户端的唯一IDconnection.setClientID("AAA");//destination...
2020-04-10 13:04:29
313
原创 ActiveMQ使用---原生方式
ActiveMQ使用—原生方式1、安装启动进入 到下载页面,找到 ActiveMQ 的下载地址直 接 copy 到 服 务 器 上 通 过 tar -zxvf apache-activeMQ.tar.gz启动运行a) 普通启动:到 bin 目录下, sh activemq startb) 启 动 并 指 定 日 志 文 件 sh activemq start >/tm...
2020-04-09 11:07:40
295
原创 消息中间件MQ概述
消息中间件MQ介绍1、什么是消息中间件?消息中间件是分布式系统中的一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。通过提供消息传递和消息排队模型,可以在分布式架构下扩展进程间的通信。2、消息中间件能做什么?消息中间件主要解决的是分布式系统之间消息传递的问题,能够屏蔽各种平台以及协议之间的特性,实现应用程序之间的协同。2.1异步...
2020-04-09 11:01:48
525
原创 Linux网络IO模型简介
Linux网络IO模型简介 Linux的内核将所有外设看作一个文件来操作,对于一个文件的读写操作,会调用内核提供的系统命令,返回一个fd (file description 文件描述符),而对于一个socket的读写也会有相应的描述符,称为socketfd(socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。一、阻塞IO模型j进程读取数据,调...
2020-02-24 15:20:44
233
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人