自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 问答 (1)
  • 收藏
  • 关注

原创 Rocketmq如何保证消息不丢失和幂等性

比如用户下单,在用户支付订单后,更新订单状态同时发布一条消息到Broker,通知下游服务新增物流、更新用户积分等信息,我们就那新增物流信息为例,物流服务在消费该消息时,通过if判断物流信息表中是否存在相同的物流id,不存在则正常消费,存在则直接return,不重复消费。如果由于网络抖动,生产者重启导致而消息确认失败,Broker会通过扫描发现某条消息长期处于【半事务消息】状态,就会主动向生产者发起询问查询该条消息的最终状态,默认每隔60s回查一次,回查15次还是不行,则不投递半事务消息。

2024-05-10 20:20:24 668

原创 设计模式之策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变化独立于算法的使用者。

2024-03-28 21:39:15 618

原创 设计模式之适配器模式

在计算机编程中,适配器模式(有时候也称包装样式)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。对象适配器模式在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。类适配器模式这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

2024-03-26 21:10:38 1035

原创 设计模式之门面模式

门面模式,也称为外观模式,旨在提供一个统一的接口去访问多个子系统的多个不同的接口。这样,子系统对于客户端来说更容易使用。门面模式定义了一个高层接口,隐藏了子系统的复杂性,使得客户端可以方便地使用子系统的功能,而不需要了解子系统的具体实现。

2024-03-25 17:21:13 454

原创 设计模式之观察者模式

它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。

2024-03-24 23:01:31 817

原创 设计模式之模板方法

模板方法模式定义了一个操作中的算法骨架,并将一些步骤延迟到子类中实现。这样,子类在不改变算法结构的情况下,可以重新定义算法的某些特定步骤模板方法模式非常简单易于理解定义模板handle();子类特定算法步骤@Override模板方法模式和工厂方法模式(点这里)实现比较类似,都是通过子类继承抽象类工厂方法模式略显复杂,它有四个特定角色,其目的是将创建对象的过程延迟到子类执行;模板方法则是将特定算法延迟到子类执行。

2024-03-24 10:47:27 431

原创 设计模式之工厂方法

定义一个用于创建对象的接口,让子类决定实例化哪一个类。使得一个类的实例化延迟到子类。抽象产品(Product)角色。定义了一个产品的接口,用于声明其公共方法。具体产品(ConcreteProduct)角色。实现了抽象产品接口,每个具体产品都有自己特定的实现。抽象工厂(AbstractFactory)角色。定义了一个用于创建产品的接口,这个接口包含一个或多个用于创建具体产品实例的方法。具体工厂(ConcreteFactory)角色。实现了抽象工厂接口,负责创建具体的产品实例。

2024-03-23 21:37:16 579

原创 设计模式之单例模式

饿汉模式通过jvm类加载器实现的,在加载类时的初始化阶段就完成了类的初始化(即初始化阶段给类的静态变量赋值)。并且类加载器由双亲委派机制使用保证只会被加载一次,并且loadClass在加载类时使用synchronized保证线程安全。懒汉模式即延迟加载,在需要用到该实例时进行实例化,在使用懒汉模式需要注意以下几点。比如在静态内部类实现的单例模式中添加如下方法。指定方法来替换在反序列化创建的实例。

2024-03-23 14:35:34 730

原创 Oracle慢sql优化——IS NULL替换为NOT EXISTS

Oracle慢sql优化——IS NULL替换为NOT EXISTS

2024-03-21 21:50:04 626

原创 线程池线程保活以及动态更新线程数

* 线程保活。* 线程池如何动态更新核心线程数和最大线程数?* 提交Callable任务时,线程之间是如何传递值的?* 多余的线程是如何结束生命周期的?

2023-10-18 16:44:55 353

原创 生产问题接口响应慢之or条件查询

收到消息第一时间拿到生产日志进行分析,一看日志发现接口最后响应成功,不过从收到前端发送请求到接口响应花了两三分钟时间。突然收到业务部门的联系,说一个页面打开一直转,然后就503超时。所以我认为Oracle进行了优化。

2023-06-08 17:40:33 227

原创 分布式事务解决方案详解

防悬挂:由于网络堵塞丢包,Try操作超时,此时分布式事务回滚触发Cancel操作,故出现Cancel比Try操作先执行。允许空回滚:由于网络丢包导致Try操作失败,必会触发Cancel操作,此时Cancel必须识别出这是空回滚,返回成功。2.Rocketmq服务收到半消息后,给生产者响应半消息发送成功;3.B账户Try操作增加10元,放在Confirm操作处理更简单,并且加上Confirm幂等处理。幂等控制:Try/Confirm/Cancel都必须做幂等判断,防止重复执行。JTA/XA规范实现。

2023-06-07 21:52:20 660

原创 sentinel持久化

在上篇博客中展示了sentinel的源码流程图,在sentinel dashboard新增一条流控规则(或者其他规则),通过http协议将规则信息发送到客户端,客户端通过socket接收到规则信息后,将信息交给流控规则管理器(AuthorityRuleManager)处理,它会出发流控规则监听器执行更新缓存中的流控规则信息(map缓存)。如此便能将规则持久化到nacos,而且无论是更新nacos配置中心的规则还是sentinel控制台的规则,都会持久化并且通过nacos推送到微服务客户端。

2023-05-29 20:09:27 1360

原创 sentinel原理分析及源码剖析

sentinel功能可参考可以从sentinel的dashboard中了解到sentinel的核心功能包括。

2023-05-26 17:28:25 1000

原创 Sentinel入门使用

首先我们通过案例演示了sentinel的具体功能和效果。再来看它到底是什么以及工作原理,相对来讲更容易理解,sentinel相关文档可参考官方文档。

2023-04-06 13:48:43 571 1

原创 spring事物使用示例及原理总结

如果b()方法事务传播属性为REQUIRES_NEW,表示在执行b()方法时创建新事物,此时a()方法事务的提交和回滚可以不受b()方法的事务控制。在test()方法直接调用abc()方法,并在test()方法添加@Transactional,test()和abc()方法分别会更新id=1和id=2的数据name字段,abc()方法中会抛出异常。最终两个方法执行的数据库更新操作还是会回滚,因为线程在执行abc()方法后抛出的异常,在test()方法中并没有处理这个异常,所以两个事务都会回滚。

2022-12-25 22:19:57 697

原创 Java责任链模式实战及日常开发应用场景

责任链模式的应用场景

2022-10-23 14:06:18 745

原创 nacos源码级别集群启动及拉取数据同步流程

1、集群环境维持每个service心跳的算法,对于一个服务类型会对他的serviceName进行hash,然后对集群节点数量求余,得到一个节点,该节点就是维持该服务类型所对应的所有实例。2、节点之间同步服务实例数据就是基于1中选出来的节点,每个节点会向其他节点同步自己维持心跳的服务的所有实例。

2022-09-29 19:33:25 1757

原创 nacos配置中心源码分析——长轮询动态刷新

所谓动态刷新是指nacos用户交互页面发布或者更新配置,在spring cloud微服务中是如何感知的,并且如何动态刷新配置?用户操作nacos UI交互页面发布配置请求,请求url:config/v1/cs/configs。请求来到nacos服务端的ConfigController.publishConfig()方法,由于没有选择beta发布,所以betaIp为空,tag好像是跟容器部署有关。所以直接执行如下if里面两个核心方法:persistService.insertOrUpdate()和Config

2022-09-23 11:11:21 1269

原创 nacos配置中心源码分析——拉取配置信息

个人认为分析配置中心的源码要比注册中心更需要spring boot源码的理解,主要体现在更新或者刷新容器内部配置文件内容。主要分为两部分讲解:1、spring boot启动集成nacos及拉取远端配置信息;2、nacos动态更新配置,客户端如何感知并在未重启应用的情况下如何刷新配置。

2022-09-19 14:18:51 4049

原创 nacos源码深度剖析理解之注册中心

回到服务注册流程,在服务注册之前会创建BeatInfo对象调用addBeatInfo()方法,然后创建BeatTask任务提交到定时任务的线程池该任务只干一件事,就是每隔5s给nacos服务发送心跳请求:/instance/beat。

2022-09-05 21:43:42 1111 2

原创 Feign应用及源码剖析

Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。以下示例全部摘自官网源码。......

2022-08-06 17:34:07 761

原创 Ribbon的使用、拓展机制以及源码分析

继上篇博客学习了nacos的使用,今天继续学习Ribbon和Feign的使用,看Ribbon是如何实现客户端负载均衡,如何实现自己的负载均衡策略?

2022-08-03 17:50:36 305

原创 nacos应用

nacos是阿里巴巴开源的一款优秀的分布式协调注册中心,它同时兼具了eureka的AP架构和zookeeper的CP架构,源码也值得大家学习参考。

2022-08-02 13:49:49 377

原创 Spring Boot启动流程分析及原理

继上一篇博客分析了SpringBoot自动装配过程及原理。今天聊一聊springboot启动到底做了哪些事情,如果不了解spring内部机制的,可能有些过程看不明白。

2022-07-21 17:40:34 729 2

原创 springboot-自动装配原理

上一篇博客已经模拟springboot手写了一个简单springboot项目,相信大家对springboot有了一个基本的认识,设置更层次的理解,同时也简单的实现了springboot是如何通过删除和引入依赖就能做到tomcat和jetty的切换。今天继续聊聊springboot这一重要特性——自动装配@ConditionalOnClass继上一篇博客,它就是判断某个类或者某些类是否存在,如果存在就会加载某个Bean,反之就不加载。......

2022-07-19 22:37:07 965

原创 手写模拟springboot理解底层原理

我们知道springboot内部是通过spring框架内嵌Tomcat实现的,当然也可以内嵌jetty,undertow等等web框架;另外springboot还有一个特别重要的功能就是自动装配,这又是如何实现的呢?

2022-07-18 10:08:50 747

原创 rocketmq集群搭建以及消息顺序消费,消息事务等功能理解

下载当前最新版本的rocketmq:Release Notes - Apache RocketMQ - Version 4.9.3 - Apache RocketMQ rocketmq是java实现的,由于它的高并发而且低延迟的特性,所需要的内存很大,解压后需要修改runserver.sh和runbroker.sh配置文件的堆大小以及元数据空间大小,将默认的java heap配置根据自己虚机的资源进行调整。我的机器实在太烂,堆内存设置比较小runserver.shrunbroker.sh 修改c

2022-06-13 16:23:48 1086

原创 kafka进阶各种机制的原理

kafka是scala语言开发的,它时运行在jvm虚拟机上的,kafka天生就是集群,单个服务也是集群,横向拓展非常方便,修改少量配置即可。当然kafka依赖zookeeper搭建集群,在zookeeper中kafka创建的目录比较多,挑选几个重要目录分析kafka是如何依赖zookeeper工作的。kafka中集群总控制器Controller选举kafka在启动时会向zookeeper发起创建临时节点请求,节点名称为controller,只有第一个到达zookeeper的请求会成功创建contro

2022-05-26 17:50:58 205

原创 kafka入门使用

略过下载及安装,值得注意的是,启动kafka之前需要先启动zookeeper,kafka依赖于zookeeper。kafka跟我们所认知的传统消息队列有所不同,它衍生的一些概念比如消费者组,topic,partition等,如果没有kafka的使用经验似乎有点难以理解。配置server.propertiesbroker.id=0:集群唯一idlog.dirs=/usr/local/data/kafka-logs:kafka消息存放文件log.retention.hours=168:kafka

2022-05-25 10:39:55 787

原创 jvm调优实战

jmap查看内存信息jmap histo /pid > ./log.txt :查看某一进程实例个数,占用内存的字节数,以及所属的类jmap -heap /pid :查看堆信息jmap ‐dump:format=b,file=app.hprof /pid通过jvisualvm命令启动jvm可视化管理界面可导入dump文件进行分析:查看类的实例jstack分析死锁:写一段死锁代码public class DeadLockTest { priva.

2022-05-23 17:51:26 373

原创 jvm垃圾回收算法和垃圾回收器

垃圾回收算法jvm垃圾回收算法包括复制算法、标记清楚算法和标记整理算法,它们都基于分代收集理论。所谓分代收集理论,可以理解为jvm根据对象的生命年龄将他们分在不同的内存模块,也就是熟知的新生代和老年代。由于新生代存储的对象大部分都是朝生夕死的对象,一般使用复制算法,只需要付出少量的复制成本就能满足了。而老年代的对象生命周期都比较长,一般会选择标记-清楚或者标记-整理算法。复制算法是比其他两种算法快10倍以上的。标记-复制算法复制算法是将内存区域划分为两个模块,如下图,在内存被整理前,左边的内存区

2022-05-12 18:01:07 945

原创 jvm对象创建和分配机制

对象的创建类加载检查分配内存初始化设置对象头执行<init>方法对象内存分配对象内存回收

2022-05-12 09:32:51 187

原创 Netty源码吐血总结

为了整明白netty源码花了将近一个月的时间。首先掌握基础知识:操作系统的网络IO、TCP传输协议、socket是什么、网络IO模型、线程池中线程的执行原理、线程异步执行等一系列学习netty源码之前都要掌握的知识。netty使用写各种handler对网络数据包的处理。源码大致流程:// Configure the server. EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGr

2022-05-09 18:03:47 887

原创 线程及线程池技术原理分析

线程线程是调度CPU资源的最小单位。java线程与OS线程保持1:1的映射关系,也就是一个java线程会对应操作系统中的一个线程jdk中定义了线程的6种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATEDpublic enum State { /** * Thread state for a thread which has not yet started. */

2022-05-03 17:18:31 607

原创 网络编程socket,BIO,NIO

Socket理解Socket是什么?Socket在JDK包里就是一个普普通通的类,里面定义了一组跟网络编程相关的方法(API),比如容易理解的connect(),bind()方法,分别是客户端建立连接,服务端绑定端口的API,从这个层面理解Socket就是一组处理网络io的API。它把TCP/IP协议族中网络通信代码(如TCP建立连接的过程)进行封装,相当于介于应用程序和TCP/IP协议族之间的中间软件抽象层。以TCP协议为例,一台主机(client)上的应用程序需要与另一个主机(server)上的

2022-04-17 17:40:21 903

原创 TCP/IP协议、网络IO编程(BIO/NIO)

ISO网络模型与TCP/IP模型对比TCP/IP协议族IP网络协议是tcp/ip协议中非常重要的协议,它一般用来确定网络中唯一的一台计算设备。TCP协议是一个面向连接的可靠的协议,TCP通过三次握手建立连接和四次挥手关闭连接,通过带重传机制的肯定确认来确保数据的可靠性。UDP是不可靠的协议,数据发出去以后不管对端有没有接收到,可能会出现丢包的现象。数据传输为什么端口号有 65535 个?因为在 TCP、UDP 协议报文的开头,会分别有 16 位二进制来存储源端口号和目标端口号

2022-04-13 18:06:48 2939 2

原创 shardingJDBC源码流程及实现可插拔的SPI机制

上篇博客已经知道shardingjdbc相关的分片策略、绑定表以及广播表等功能,这篇博客整理的是读写分离,spi机制实现自定义分片键的生成策略以及核心源码流程读写分离shardingJDBC的读写分离是基于mysql的主从复制,通过写主库读从库来提升系统的性能,mysql的主从搭建请参考CSDN这篇博文,shardingJDBC读写分离的配置如下:(配置的库和表都请参考CSDN)#读写分离spring.shardingsphere.datasource.names=m1,s1# 配置第

2022-04-12 09:54:51 534

原创 shardingsphere之sharingjdbc

shardingsphere目前的定位已经远超过人们熟知分库分表的功能,其拥有自己的生态圈(sharingjdbc,sharingproxy,sidecar),未来宏图规划高大上,官方的一段定义:Apache ShardingSphere 是一套开源的分布式数据库增强计算引擎,其通过可插拔架构构建基于数据库之上的生态系统,实现包括数据分片、弹性伸缩、加密脱敏等功能为代表的增强能力。shardingjdbcshardingjdbc的主要功能在客户端进行数据分片和读写分离,通过shardingJDBC,

2022-04-10 17:20:55 2917

原创 mysql主从复制集群搭建及原理

在centos7中安装了5.6版本的mysql——两台机器配置master主节点编辑文件my.cnf:vim /etc/my.cnf#server-id表示该mysql节点在集群中的唯一标识server-id=11#开启binlog#指定文件名log_bin=master_bin#binlog日志文件log_bin-index=master_bin.indexskip-name-resolve重启mysql服务:systemctl restart mysqld,查看mas.

2022-04-08 17:41:03 1541

空空如也

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

TA关注的人

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