自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 浅析RocketMQ-消息重建

rocketmq 构建comsumequeue和index消息

2022-09-19 17:48:37 345 1

原创 浅析RocketMQ-CommitLog异步刷盘

rocketmq commitlog异步刷盘

2022-09-18 21:49:54 328

原创 浅析RocketMQ-MappedFileQueue和MappedFile

mappedFile

2022-09-11 17:48:21 363

原创 浅析RocketMQ-存储文件

CommitLog,Comsumequeue,Index

2022-09-04 16:26:38 771

原创 浅析RocketMQ-broker接收消息

介绍broker消息接收的流程

2022-09-02 22:47:52 193

原创 浅析RocketMQ-发个消息

本文将解析生产者发送消息到broker的流程。DefaultMQProducer调用send发送消息,最终实现是DefaultMQProducerImpl#sendDefaultImpl。sendDefaultImpl主要有4步流程:获取主题路由信息负载选择合适的消息队列发送消息到broker如果开启容错机制,更新容错队列 private SendResult sendDefaultImpl( Message msg, final Communication

2022-05-27 18:06:11 253 1

原创 浅析RocketMQ-NameServer和他的定时任务们

NameServer启动过程中,会启动几个定时任务,本文将介绍下这些任务都做了什么操作。一.scanNotActiveBrokerscanNotActiveBroker 这个定时任务,每隔10秒执行一次,用于移除那些失效的broker。在进入scanNotActiveBroker 逻辑前,先看下broker如何注册到NameServer。明白了如何注册,对于移除就更便于理解了。1. 注册broker注册处理入口在DefaultRequestProcessor.processRequest里面p

2022-05-21 14:25:21 607

原创 浅析RocketMQ-NameServer处理器

之前的文章,介绍了NameServer的启动流程,本篇分析下涉及到的几个Netty的处理器。一. NettyEncoderNettyEncoder继承自MessageToByteEncoder。MessageToByteEncoder是Netty提供的基类,用于将返回的对象,转为字节流的处理器public class NettyEncoder extends MessageToByteEncoder<RemotingCommand> { public void encode(C

2022-05-19 21:42:09 222

原创 浅析RocketMQ-NameServer启动

本文以RocketMQ-4.9.3分析。NameServer是一个简易的注册中心,实现了Broker的动态注册与发现功能,提供Producer和Conumser查询Broker的路由信息等。本文主要对其启动流程进行分析,首先来到namesrv工程下的NamesrvStartup类,main方法里面就两个步骤生成NamesrvController对象启动NamesrvControllerpublic class NamesrvStartup { public static void mai

2022-05-18 21:28:32 376

原创 浅析RocketMQ-启动源码

本文中的源码拉取的4.9.3版本。1. 新建一个配置文件夹在源码包的目录下新建一个config文件,将rocketmq-distribution里面的broker.conf,logback_broker.xml,logback_namesrv.xml文件拷贝到config下面。2. 配置broker.conf文件打开config里面的broker.conf文件,追加如下配置# namesrvAddr地址namesrvAddr=127.0.0.1:9876# 自动创建topic,方便测试au

2022-05-18 20:12:57 280

原创 手打RPC-终篇

继续上篇内容,作为最终章,对项目结构进行说以及测试运行效果。项目结构介绍测试效果首先启动nacos如果nacos启动不是standalone模式,文本修改startup.cmd里面的 MODE=“standalone”接着启动consumer,以及provider访问http://localhost:8081/doc.html,进行测试日志拦截器日志请求参数项目详细代码参考...

2022-04-27 17:11:08 275

原创 手打RPC- 拦截器与负载均衡

继续上篇内容,本篇讲解三部分内容,分别是拦截器,负载均衡,以及服务降级。一. 拦截器定义RpcFilter 接口,提供对请求对象和响应对象的处理public interface RpcFilter { Object filterRequest(Object params); Object filterResponse(Object result); /** * 是否支持服务端过滤 * @return */ default boolea

2022-04-27 16:41:14 318

原创 手打RPC-注册订阅服务

继续上篇内容,本篇讲解注册订阅相关内容。本例中的RPC注册服务采用应用级服务,一个应用只向注册中心注册一个实例。相比方法级的注册,减少大量的注册信息,便于服务总量能进行估算等。一. 选择注册中心这里注册中心选用Nacos,为啥选用nacos呢?nacos 有良好的中文文档可以当作配置中心和注册中心较好的后台可视化界面客户端选择了2.x版本, 引入依赖, <properties> <nacos-client.version>2.0

2022-04-27 16:13:12 196

原创 手打RPC-动态注入服务

继续上篇内容,本篇讲解服务启动时,动态注入相关的实例。一.自定义注解自定义的注解分为三部分:容器启动时,自动注入配置的注解服务端注入服务提供者的注解消费端启动引用服务提供者的注解@EnableRainRpc 自动扫包,引入一些默认配置,以及注入RainRpcComponentScanRegistrar,使注解了@RainProvider, @RainConsumer 的类生效。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNT

2022-04-27 11:43:51 504

原创 手打RPC-构建一个通信核心

本篇开始准备手打一个简易的RPC框架。主要实现功能:序列化通信自定义通信协议,进行rpc序列化以及反序列化动态注入服务启动自动注入消费者以及提供者注册中心注册中心获取服务,并监听服务变化拦击器功能提供请求响应拦截功能,提供扩展接口负载均衡实现客户端对服务的负载均衡功能整体流程如下:本章主要实现序列化功能,这里以Netty为核心进行构建。一.pom依赖jdk为1.8,pom 文件依赖如下: <properties> <netty-ver

2022-04-26 20:06:37 1070

原创 Redisson延迟队列剖析

上篇文章讲到了,使用redisson实现延迟队列,本文主要对其设计原理进行分析。redisson实现延迟队列,有三个队列组成,其中一个zset类型的延迟队列,另外两个都是list类型的堵塞队列。整体结构图如下:一.实例化延迟队列实例RedissonDelayedQueue操作,主要设置了一些队列名称,以及创建一个任务 protected RedissonDelayedQueue(QueueTransferService queueTransferService, Codec codec, f

2021-11-24 21:19:42 2207

原创 日常设计-- 延迟队列

最近项目需要用到延迟队列,本来考虑使用MQ实现,但由于目前使用RocketMq,不支持灵活的延迟时间配置,最终采用redis实现延迟功能。一. Redis ZSET实现延迟队列大体思路:使用ZSet结构,以messageId作为value,延迟时间delayTIme作为score。每次获取小于当前时间的数据。推送消息推送消息只是简单将数据以及延迟时间放入延迟队列中。 public void push(long messageId,long delayTime) { long s

2021-11-23 22:24:36 928

原创 SpringBoot - JWT实现登录刷新token

1. 什么是JWTJson web token (JWT) 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。简答理解就是一个身份凭证,用于服务识别。JWT本身是无状态的,这点有别于传统的session,不在服务端存储凭证。这种特性使其在分布式场景,更便于扩展使用。2. JWT组成部分JWT有三部分组成,头部(header),载荷(payload),是签名(signature)。头部头部主要声明了类型(jwt),以及使用的加密算法( HMAC SHA256)载荷载荷就是存放

2021-09-27 22:32:53 4683 6

原创 秒杀的设计与实践

秒杀在电商中是一个很常见的场景。所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售方式从技术角度出发,秒杀是指在短时间内,大量用户并发请求去争夺有限数量的产品。一.秒杀设计考虑的问题对于秒杀,设计时要考虑哪些问题呢?1. 超卖何谓超卖?即指卖出的商品超出了设定的库存。秒杀场景下,商品的价格一般是特别低的,本身就是亏本,吸引客户。一旦出现超卖,会造成大量经济损失。所以超卖可谓第一个要注意点。2. 高并发秒杀都是数秒内出现大量请求,如果这些请求都到数据库,很容易

2021-09-11 21:29:10 379

原创 Redis百万数据排行榜

面试遇到一个问题:现在有百万的数据,要对用户答题做一个排行榜,展示前20的排名信息,用户可以重复进行答题,更新分数排名。一. 导数据入缓存要实时展示一个用户排行榜,如果每次都重数据库查询数据,效率肯定不行。这是考虑到使用Redis缓存。Redis的缓存类型主要有String,Hash,List,Set,ZSet这5种。对于要有序不重复的排行场景,采用ZSet,其中以分数作为score。从数据库导入缓存这里有个点要考虑: 数据量很大无法一次性完成操作?可以根据用户id分区间,每次取一批次的数据导入

2021-08-31 22:04:17 3412

原创 Poi-Tl 自定义插件实现图片浮动于文字上

最近项目中使用了word合成,使用了poi-tl 进行处理。但是遇到要渲染一个图片,就一言难尽了。官网默认的图片渲染结果会占住word的空间大小,导致整体间距会被拉大。迫不得已,只能实现一个图片渲染的插件来实现图片浮动效果。1.渲染类CustomPictureRenderData 是对原poi-tl图片渲染类的扩展,添加了左偏移和上偏移属性。这两属性用于图片位置的调整。public class CustomPictureRenderData implements RenderData {

2021-08-09 21:14:16 2385 4

原创 利益均沾-feign负载均衡流程

feign负载均衡实际是指ribbon的负载均衡,本文主要围绕feign如何在代码中调用ribbon流程进行解析。上篇分析feign的加载流程以及如何执行,但是关于客户端如何执行还留有疑问。这里以业务中常用的okHttp为例,ConditionalOnClass({ ILoadBalancer.class, Feign.class })@Configuration@AutoConfigureBefore(FeignAutoConfiguration.class)@EnableConfigurat

2021-07-13 16:49:19 259

原创 分布式纽带-feign

本文基于openfeign2.1.x版本分布式系统中,不同服务的沟通尤其重要,本文就基于springcloud的feign进行分析。一.启动流程1.先从@EnableFeignClients开始@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients {}@En

2021-07-12 15:06:12 120

原创 切片Netty-SingleThreadEventExecutor

Netty源码分析基于主流的Netty4.x版本。之前文章中经常出现如下代码channel.eventLoop().execute(()->{})本文就来分析下,execute都做了哪些操作。 public void execute(Runnable task) { ... // 当前线程是否是eventLoop关联的线程 // 这里返回false,可能是线程不一致或者是EventLoop还未关联线程 boolean inE

2021-07-08 21:45:05 336

原创 切片Netty-doBind0

Netty源码分析基于主流的Netty4.x版本。承接上篇的initAndRegister,本篇主要看看bind方法里面doBind0。

2021-07-07 16:36:33 83

原创 切片Netty-initAndRegister

Netty源码分析基于主流的Netty4.x版本。继续围绕之前demo,本篇主要看看bind方法里面initAndRegister。一.doBind流程概述略过中间跳转,进入AbstractBootstrap的doBind方法private ChannelFuture doBind(final SocketAddress localAddress) { // 初始化配置并注册 final ChannelFuture regFuture = initAndRegister();

2021-07-06 22:52:53 117

原创 切片Netty-NioEventLoopGroup

本文基于Netty4.x版本一. 从New一个对象开始1.NioEventLoopGroup构造接前文的demo,NioEventLoopGroup parentGroup = new NioEventLoopGroup();密密麻麻的构造函数,挑一个最全的构造 public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory,

2021-07-05 18:32:48 111

原创 切片Netty-序言

Netty源码分析基于主流的Netty4.x版本。一. Netty模型目前IO模型分为BIO,NIO,AIO三种BIO为堵塞模型NIO模型基于IO多路复用技术AIO模型是真正的异步非堵塞的模型以去营业厅办事为例:BIO 要求你一直在营业厅排队等待,啥事也没法做,直到处理完。NIO 是营业厅改进了服务,提供了播报系统,广播提醒你去办事,期间可以坐在椅子上打打Netty 4.x线程模型基于reactor模型,这是基于NIO模型的技术。reactor模型有可以分为单线程模型,多线程模型,主

2021-07-05 17:46:28 239

原创 SPI-数据库驱动的实现过程

本文基于jdk1.8前文介绍了SPI的实现原理,本篇主要看下,项目中数据库驱动对SPI的使用。以数据源Hikari为例。数据源调用getConnection方法时,会实例HikariPool对象,跟着调用链,最终会调用DriverManager.getDrivers。public class HikariDataSource extends HikariConfig implements DataSource, Closeable { public Connection getConnectio

2021-06-30 17:38:42 366

原创 SPI-自由扩展的入口

本文基于jdk1.8一.SPI是何物?SPI是Service Provider Interface的缩写,用于解耦服务接口与其具体实现。java编程中最常见的SPI实现是解耦数据库驱动。想想平时引入mysql或者postgresql的jar就能连上数据库,是不是很神奇。二. 快速实现SPI接口来动手写一个demo,熟悉下。1. 定义一个用户服务,及其实现public interface UserService { String getUserName(long userId);}

2021-06-30 16:30:53 231

原创 NIO Url文件资源打包下载

最近有个任务是根据获取到的地址一批url,打包成一个zip文件下载。这里有两个考虑:不创建本来临时文件,临时文件创建涉及到临时目录,文件的创建删除等操作,吃力不讨好。整个过程尽可能节省时间及内存空间基于上面两个考虑,整个过程都在流缓冲区,这时考虑到NIO的Pipe管道。为了不使管道中数据过大,读满一个缓冲区,就写出流数据。1. 导出包裹对象FileExport 是一个包裹对象,包含了文件全称,以及路径地址@Data@NoArgsConstructorpublic class File

2021-06-23 15:00:37 214

原创 Thread-打断一下,插个广告 ^ - ^

本文基于jdk1.8一.那个Thread中断一下如何停止一个运行线程呢?很久以前通过stop(),这是属于抢占式的中断。强制停止一个线程,可能造成不可预估的后果。举个例子:例如正在玩游戏,耗时n久通过了,没存档,然后突然断电了。。。,这个后果是砸显示器还是砸显示器呢。现在推荐调用interrupt(),这属于协作式中断。线程中断不代表线程的立即死亡,可能是中断返回等待新的任务,或是线程忙完任务选择合适的时机再死亡。这意味着,调用interrupt,只是标识了线程中断状态,至于要不要死亡或者什

2021-06-18 16:34:35 82

原创 AbstractQueuedSynchronizer-排队队吃果果

本文基于jdk1.8一.我是谁???AbstractQueuedSynchronizer 简称AQS,翻译过来是抽象队列同步器,是多线程访问共享资源的基类。CountDownLatch,ReentrantLock内部都有它的影子。AQS使用的等待队列是“CLH”(Craig、Landin 和 Hagersten)锁定队列的变体。CLH 锁通常用于自旋锁。二. AQS基石node作为AQS的基石,关键属性分类:有前后指针,表示最后组成一个双向链表支持共享和独占两种模式获取资源waitSta

2021-06-17 18:31:25 118

原创 ThreadPoolExecutor线程池-水太深你把握不住

本文基于jdk1.8线程池是池化技术的一种实现,是为了避免频繁创建线程而出现的。一. 构造方式最全的构造方法如下: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,

2021-06-16 18:34:53 88

原创 位掩码-劝你放下遮掩,好好做X

一.这个遮遮掩掩的家伙是谁首先强行解释一波啥是位掩码:位表示二进制的值,一位1表示一个状态值.掩码是与目标数值进行位操作的二进制值.简单理解就是有多种状态的二进制值。二. 遮掩的用处肯定不是装X用的,主要是有两点:快,计算机采用二进制,位操作快需要多个布尔值的场景,例如权限三. 掩码和指定值的操作假设mask为掩码,A为指定状态,主要包含位操作如下, // 获取A状态 mask & A; // 添加A状态

2021-06-15 22:40:02 246

原创 双重检查锁-多一重的快乐

1.单机版单例日常开发中,为了性能考虑,可能要延迟实例化一些对象,这时可能的代码如下public class SingletonDemo { private SingletonDemo() { } private static SingletonDemo instance; public static SingletonDemo getInstance() { if (instance == null) { instance = n

2021-06-10 17:45:59 119

原创 父子间的枢纽-InheritableThreadLocal

本文基本jdk1.8。日常开发中可以用ThreadLocal保存本线程的专属数据。但是要进行并行操作时,如果将父线程数据传递给后续的子线程呢?答案是InheritableThreadLocal。1.InheritableThreadLocalInheritableThreadLocal源码比较简单,继承自ThreadLocal,不了解的可以参考之前ThreadLocal的解析。public class InheritableThreadLocal<T> extends ThreadLo

2021-06-09 21:27:07 57

原创 SpringCloudAlibaba整合seata1.4 AT模式

本文主要讲述SpringCloudAlibaba整合Seata AT模式。其中Nacos作为注册以及配置中心,ShardingSphere用于读写分离,mysql作为数据库。一. 项目核心依赖 <properties> <spring-boot.version>2.3.2.RELEASE</spring-boot.version> <spring-cloud-alibaba.version>2.2.5.RELE

2021-04-11 11:08:31 574

原创 Idea显示service面板及启动页

本文基于IDEA 2020.3废话不多说,直接干货。1. 显示Service面板IDEA加载项目时,有时不会显示Service面板,这时就需要手动设置。1.修改workspace.xml方式打开根目录下的.idea文件夹里面的workspace.xmlworkspace.xml添加如下配置 <component name="RunDashboard"> <option name="configurationTypes"> <set>

2021-04-07 21:50:51 4077

原创 BeanCopier浅拷贝嵌套对象分析

最近项目中使用了BeanCopier,但是使用过程中,存在有些数据无法拷贝成功的情况,故特地进行了整理。1. 素材准备对象A,A1,A2表示源对象,B,B1,B2表示目标对象。A1,B1表示嵌套对象的场景A2,B2表示嵌套集合的场景示例如下:@Data@NoArgsConstructor@AllArgsConstructorpublic class A { private String name;}@Data@NoArgsConstructor@AllArgsConstr

2021-01-12 21:56:26 1064

空空如也

空空如也

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

TA关注的人

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