这是一个新的系列,主要讲Java8的lambda编程以及Stream流式编程相关的用法和案例。

这个系列脱胎于一个内部的分享,由于篇幅较长,内容较多,因此拆分成多篇文章进行发布,方便自己后续参考,也希望能够帮到读者朋友。

在这里重点感谢慕课网的 《告别996,开启Java高效编程之门》 课程。

本文是Java8函数式编程系列的第一篇,我们一起学习一下Java8函数式编程的基本概念及操作。

1.概述Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Read More

zookeeper作为分布式系统中重要的协调组件,在后端开发中是难以绕开的一个重要知识领域。

可以说,只要在后端领域,比如说Java开发、大数据开发中呆过三年及以上的工程师,或多或少都接触过或者直接使用过zookeeper。

因此笔者开启本系列,作为自己学习zookeeper(后文均称为zk)的记录,如果能够启发读者那就更好不过了。

zookeeper概述

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。

它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

度娘如是说。

zookeeper,直译过来就是动物园管理员,之所以这么说,主要是因为它在大数据技术栈中扮演了重要的协调角色。

在hadoop技术栈中,各种技术的logo都是小动物,而zookeeper的官方logo也是一位园丁模样的男士。这也直观的告诉了使用者,zk的用途和角色。

一言蔽之,zk就是在分布式系统中,对应用提供一致性保证,分布式选主,通过各种机制,对应用进行协调,从而使分布式系统对外提供某种特定的服务。

zookeeper官方形象

Read More

有段时间没写东西了,再不写就有点说不过去了。

今天我们讨论一个轻松的话题,来聊聊RocketMQ中的死信队列

是什么是死信队列

在之前的文章中,我们聊过RocketMQ的消息重试机制。

如果消息消费失败,消费者返回Reconsume_later给RocketMQ broker,队列会按照重试时间窗口对消息进行重试。

当达到最大重试次数(默认16次),消息还是消费失败,RocketMQ不会将该消息丢弃而是会把它保存到私信队列中。

这种不能被消费者正常处理的消息我们一般称之为 死信消息(Dead-Letter Message),将存储死信消息的队列称之为 死信队列(Dead-Letter Queue,DLQ)

Read More

接下来,我将对Spring Bean的生命周期进行较为详细的整理和总结。 本文是该部分的第一篇, 我们重点分析一下BeanDefinition元信息解析是如何进行的。

BeanDefinition主要用来描述Spring的Bean定义,它是一个接口,声明如下:

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

AbstractBeanDefinition这个抽象实现实现了BeanDefinitio接口,它包含了一个Bean定义的主要属性,这里挑选几个重要的进行注释:

Read More

开发中经常有这样的场景:

根据某个类型标识走不同的业务逻辑,通常我们会使用if(type.equals(xxxxx)) 或者 switch语句来进行逻辑处理。

这样做当然是没什么问题的。

当业务逻辑变得越来越复杂,类型标识增多之后,难免会出现if判断增加,或者switch case分支变多,这样的代码往往会过于冗长,代码重复性较大,或者说逼格不够高。

本文介绍一种基于自定义Bean容器的开发方式,消除代码中的判断分支,提升代码可读性。

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

Fork me on GitHub