本文为分布式系列文章的集锦汇总,长期保持置顶及更新,读者可以在本文中更好的学习到某个具体的系列。

注: 转载本博客文章请注明出处,原创不易,洗文可耻。

我说分布式事务系列

文章链接
我说分布式事务之TCC
我说分布式事务之最大努力通知型事务
我说分布式事务之可靠消息最终一致性事务1-原理及实现
我说分布式事务之消息一致性事务2-rocketmq的实现
【汇总】我说分布式事务系列
分布式事务之聊聊TCC
分布式事务最终一致性常用方案
TCC-Transaction源码解析之事务执行
TCC-Transaction源码解析之事务补偿

跟我学RocketMQ

文章链接
[1-1]安装RocketMQ
[1-2]安装RocketMQ-Console管理平台
[1-3]发送普通消息及封装DefaultMQProducer支持spring
[1-4]消费消息及封装DefaultMQPushConsumer支持spring
[1-5]发送事务消息实现分布式事务及封装TransactionMQProducer支持spring
[2-0]跟我学RocketMQ之消息重试
[2-1]跟我学RocketMQ之消息幂等
[2-2]跟我学RocketMQ之消息轨迹实战与源码分析
[2-3]跟我学RocketMQ之消息发送源码解析
[2-4]跟我学RocketMQ之批量消息发送源码解析
[2-5]跟我学RocketMQ之消息消费源码解析-p1
[2-6]跟我学RocketMQ之消息消费源码解析-p2
[2-7]跟我学RocketMQ之订阅关系一致性源码讨论
[2-8]跟我学RocketMQ之消息拉取源码解析
[2-9]跟我学RocketMQ之开源客户端混合云实践与案例解析
[2-10]跟我学RocketMQ之事务消息发送源码解析
[2-10]跟我学RocketMQ之事务消息存储源码解析
[2-11]跟我学RocektMQ之事务消息提交及回查源码解析
[2-12]跟我学RocketMQ之定时消息源码解析

分库分表

文章链接
我说分布式之分库分表
跟我学shardingjdbc之shardingjdbc入门
跟我学shardingjdbc之使用jasypt加密数据库连接密码
跟我学shardingjdbc之分布式主键及其自定义
跟我学shardingjdbc之自定义分库分表策略-复合分片算法自定义实现

Read More

本文将主要记录在日常开发中遇到的各种问题。以技术类别进行章节划分,作为个人的编码备忘录随时进行查阅,并长期进行置顶。

JavaCore相关

该模块主要记录JavaCore相关的技术点

bigdecimal四舍五入

BigDecimal.ROUND_HALF_UP: 遇到.5的情况时往上近似,例: 1.5 ->;2
BigDecimal.ROUND_HALF_DOWN : 遇到.5的情况时往下近似,例: 1.5 ->;1

bigDecimal转换为百分比,保留若干小数

DecimalFormat decimalFormat = new DecimalFormat("0.00%");
BigDecimal decimal = new BigDecimal(count.intValue()).divide(new BigDecimal(allCount), 5, ROUND_HALF_UP);
String formatted = decimalFormat.format(sdPercent);

bigDecimal精确度

BigDecimal.setScale(5,  BigDecimal.ROUND_HALF_UP)  -->保留五位小数,最后一位遇到.5的情况时往上近似

Read More

今天我们聊聊RocketMQ基于拉模式的两种消费方式。

对于消费而言,RocketMQ提供了推拉两种方式,我们常用的是基于长轮询的DefaultPushConsumer,它具有实时性好,易开发等特点。

但同时由于是长轮询,因此在大量消息消费的场景下,可能导致broker端CPU负载较大等情况,因此我们会在这种情况下选择使用拉模式的

PullConsumer或者MQPullConsumerScheduleService+PullTaskCallback这两种方式进行更为灵活的消费。

Read More

大家好,跟我学RocketMQ系列并没有结束。随着笔者对RocketMQ的学习与感悟不断深入,我们的旅程也在继续。

本文我将带领读者朋友们一睹RocketMQ实现高性能消息存储的原理,以及它背后的核心Mmap的风采。

RocketMQ消息持久化(消息不丢失)原理

在之前的文章中我们已经得知,broker通过调用以下代码实现消息持久化

putMessageResult = this.brokerController.getMessageStore().putMessage(msgInner);

我们先不深入putMessage方法的内部实现,单说它背后的原理:CommitLog的顺序写入机制

CommitLog顺序写,其实就是一个WAL,即write ahead log。

Read More

本文开始继续我们的造轮子之旅。

这个系列笔者将带领读者朋友实现简易的基于Netty、curator以及springBoot等技术的一个简易RPC通信轮子。

实现最基本的服务发现、服务注册、RPC通信等功能。该项目命名为:misaka,她是《某科学的超电磁炮》的女主角御坂美琴的名字。

本文是该系列的第一篇,主要实现服务注册与发现功能。

我选择zookeeper作为服务注册发现的核心组件,使用curator作为与zookeeper通信的客户端。

curator提供了一个服务注册发现的实现,curator-x-discovery,只需要在项目中引入即可。

Read More

在Spring项目中,我们希望bean的注入不是必须的,而是依赖条件的。

只有当项目中引入特定依赖库、或者只有当某个bean被创建、或者设置了某个环境变量时,才会创建这个bean。

在Spring4之前,这种条件注入的方式还不支持,在Spring4之后引入了一个新的注解 @Conditional ,这个注解作用在@Bean注解修饰的方式上。它能够通过判断指定条件是否满足来决定是否创建这样的Bean。

使用@Conditional注解需要满足一定条件:

@Conditional注解的类要实现Condition接口,它提供了一个matches()方法。只有matches()方法返回true时, 则被@Conditional注解修饰的bean就会被创建出来,否则不会创建(即matches方法返回false)。

接下来,我们对@Conditionl注解进行深入探讨。

Read More

2019,岁末。

迟迟没有动笔,不知从何讲起。

2019,变化的一年,踏实的一年,平静的一年。

变化,在于工作。原计划2020年六月的行动,提前半年实施。

坐在新的办公桌前,我敲下这段文字,生活就是这样,一个个选择造就了现在的自己。关于工作更迭,不再多言,已经在之前的文章中详细写过。

Read More

我们在开发中通常会使用邮件方式进行告警,传统的邮件发送整合起来较为繁琐,因此Spring Boot提供了一套更为简洁易用的整合方案,对Java Mail进行了封装,能够让业务更快的具备邮件发送能力。

本文主要讲解如何为Spring Boot应用添加邮件发送能力。

依赖引入

首先还是要有一个Spring Boot应用,这个就不再赘述了。在maven中央仓库搜索Spring Boot邮件发送模块,将坐标添加到项目的pom下。(这里以2.2.1RELEASE举例)

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

Read More

Fork me on GitHub