自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tinysakura的博客

每一次离散,都是为了下一次重聚。

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

转载 CacheLine伪共享机制和解决方案

认识CPU CacheCPU Cache概述随着CPU的频率不断提升,而内存的访问速度却没有质的突破,为了弥补访问内存的速度慢,充分发挥CPU的计算资源,提高CPU整体吞吐量,在CPU与内存之间引入了一级Cache。随着热点数据体积越来越大,一级Cache L1已经不满足发展的要求,引入了二级Cache L2,三级Cache L3。(注:若无特别说明,本文的Cache指CPU Cache,高速缓存)CPU Cache在存储器层次结构中的示意如下图:计算机早已进入多核时代,软件也越来越多的支持多核运行

2021-02-03 13:41:34 1269 1

原创 获取一个java程序主函数声明的类

观spring boot源码,看到一个有意思的简单获取java程序主函数所在的类的方法,记录一下private Class<?> deduceMainApplicationClass() { try { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement stackTraceElement : stackTrace) { if ("main

2021-02-01 13:50:11 485

转载 ZK选举和同步机制

转载自博客核心协议zk的核心是原子广播,这个机制保证了各个Server之间的同步,实现这个机制的协议叫做Zab协议。Zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者leader崩溃后,Zab进入恢复模式,当leader被选举出来,然后进行同步模式,同步完成以后,恢复模式结束。为了保证事务的顺序一致性。实现中zxid是一个64位的数字,它高32位是用epoch用来标志leader关系是否改变,每次一个新的leader选举出来,都会拥有一个新的epoch。低32位用来递增计数

2021-01-28 10:45:26 1398

转载 理解Flink中的watermark

转载自hongyuzhou的博客1. Watermark 的理解最早看到 Watermark 的概念就是在 Flink 的官方文档里面:The mechanism in Flink to measure progress in event time is watermarks. Watermarks flow as part of the data stream and carry a timestamp t. A Watermark(t) declares that event time has

2021-01-06 14:24:09 353

原创 java动态编译——JavaFileManager详解

前言使用过java内存编译功能的小伙伴应该了解,我们可以通过tools包提供的JavaCompiler模块在内存中对java代码进行编译,而我们经常使用的javac编译工具,底层也是借助javax.tools完成编译的。在java代码里,我们可以通过下面几行代码,就完成源文件到字节码的编译: JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager f

2020-11-20 14:30:56 5457 19

原创 byte-buddy增强static方法

1.起因为了排查问题需要增强dubbo的AbstractCodec的checkPayload方法,但是增强后重新运行程序发现增强代码没有生效,使用arthas反编译我要增强的AbstractCode类,没有发现增强痕迹,查找agent日志发现有一些报错。很明显我们的增强失败了,而我们现在使用的增强方式是通过bytebuddy agent的方式,最终借助instrument在类加载前进行增强。结果一番google,最终在bytebuddy源作者对于一个类似问题的回复中找到了答案。2.解决方法使用byte

2020-10-26 12:43:48 1514 1

转载 es通过索引别名实现零停机

转载自elastic.co索引别名是什么重建索引的问题是必须更新应用中的索引名称。 索引别名就是用来解决这个问题的!索引 别名 就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用。别名 带给我们极大的灵活性,允许我们做下面这些:在运行的集群中可以无缝的从一个索引切换到另一个索引给多个索引分组 (例如, last_three_months)给索引的一个子集创建 视图在后面我们会讨论更多关于别名的使用。现在,我们将解释怎样使用别名在零停机下从旧索引切换到新

2020-10-21 16:11:49 285

原创 netty DefaultEventLoopGroup踩坑

踩坑过程大家都知道使用netty时应该尽量不要阻塞i/o线程,而应该把耗时的业务逻辑放在其他线程中等计算出结果后再通过i/o线程提交给请求者,netty 为了隔离这些处理耗时业务的ChannelHandler,在向pipline中添加ChannelHandler时提供了可以同时指定ChannelHandler执行业务线程的api /** * Inserts {@link ChannelHandler}s at the first position of this pipeline. *

2020-10-13 17:07:48 2101 3

转载 读写锁降级

转载自light_shine的博客锁降级锁降级指的是写锁降级成为读锁。锁降级是指把持住当前拥有的写锁的同时,再获取到读锁,随后释放写锁的过程。以下是oracle官网的对于锁降级的示例代码: class CachedData { Object data; volatile boolean cacheValid; final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedD

2020-10-10 20:07:32 910

转载 Netty NioEventLoop 启动过程源码分析

转载自王维_hz的博客Netty版本:4.1.30在之前分析 Channel绑定 的文章中,提到过下面这段代码,先前只讲了 channel.bind() 绑定逻辑,跳过了execute() 接口,现在我们以这个为例,开始分析NioEventLoop的execute()接口,主要逻辑如下:启动绑定当前线程到EventLoop上调用EventLoop的run()方法private static void doBind0( final ChannelFuture regFuture,

2020-10-10 10:59:19 130

转载 java nio selector选择器

转载自小文子的博客Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。为什么使用Selector(Why Use a Selector?)用单线程处理多个channels的好处是我需要更少的线程来处理channel。实际上,你甚至可以用一个线程来处理所有的channels。从操作系统的角度来看,切换线程开销是比较昂贵的,并且每个线程都需要占用系统资源,因此暂用线程越

2020-10-10 10:34:57 130

转载 netty性能调优

转载自STEPHEN的博客调优思路关于netty的学习和介绍,可以去github看官方文档,这里良心推荐《netty实战》和《netty权威指南》两本书,前者对于新手更友好,原理和应用都有讲到,多读读会发现很多高性能的优化点。netty高性能优化点最近参加了阿里中间价性能比赛,为了提升netty写的servive mesh的网络通信的性能,最近几天查了书、博客(这里强力推荐netty作者的博客,干货真的很多),自己总结了如下一下优化点。如果有错误希望能指正。注:这里所讨论的对应的netty版本为n

2020-10-09 15:43:27 4594

转载 netty内存管理

https://www.jianshu.com/p/ce7c6f5cb5f6

2020-08-13 19:31:40 926

转载 SSL/TLS协议运行机制的概述

转载自阮一峰的博客

2020-08-06 19:57:34 124

转载 Arthas redefine原理

转载自studyidea.cn的博客前言arthas可以热部署已经被虚拟机加载的类,这其实是借助Instrumentation的redefineClasses能力实现的,Instrumentation可以借助preMain和agentMain的方式分别在程序启动前和运行中获取jvm的信息,进行类的更改和替换,而arthas很明显,是通过agentMain的方式做到在程序运行时做的redefine。Attach ApiAttach API 位于 tools.jar 包,可以用来连接目标 JVM。Att

2020-08-05 11:54:04 1986

转载 深入理解JDK中的Reference原理和源码实现

转载自throwable的博客前提这篇文章主要基于JDK11的源码和最近翻看的《深入理解Java虚拟机-2nd》一书的部分内容,对JDK11中的Reference(引用)做一些总结。值得注意的是,通过笔者对比一下JDK11和JDK8对于java.lang.ref包的相关实现,发现代码变化比较大,因此本文的源码分析可能并不适合于JDK11之外的JDK版本。Reference的简介和分类在JDK1.2之前,Java中的引用的定义是十分传统的:如果reference类型的数据中存储的数值代表的是另一块内存

2020-07-23 11:11:33 421

原创 ByteBuddy使用入坑

ByteBuddy官方文档ByteBuddy 介绍首先需要了解ByteBuddy是什么,ByteBuddy是一款java字节码增强框架,可以动态的生成java字节码文件,比起我们自己进行字节码文件的生成,它屏蔽了底层细节,提供一套统一易上手的Api,简化了字节码增强的学习难度。为什么需要字节码增强技术?ByteBuddy官方文档已经给出了答案The Java language comes with a comparatively strict type system. Java requires

2020-07-09 18:14:09 12907 6

转载 JAVA SE 6新特性:Instrumentation

转载自IBM社区Instrumentation 简介利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为

2020-05-27 13:56:06 569

转载 @ConfigurationProperties注解使用

转载自博客在编写项目代码时,我们要求更灵活的配置,更好的模块化整合。在 Spring Boot 项目中,为满足以上要求,我们将大量的参数配置在 application.properties 或 application.yml 文件中,通过 @ConfigurationProperties 注解,我们可以方便的获取这些参数值使用 @ConfigurationProperties 配置模块假设我们正在搭建一个发送邮件的模块。在本地测试,我们不想该模块真的发送邮件,所以我们需要一个参数来「开关」 disab

2020-05-14 20:04:58 451

转载 aspectj与spring aop的区别

转载自Mythsman的个人博客这篇文章介绍了aspectj的原生使用方式(编译时织入,编译后织入,加载时织入),类增强织入和代理方式的区别,spring aop使用是织入还是代理?spring aop和aspectj的关系,值得一读...

2020-05-06 20:03:10 332

原创 springboot内嵌tomcat

tomcat有两种启动模式,除了独立启动外也可以内嵌进应用中启动,tomcat内嵌最有名的例子就是spring boot了,下面阅读源码:首先是springboot的启动入口org.springframework.boot.SpringApplication#run(java.lang.Object, java.lang.String…)public ConfigurableApplicati...

2020-04-30 14:26:22 541

原创 tomcat coyote模块请求处理流程

以Http2.0协议,io方式为nio为例时序图Connector启动时,启动其持有的EndPoint实例(NioEndPoint),EndPoint通过其持有的Acceptor轮询监听端口接收请求 protected class Acceptor extends AbstractEndpoint.Acceptor { @Override public...

2020-04-29 20:20:17 580

原创 tomcat catalina模块请求处理过程

请求处理CoyoteAdapter复制沟通Connector和Container组件,扮演的是Service的角色,tomcat处理请求的入口在CoyoteAdapter的service方法,当Connector接收到请求后根据协议进行转换后地调用CoyoteAdapter#service处理,主要处理过程如下根据connector转换的request和response创建Servlet的...

2020-04-27 16:41:46 360

原创 tomcat web应用加载

web应用加载时序图Hosthost加载web应用(context)的入口有两个在catalina解析Server.xml构造Server实例时,若配置文件的Host元素存在Context子元素,则将解析出的context作为子元素添加HostConfig自动扫描部署目录,创建Context实例并启动HostConfig对于Context的部署默认情况下,server.xml中...

2020-04-27 13:33:00 363

原创 tomcat基础架构

tomcat基础组件组件说明Server表示整个servlet容器,整个tomcat运行时只有一个server实例ServiceService表示一个或多个connector的集合,这些connector共享一个containner来处理加工过的请求,一个tomcat实例中可能有多个service,彼此独立Connector链接器,用于监听并转换Socket...

2020-04-27 10:30:02 255

原创 tomcat类加载器

Common: tomcat服务器顶层公用类加载器,默认加载$CATALINA_HOME/lib下的包Catalina: 加载tomcat应用服务器的类加载器,功能和common一致,默认为空(此时使用common加载服务器公共类)Shared:所有web应用的父加载器,默认为空Web App:web应用加载器,加载/WEB-INF/classes目录下的类,加载的类只对当前web应用可...

2020-04-27 10:07:44 177

转载 HttpClient模拟带Cookie的登录请求

转载自AndyWei123的博客模拟登陆首先是模拟登录,一般在一些防爬网站需要携带一些基础http头模拟成浏览器登录,一般只需要User-agent使用火狐浏览器,这里就不涉及了,登录通常是把用户名和密码加密发送给后台,当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie请求头...

2020-04-09 10:40:00 3303

转载 了解分布式事务

转载自掘金前言不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付。又或者在网上购物明明已经扣款,但是却告诉我没有发生交易。这一系列情况都是因为没有事务导致的。这说明了事务在生活中的一些重要性。有了事务,你去小卖铺买东西,那就是一手交钱一手交货。有了事务,你去网上购物,扣款即产生订单交易。事务的具体定义事务提供一种机制将一个活...

2020-03-29 16:01:59 201

转载 redis被bgsave与bgrewiteaof命令阻塞

转载自jbaowei2000的博客Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等.Redis 的持久化在两种方式: Snapshotting(快照) 和 Append-only file(aof). 在一个采用了...

2020-03-12 09:50:29 623

转载 MySQL间隙锁

转载自crazyYong的博客MySQL间隙锁你需要知道的之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁。行锁记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。生活中的间隙锁编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想。生活中排队的场景,小明,小红,小花三个人依次站成一排,此时,如何让新来...

2020-02-24 16:08:02 10222 8

转载 Base64原理

转载自二师兄-公众号-程序新视界的博客Base64的由来目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输。那么,Base64到底起到什么作用呢?在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。与此...

2020-01-19 12:02:51 208

原创 sha1withrsa算法

转载自西门打扫雪的博客、别人眼中的过客的博客浅谈加密与签名我们一般的加密主要分2种。对称加密。非对称加密。顾名思义。对称加密就是秘钥是一样的。通过同一个秘钥加密解密。这一类的加密算法有DES,3DES,AES等。而非对称加密即使用公钥和秘钥2个。公钥进行加密,而私钥进行解密。这一类的加密算法主要RSA数字签名并不是加密。他只是将传递的参数进行签名。服务器端可以验签。主要作用有2个:1.保证数...

2019-12-13 11:36:09 4468

原创 sentinel dashboard扩展

前言在前面的系列博文里我们已经介绍过了sentinel的dashboard的基础用法,使用dashboard可以详细的监控被保护资源的实际访问统计情况,与为不同服务配置的限流规则。sentinel dashboard的功能显然不止于此,官方留了很多功能的入口供使用者自行扩展,本篇博客抛砖引玉。对dashboard流控数据统计持久化与dashboard动态配置限流规则两方面进行扩展。其它功能入口都...

2019-11-11 20:00:35 1097

原创 sentinel集成网关流控

简介使用网关代理服务请求是微服务架构下常见的做法,相比于对被网关代理的各个服务做限流服务,在网关进行统一的限流操作似乎是更好的做法,sentinel对java应用常用的两款网关框架spring-cloud-gateway和zuul1都做了适配。本文将以zuul为例,说明zuul网关接入senrtinel流控能力的步骤并对源码做简单解读网关限流模块分析sentinel中对应网关限流规则的实体...

2019-11-06 19:43:42 4419

原创 sentinel context组件源码分析

前言Context组件在sentinel中扮演的是一种什么样的角色呢?借用原作者的注释:This class holds metadata of current invocation其实就是保存一次资源访问链路元数据的类,链路的各个节点都能通过获取链路绑定的context来获取一些信息进行相应的处理。很多涉及链路的框架都会有类似设计,例如netty的ChannelHandlerConte...

2019-10-29 16:34:48 898

原创 sentinel限流相关指标统计源码分析

前言Sentinel 可以通过并发线程数模式的流量控制来提供信号量隔离的功能。并且结合基于响应时间的熔断降级模式,可以在不稳定资源的平均响应时间比较高的时候自动降级,防止过多的慢调用占满并发数,影响整个系统。sentinel的限流是基于信号量机制的,因此必定在底层维护了一套限流相关指标的信号量,下面从源码的角度分析一个请求进入被sentinel保护的资源,sentinel是如何记录信号量,...

2019-10-29 13:13:38 1896

转载 使用线程安全的原子数组AtomicReferenceArray

转载自易百教程AtomicReferenceArrayjava.util.concurrent.atomic.AtomicReferenceArray类提供了可以原子读取和写入的底层引用数组的操作,并且还包含高级原子操作。 AtomicReferenceArray支持对底层引用数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的任何后续获取相关...

2019-10-28 14:24:02 829

原创 sentinel整合dubbo实现统一降级

统一降级策略在我们之前的博客里介绍了dubbo如何整合sentinel进行限流。既然用到了限流,那么每次让被限流的服务都抛一个异常让调用端自己处理显然不是优雅的解决方案,在者一些带有业务含义的降级策略只有在服务提供方才能完成,这时候我们就需要引入sentinel的降级能力。sentinel官方文档推荐的做法是使用注解。这种方法比较灵活但缺点是降级的代码比较分散,代码量也比较多,这时候我们需要一种...

2019-10-24 14:36:12 3996 5

转载 理解linux的系统负荷

转载自阮一峰的博客一、查看系统负荷如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了。在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行)。(另外,它们在苹果公司的Mac电脑上也适用。)你在终端窗口键入uptime,系统会返回一行信息。这行信息的后半部分,显示"load average",它的意思是"系统的平均负荷",里面有三个数字,我们可以从中判断系统...

2019-10-22 20:40:41 133

转载 linux split命令

转载自ball球的博客基本用法:split [-bl] file [prefix]参数说明:-b, --bytes=SIZE:对file进行切分,每个小文件大小为SIZE。可以指定单位b,k,m。-l, --lines=NUMBER:对file进行切分,每个文件有NUMBER行。prefix:分割后产生的文件名前缀。示例:假设要切分的文件为test.2012-08-16_17,大小...

2019-10-22 15:02:04 182

空空如也

空空如也

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

TA关注的人

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