自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(465)
  • 资源 (1)
  • 收藏
  • 关注

原创 JVM调优参数之UseContainerSupport

基于Docker等容器方式运行Java应用时,容器的资源管理使用了操作系统cgroup机制,但是JVM无法感知cgroup。也就是说在没有UseContainerSupport参数支持的JDK版本中,JVM是无法感知容器环境存在,对容器资源的限制比如内存或者cpu等都无法生效。在这种情况下,如果JVM申请的内存大于容器的内存,容器就会把当前进程kill掉,所以必须要让JVM感知到能使用的最大内存,这样可以及时进行GC。UseContainerSupport作用为了支持JVM感知cgroup..

2022-05-12 15:35:16 5107

原创 Spring中的BeanPostProcessor

背景:项目中使用了注解加切面实现某些数据接口的缓存,想把项目中使用了缓存的接口及信息可视化,便于管理查看。这个功能实现的话大概就是解析接口方法上的注解,加入统一管理的集合信息中。但是一般程序中只有访问到方法的时候才能主动做解析,而且多次访问会重复解析,所以考虑在项目启动时就遍历Bean解析这些注解的方法。为了实现上面这个功能,就使用了BeanPostProcessor接口。Spring中的BeanPostProcessor在实例化过程处于的位置分是前置处理和后置处理,对应的BeanPostPro

2021-12-18 18:02:01 775

原创 RocketMQ——producer发送消息源码分析

MQProducer接口RocketMQ中生产者顶层接口,定义了各种模式的发送消息的方法,不管是普通生产者还是事物消息生产者都实现了这个接口。DefaultMQProducer类这个类实现了MQProducer接口,是RocketMQ中提供的默认的生产者,除了事务消息外的普通消息都是用这个类实例进行发送。在创建生产者实例时,使用不同的构造方法,可以指定producerGroup(不指定时默认值为 "DEFAULT_PRODUCER");可以设置是否开启消息追踪及追踪topic的名称;还可以

2021-03-24 21:06:35 518

原创 synchronized锁的级别和ReentrantLock锁(AQS)

针对并发JAVA中提供了JVM级别的synchronized关键字,除此之外在JUC包下Lock接口也提供了类似的锁机制,例如ReentrantLock可重入锁。synchronizedJVM的关键字,依靠底层机制实现的。synchronized 中的锁是非公平的; synchronized 中的锁是可重入的;ReentrantLockReentrantLock 是 JDK 实现的,在java.util.concurrent.locks 包下。实现方式:ReentrantLo.

2021-01-20 16:29:00 1286

原创 事务隔离级别MVCC实现与悲观锁乐观锁

目录四种事务的隔离级数据库默认隔离级别为什么要使用悲观锁和乐观锁悲观锁乐观锁事务的隔离级(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性。四种事务的隔离级串行读 >可重复读 >已提交读 >未提交读1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少2、已提交读(Read Committed...

2020-12-29 11:37:15 300

原创 centos强制重启后mysql启动失败

由于强制重启后mysql的pid丢失导致启动失败。1.进入/etc/my.cnf.d文件查看pid的目录位置log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid上面的内容表示启动日志目录和pid目录,本次出现的问题就是pid丢失问题。2.进入/var/run目录下,创建mysqld目录mkdir /var/run/mysqld3.授权目录权限chown mysql.mysql /var/run/

2020-06-24 22:38:04 1070

原创 浅谈Tomcat数据源连接池

对于JAVA开发者来说,JDBC肯定都比较熟悉,它其实是Java提供了一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可,不同的数据库厂商需要针对这套接口提供不同的实现。

2025-04-03 19:44:58 1085

原创 Sentinel-自定义资源实现流控和异常处理

SphU类在sentinel-core依赖中,主要用于对资源的访问控制。当系统想要执行某个资源操作时,通过调用 SphU.entry 方法来检查该资源是否受到流量控制。如果资源当前处于限流状态,那么 SphU.entry 会抛出 BlockException 异常,表示请求被限流,此时系统可以进行降级操作。如果资源没有受到限流,那么 SphU.entry 会返回一个 Entry 对象,表示一次资源操作开始,系统可以继续执行相关的业务代码。

2025-04-02 19:13:59 679

原创 Elasticsearch索引的字段映射

Elasticsearch中的字段设置直接影响数据的存储、索引和查询行为。结合索引查询场景合理设置mapping信息可以起到提升查询效率,优化存储空间的作用。

2025-04-01 20:33:07 115

原创 MySQL中的共享锁和排他锁

MySQL 中的锁可以从多个维度进行分类,其中从模式上可以分为。

2025-03-02 18:58:52 370

原创 MySQL中的行级锁

MySQL中锁有很多种,其中从锁的粒度来区分的话可以分为。本文主要介绍下。

2025-03-02 17:42:42 407

原创 Kafka生产者ACK参数与同步复制

例如:topic中ISR副本数为4,min.insync.replicas设置为2,生产者ack设置为-1,当生产者发送消息时满足leader节点写入成功且另外两个ISR其中一个写入完成后即可完成消息发送成功的响应,无需等待全量ISR都写入完成。此选项提供了较好的持久性较低的延迟性,实现了吞吐量和消息可靠性的平衡。当开启同步复制且生产者ACK参数设置为-1或all时,在消息发送时只要写入副本数满足了min.insync.replicas的数值即可返回给生产者消息发送成功的通知。

2025-01-24 17:14:33 1001

原创 JVM参数-NativeMemoryTracking

实际开发场景中应该有发现Java应用程序会消耗比设置-Xms和-Xmx更多的内存,究其原因其实是因为JVM中除了大家熟知的堆内存外,还有所谓的非堆内存(Non-Heap Memory),详细来看,非堆内存包括方法区和Java虚拟机内部做处理或优化所需的内存。从图上可以看到JVM内存部分,除了堆内存外还有方法区,包括线程栈,常量池,方法和构造函数代码等。方法区在逻辑上是堆的一部分,但在HotSpot中是堆外存储的,不同虚拟机可能实现有所不同。

2025-01-22 17:41:33 435

原创 JVM性能调优工具篇—JCMD

自从有了Arthas工具,线上JVM的监控查看非常方便。但是有些特殊的服务没集成,还是要使用比较传统的命令进行排查,这篇文章整理下基于jcmd的相关命令,相比更古老的jmap jstack等命令在使用上更方便一些。

2025-01-12 15:46:12 991

原创 kubectl常用命令简介

本文介绍的 kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的。

2024-11-02 19:13:45 1454 1

原创 Mybatis集成MySQL使用游标查询处理大批量数据

随着用户量的上升表数据已经上千万,每天扫描处理的数量也超百万,limit分页出现了慢sql,任务执行时间也达不到预期了。上述方案出现瓶颈后考虑放弃limit方案,使用游标的方式进行全量数据的获取,这样一来SQL执行快任务执行也快。在设置了useCursorFetch=true后,需要在SQL中指定fetchSize,即一次获取的数据量。基于数据的时间范围查询,给符合条件的用户推送积分即将到期的提醒。下面是基于上面的SQL做大量数据查询后写入文件的代码示例。

2024-01-18 15:49:50 1904

原创 浅谈Guava Cache的参数使用

这个方法是用来重新加载缓存的,通常这个方法是配合refreshAfterWrite参数设置一起使用的,如果没有设置refreshAfterWrite参数则不会触发这个方法逻辑,只有再判断缓存写入时间超出refreshAfterWrite的值时才会调用reload方法执行刷新缓存的逻辑。当执行get操作没有命中缓存或者判断缓存已经超出expireAfterWrite设置的时间即缓存过期时,会调用load方法进行回源逻辑,获取到新的数据并建立缓存。这个方法执行时是加锁的,并发访问一个没有缓存的key会阻塞。

2023-12-20 20:30:35 1057

原创 JDBC参数之allowMultiQueries

其实allowMultiQueries参数是一个比较基础的参数,见名知意 支持多SQL执行的参数。

2023-11-23 14:49:35 2104

原创 Kubernetes中的就绪(readinessProbe)和存活(livenessProbe)探针

这篇文章开头,先列举几个我曾遇到过的因为探针参数使用不当而引发的k8s滚动升级的问题。

2023-08-04 21:00:03 720 1

原创 浅谈Kubernetes中Service实现(服务注册和发现)

之前的文章介绍了,这篇文章详细聊一下Kubernetes中的Service网络本身又是如何实现的。下面这张图是k8s集群服务发现涉及到的流程和组件,最重要的就是Kube-dns 和 Kube-proxy两个组件,下面会详细展开说明。

2023-08-02 20:58:34 817

原创 Kafka的Replication策略和ISR同步机制

而异步复制方式下,follower异步的从leader复制数据,数据只要被leader写入log就被认为已经commit,这种情况下如果follower都还没有复制完,落后于leader时,突然leader宕机,则会丢失数据。这个参数作用与Topic维度,指的是分区同步副本的数量控制,在replication异步复制模式下,生产者发送消息写入过程中,只有ISR中所有Replica都向Leader发送ACK时,leader才会执行commit。但是,Kafka的复制机制不是完全的同步复制,而是。

2023-07-05 21:05:06 1073

原创 Kafka中的consumer拦截器

之前的文章写了最后有提到,在执行真实的消费方法之前会调用消费者的拦截器处理消息,最后再交给RecordMessagingMessageListenerAdapter进行代理和反射调用消费方法。对于消费者,SpringBoot在整合方式中的spring-kafka并没有用原生的ConsumerConnector,,而是借助原生client的拉取消息功能做了自己的消费模型的实现,提供了@KafkaListener注解这种方式实现消费。

2023-06-19 09:20:46 688

原创 浅析Spring-kafka源码——消费者模型的实现

在使用Spring-kafka时,一般都是通过使用@KafkaListener注解的方法来实现消息监听和消费。今天写一下基于这个注解实现的消费端模型和实现的原理。

2023-06-17 13:31:51 2624

原创 Kafka消费端concurrency参数

首先说一下结论,这个参数用来增加消费者实例,或者可以理解为@KafkaListener注解实例的数量。当消费者服务数量小于topic的分区数的时候使用此参数可以提升消费能力,spring-kafka在初始化的时候会启动concurrency个Consumer线程来执行里面的方法。用来直接调用kafka-client的poll()方法获取消息。如果是自动提交offset,poll()方法获取消息后会直接给到listener线程执行。真正调用处理我们代码中标有注解方法的线程。

2023-06-16 20:59:18 1808

原创 Kafka中的producer拦截器

在Kafka中,拦截器一共有两种。分别是生产者端的和消费者端的。本文介绍生产者端的拦截器。

2023-06-16 13:45:14 1533

原创 浅谈Dubbo服务的参数校验

Dubbo框架本身是支持参数校验的,同时也是基于JSR303去实现的。dubbo框架的资源文件org.apache.dubbo.rpc.Filter中定义了默认会生效框架自带的一系列Filter。其中就包含下面说的ValidationFilter。

2023-06-08 13:45:01 925

原创 CMS垃圾回收器的堆内存分配问题

项目中某个服务容器配置内存是4G,通过-XX:InitialRAMPercentage=75 控制JVM内存控制为容器的75%,大概2.5G左右不到。CMS中堆内存分配方式根据相关计算公式,如果机器CPU为4核,则年轻代 = 64M * 4 * 13 / 10 = 332.8M。,在默认情况下是这个比例没错,但是如果项目中使用CMS代替默认的GC回收器呢,这个比例还正确么?随着业务量的增长,单服务节点的高峰QPS不算攀高,发现高峰期极易发生FullGC。这个比例有个前提条件,就是之前的文章写的。

2023-06-03 21:00:03 819

原创 浅谈Maven依赖冲突与依赖管理

以上方法虽然治标,但是不治本。如果想依赖冲突不发生,我们需要提前建立一定的规范,团队一起遵守,才能有效避免该类问题。应用项目中使用统一管理基础依赖,定义统一的版本,如常用中间包,工具包,日志包。二方包中不要引入无关的依赖,做到尽量少的依赖。团队开发中,比较常见情况是二方包继承公共的父 pom,从而导致继承许多无相关的依赖,这种情况可以单独管理。二方包做好向下兼容,不要随意改动现有类名,方法名,字段名。项目应用上线之前,将snapshot替换成正式版本。虽然snapshot。

2023-06-03 20:32:07 776

原创 记一次线上MQ堆积问题处理

下午1点后出现新一轮高峰,出现了大量消息堆积,堆积量超过两万。由于当前Topic分区较少,服务节点数量已经大于分区数,加服务节点没有意义。原因是Topic扩容后有12个分区,但是当前服务节点只有10个,存在两个服务节点各自消费两个分区的情况,导致原有的堆积消息无法尽快处理完。几分钟后,12个分区消息堆积都解决了,但此时仍处于高峰,所以lag数扔维持几十左右,观察后发现消费速度稳定,没什么问题。上午11.30左右一波下单高峰,根据分布式消息告警发现有少量消息堆积,但是堆积量不大,持续几分钟后恢复正常。

2023-06-02 21:01:36 455

原创 Maven多模块父项目Pom发布到Maven私服

一个父项目下Father面有3个子项目A、B、C。A和B是JAR包服务,C是接口sdk。当C提供给外部使用时对方也需要Father这个父POM(因为C指定了Father作为parent),这时候需要把Father父POM上传的私服供对方下载。下面两种方式可以灵活控制deploy的模块,避免不需要上传的模块也上传到私服上去。

2023-05-27 14:03:10 2236

原创 浅谈JDK8的默认垃圾回收器

JDK1.8中默认使用Parallel Scavenge作为年轻代的垃圾回收器。使用Parallel Old作为老年代的垃圾回收器(又称为PS MarkSweep)。Parallel Scavenge收集器又称为吞吐量优先收集器,和ParNew收集器类似,是一个新生代收集器。使用复制算法的并行多线程收集器。Parallel Scavenge是Java1.8默认的收集器,特点是并行的多线程回收,以吞吐量优先。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

2023-05-20 21:00:51 2863

原创 浅谈Kubernetes对外暴露服务的实现方式(NodePort vs LoadBalancer vs Ingress)

之前的文章写了k8s中服务访问的service组件和。但是肯定多少都会有外部访问的场景,比如对外暴露的API服务。这就涉及到从k8s集群外部访问集群内部的场景。对于外部访问k8s集群通常有下面几种方式,本文主要写第二种和第三种,对于ingress和路由指向简单介绍一下。

2023-04-27 19:11:53 1745

原创 Dubbo中的Router组件及扩展实践

开头讲到Router一般都是由对应的RouterFactory而来,具体一点说,在消费者启动过程中是基于SPI机制加载各个RouterFactory来初始化加载router列表的。所以如果要自定义Router路由也是基于SPI机制来集成。实现org.apache.dubbo.rpc.cluster.router.AbstractRouter接口并实现route方法即可@Slf4j@Overridelog.error("执行自定义的router对服务列表进行过滤");

2023-04-13 16:43:48 708

原创 Dubbo服务目录组件Directory

AbstractDirectory中封装了Invoker列举流程,具体的列举逻辑则由子类实现,如AbstractDirectory类定义了doList方法,在StaticDirectory和RegistryDirectory两个子类中重写了doList方法。这是典型的模板模式;

2023-04-13 15:35:49 1265

原创 Dubbo消费者调用流程分析

消费者在发起一次调用的时候时序图如下。

2023-04-12 21:01:53 698

原创 浅谈Dubbo中Filter机制

之前的文章介绍了,即实现org.apache.dubbo.rpc.Filter接口及内部子接口Listener,或继承ListenableFilter抽象类就可以进行自定义Dubbo Filter。

2023-04-12 17:16:14 733

原创 浅谈Dubbo服务启动实现原理

在SpringBoot项目中集成Dubbo的模式下,在boot项目启动时Dubbo也会完成服务接口的对外发布和消费者引用。

2023-04-12 15:30:00 442

原创 浅谈Dubbo集群容错机制的实现

Dubbo整个集群容错层的实现在模块,它包含很多组件,例如:Cluster、ClusterInvoker、Directory、LoadBalance等等。Cluster是集群容错接口,它的功能仅仅是将一组Invoker聚合成一个具备集群容错能力的ClusterInvoker。在2.7.8版本中,Dubbo内置了十种集群容错策略,默认策略是Failover,对应的类是FailoverCluster,它会创建FailoverClusterInvoker。

2023-04-10 21:00:28 656

原创 MySQL临时表空间

在一张大表复杂连接查询时遇到一个错误,从报错信息看,应该是创建的临时表空间不够用了这个错误和下面两个参数有关,一个是 tmp_table_size,另一个是innodb_temp_data_file_path这个参数指的是 内存中临时表的最大大小。当内存中的临时表超过限制时,MySQL会自动将其转换为磁盘上的临时表。如果SQL中执行了许多高级分组查询,并且会占用大量内存,则需要考虑tmp_table_size参数值是否满足需求,当超出时会报上面的错误。

2023-03-28 20:54:16 710

原创 浅谈Dubbo的异步调用

之前简单写了一下,了解了Dubbo底层是基于NIO的Netty框架实现的,通过IO线程池和Work线程池实现了请求和业务处理之间的异步。这篇文章要写的是Dubbo对于消费端调用和服务端接口业务逻辑处理的异步,在2.7版本中Dubbo实现了基于CompletableFuture的异步支持。

2023-03-25 21:01:12 1100

win系统erlang安装包

对应rabbitmq-3.8.9版本

2020-12-21

空空如也

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

TA关注的人

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