自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 学习中间件,从这里开始

1. DockerDocker:Docker入门,这里没有废话Docker:Docker图像化之PortainerDocker:Harbor镜像仓库安装及使用2. GitlabGitlab:如何搭建自己的代码托管服务器3. JenkinsJenkins:持续集成及Jenkins介绍Jenkins:安装和持续集成环境配置Jenkins:用户权限管理Jenkins:凭证管理Jenkins:Maven安装和配置Jenkins:项目构建类型详解Jenkins:常用的构建触发器J

2020-06-07 09:15:59 251

原创 MiniMall:项目文档目录

1. 项目介绍mini-mall项目是一个小型的购物中心管理系统。具体来说,它是一个将当前购物中心核心概念和业务抽离出来的后台管理系统。采用前后端分离的架构实现,所有的数据都通过Restful接口进行交互。其中服务端为当前最流行的微服务架构,基于Spring Cloud(H版)技术栈、Redis、MongoDB、RabbitMQ、Elastic Stack等技术实现相关业务功能,在项目功能和技术本身真正做到麻雀虽小五脏俱全。前端则是使用Extjs技术框架实现。2. 源码地址mini-mall(服务端

2020-05-16 08:27:10 370

原创 SpringCloud-拜托!面试请不要再问我Spring Cloud底层原理实战

上一篇我们说到《拜托!面试请不要再问我Spring Cloud底层原理》,我们大概了解了Spring Cloud中各个组件的作用以及其背后实现的原理。但是俗话说得好,实践是检验真理的唯一标准。这一篇我们动手实践一下,即搭建一个包含订单服务、库存服务、仓库服务、积分服务的微服务架构项目。一、项目的工程结构工程名 服务名 端口号 shop-parent 父工程 ...

2018-12-30 17:44:02 2618 1

原创 不要慌,选择排序也是一样简单的

选择排序没有比冒泡排序难到哪去,一点都不慌

2022-08-14 10:01:49 212 1

原创 你说你学过数据结构和算法,但不知道冒泡排序?

最简单的排序算法:冒泡排序

2022-08-13 12:13:37 212

原创 这篇文章可能是把时间和空间复杂度讲得最透彻的了

研究算法的最终目的就是:如何花更少的时间,如何占用更少的内存去完成相同的需求。

2022-08-13 09:17:16 281

原创 如果这些数据结构和算法的基本概念都不知道,那还是不要学了

数据结构本质上就是:数据元素按照一定的关系组织起来的集合,它是用来组织和存储数据的。

2022-08-10 22:51:02 348

原创 重构:提炼方法

提炼方法顾名思义是将一个代码片段提炼出来放在一个独立的方法中。提炼方法是重构手段中最简单也是最常用的一个手段,我自己在重构一段代码中,很多时候第一件事就是提炼方法。那么该怎么使用这个手段呢,什么情况下需要使用这个手段。很多人可能也都知道,当一个方法较长时,就可以提炼方法来保证每个方法都足够的精短;当一个代码片段被多个地方使用时,考虑到代码复用,我们就可以将其提炼出来。这两种情况都没有错,但我认为最合理的一个观点是:提炼方法,以将意图与实现分开。如果你需要花时间浏览一段代码才弄清它到底在干什么,那么就应该将

2021-03-08 21:45:25 408

原创 重构:遇到多个参数初始化时可考虑建造者模式

前面我们提到使用静态工厂方法代替构造方法,因为静态工厂相对于构造方法有诸多个优势。但静态工厂和构造方法有一个共同的局限性:它们都不能很好地扩展到大量的可选参数。比如我们有一个用于描述字段属性的类,一个字段通常包含:字段名、字段标题、字段是否可见、字段是否必填等等属性,其中字段名、字段标题是必填的,其它都是非必填。对于这样的类,我们应该怎么设计它。通常来说,大部分的开发者都会想到使用重载的方式来提供几个可能的构造方法保证客户端可以快速的创建出这样的一个字段对象出来。比如这样:public class Fi

2021-01-07 21:01:17 259

原创 重构:用静态工厂方法代替构造方法

对于类而言,为了让客户端获取它自身的一个实例,最传统的方法就是提供构造方法。除此之外,我们今天将介绍的静态工厂方法也是被用得很广泛的一种方式。比如Boolean源码中将boolean基本类型值转换成一个Boolean对象引用:public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE);}如果不通过公有的构造方法,或者说除了公有的构造方法之外,类还可以给它的客户端提供静态工厂方法。提供静态工厂方法而不是公有的构造方法

2020-12-31 19:31:41 213

原创 重构:不可变对象

1. 什么是不可变对象不可变对象也称之为值对象,《Effective Java》一书中给出这样的定义:不可变对象是指每个对象中包含的所有信息都必须在创建该对象时提供,并在对象的整个生命周期内固定不变。比如下面这段代码:public class ImmutableObject { private int value; public ImmutableObject(int value) { this.value = value; } public int getValue() {

2020-12-19 09:43:29 186 1

原创 重构:给“娃”起个好名字吧

回想一下,我们平时写代码过程中,做得最多一件事是什么?创建一个类,我们要给类起一个名字;创建一个方法,我们要给方法起一个名字;创建一个变量,我们要给变量起一个名字。可想而知,我们无时无刻都在命名,所以我们重构的第一招就是给“娃”起个好名字。但是也有人会问了:不好、一般或者好的命名对代码编译、运行并没有影响,为什么要花把时间浪费在这个无意义的事上。话虽如此,但实际上一个好的命名是整洁编程的核心。写出来的代码在大部分的情况下,是给人看的,我们应该追求写出人能够读懂而不是仅机器能够读懂的代码。在我还没有太多编程

2020-12-12 08:57:23 235

原创 重构:开篇

作为《重构计划》的开篇,今天我们一起来探讨关于重构的一些理论,然后我们在后面再介绍一系列的重构手段。1. 什么是重构百度百科给出重构的定义:重构就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。先说我的结论,对于百度百科的这个定义,个人认为还不够严谨。首先,重构的前提是在不改变当前代码的业务逻辑下对代码内部结构进行调整;其次,重构的结果并不一定在性能上有很大的提高,相反,有些重构可能还会比重构前的代码性能更低一点。但总体来说,重构的目的是在不改变代

2020-12-05 09:17:32 203

原创 分布式事务:解决方案之最大努力通知实战

1. 业务说明下面我们通过RocketMQ中间件实现最大努力通知型分布式事务来模拟充值过程。我们有账户系统和充值系统两个微服务,其中账户系统对应的数据库是bank1,其中包括一条张三账户记录。充值系统的数据库使用pay数据库,记录了账户的充值记录。业务流程图如下:2. 开发环境数据库:MySQL-5.6微服务框架:spring-boot-2.2.2.RELEASE、spring-cloud-Hoxton.SR1、rocketmq-spring-boot-2.0.22.1 启动程序源码地址:

2020-08-30 19:35:58 433

原创 分布式事务:解决方案之最大努力通知理论

常见的分布式事务四大解决方案:2PC、TCC、可靠消息最终一致性、最大努力通知。前三种解决方案我们都分别从理论和实战两个维度做了讲解。今天我们来说说最大努力通知这个解决方案的理论部分。1. 什么是最大努力通知先来看看下面这个充值的例子:交互流程如下:(1)账户系统调用充值系统接口发起支付请求。(2)充值系统完成支付处理向账户系统发起充值结果通知。若通知失败,则充值系统按策略进行重复通。(3)账户系统接收到充值结果通知修改充值状态。(4)账户系统未接收到通知会主动调用充值系统的接口查询充值结果

2020-08-27 22:00:24 377

原创 分布式事务:解决方案之可靠消息最终一致性实战

在《分布式事务:解决方案之可靠性消息最终一致性理论》中我们说到可靠消息最终一致性主要有两个解决方案:一个是本地消息表+MQ;一个是RocketMQ事务消息。今天我们重点演示一下第二个方案的实现细节。1. 业务说明下面我们通过消息中间件(RocketMQ)实现分布式事务来模拟两个账户的转账交易过程。交易过程是:张三给李四转账指定金额。2. 开发环境数据库:MySQL-5.6微服务框架:spring-boot-2.2.2.RELEASE、spring-cloud-Hoxton.SR1、rocketm

2020-08-24 21:06:50 442 1

原创 分布式事务:解决方案之可靠消息最终一致性理论

1. 什么是可靠消息最终一致性可靠消息最终一致性:是指当事务发起方执行完成本地事务后发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理成功,即强调的是只要消息发给事务参与方最终事务要达到一致。该方案通常是利用消息中间件完成,如下图:事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件之间,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络通信的不确定性会导致分布式事务问题。因此可靠消息最终一致性方案要解决以下几个问题:

2020-08-21 21:48:51 311

原创 分布式事务:解决方案之TCC实战

目前市场上的TCC框架有很多,比如以下几种(以下数据采集日为2020年07月05日):名称地址star数量tcc-transactionhttps://github.com/changmingxie/tcc-transaction4785Hmilyhttps://github.com/yu199195/hmily2835ByteTCChttps://github.com/liuyangming/ByteTCC2408EasyTransactionhtt

2020-08-19 20:22:05 972 1

原创 分布式事务:解决方案之TCC理论

TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试

2020-08-15 08:49:50 575 2

原创 分布式事务:解决方案之2PC实战

说完《分布式事务:解决方案之2PC理论》,我们现在就要在理论的基础上实践一把。1. 业务说明下面我们通过Seata中间件实现分布式事务来模拟两个账户的转账交易过程。交易过程是:张三给李四转账指定金额。2. 开发环境数据库:MySQL-5.6微服务框架:spring-boot-2.2.2.RELEASE、spring-cloud-Hoxton.SR1、spring-cloud-alibaba-2.1.0.RELEASESeata服务端(TC):1.1.0。(下载地址:https://github

2020-08-12 20:36:52 1024 2

原创 分布式事务:解决方案之2PC理论

现在我们了解了《分布式事务:三个概念》和《分布式事务:两个理论》,以这些为基础。针对不同的分布式场景,业界常见的有四大解决方案:2PC、TCC、可靠消息最终一致性、最大努力通知。今天我们先说说2PC这个解决方案。1. 什么是2PC2PC即两阶段提交协议,是将整个事务流程分为两个阶段:准备阶段(Prepare phase)、提交阶段(commitphase),2是指两个阶段,P是指准备阶段,C是指提交阶段。整个事务过程由 事务管理器(TM:Transaction Manager) 和 事务参与者(Re

2020-08-01 10:02:23 383

原创 分布式事务:两个理论

说完分布式事务的三个概念,我们再来说说分布式事务中的两个理论。1. CAP理论1.1 理解CAPCAP是 Consistency、Availability、Partition tolerance三个词语的缩写,分别表示一致性、可用性、分区容忍性。为了方便对CAP理论的理解,我们结合电商系统中的一些业务场景来理解CAP。如下商品信息管理的执行流程图:整体执行流程如下:(1)商品服务请求主数据库写入商品信息。(2)主数据库向商品服务响应写入成功。(3)商品服务请求从数据库读取商品信息。1.

2020-07-29 21:01:23 277

原创 分布式事务:三个概念

作为分布式事务专题的开篇,我们先来聊一聊跟事务相关的三个概念:事务、本地事务、分布式事务。1. 事务什么是事务?简单来说就是在一个有多个小任务的大任务中,所有的小任务要么全部成功,要么全部失败。也就是不会有部分成功,部分失败的情况存在。2. 本地事务本地事务通常是指利用数据库本身的事务特性来实现的事务,因此我们也称之为数据库事务。说到本地事务,不得不提到它的四大特性:(1)A(原子性):构成事务的所有操作,要么全部执行成功,要么全部不执行,不可能出现部分成功部分失败的情况。(2)C(一致性):在

2020-07-26 10:37:25 306

原创 RabbitMQ:集群

单机版的RabbitMQ服务器集群模式,不仅要面临服务器因为各种原因导致崩溃无法使用的情况,其吞吐量也是有限的。购买昂贵的服务器来增强单机RabbitMQ服务的性能显得捉襟见肘时,搭建一个RabbitMQ集群才是解决实际问题的关键。RabbitMQ集群允许消费者和生产者在RabbitMQ单个节点崩溃的情况下继续运行,它可以通过添加更多的节点来线性地扩展消息通信的吞吐量。当其中一个RabbitMQ故障时,客户端能够重新连接到集群中的任何其它节点并继续生产或者消费。不过RabbitMQ集群不能保证消息的万无

2020-07-20 20:57:03 922

原创 RabbitMQ:生产者确认

在使用RabbitMQ的时候,可以通过消息持久化操作来解决因为服务器的异常崩溃而导致的消息丢失。除此之外,我们还会遇到一个问题,当消息的生产者将消息发送出去之后,消息到底有没有正确地到达服务器呢?如果不进行特殊配置,默认情况下发送消息的操作是不会返回任何信息给生产者的,也就是默认情况下生产者是不知道消息有没有正确地到达服务器。如果在消息到达服务器之前已经丢失,持久化操作也解决不了这个问题,因为消息根本没有到达服务器,怎么持久化?RabbitMQ针对这个问题,提供了两种解决方案:通过事务机制实现。通过生

2020-07-19 09:22:26 628

原创 RabbitMQ:过期时间TTL和死信队列、延迟队列

上一篇《RabbitMQ:消息何去何从》我们说到当一条消息无法被正确路由到队列时,消息可能被返回给生产者、也可能直接丢弃或者使用备份交换器将消息存储起来。今天说一下RabbitMQ另外三个重要的特性和功能。1. 过期时间TTLTTL:Time to Live的简称,即过期时间。RabbitMQ可以对消息和队列设置TTL。1.1 设置消息的TTL目前有两种方法可以设置消息的TTL,第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间;第二种方法是对消息本身进行单独设置,每条消息的TTL可以不

2020-07-18 20:05:14 513

原创 RabbitMQ:消息何去何从

在正常情况下,生产者产生并发送一条消息然后被交换器正确路由到某个队列中。但是如果一条消息不能被正确路由到某个队列时,那么这条消息该何去何从呢?RabbitMQ提供以下几个处理方案:(1)将消息返回给生产者;(2)直接将消息丢失;(3)使用备份交换器将未能被路由的消息存储起来。1. 返回给生产者void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicPropert

2020-07-12 09:27:33 269

原创 RabbitMQ:客户端开发api介绍

RabbitMQ环境有了,核心概念也了解完了,接下来我们有必要了解一下客户端开发api。1. 交换器1.1 声明交换器exchangeDeclare有很多个重载方法,这些重载方法都是有下面这个方法中缺省的某些参数构成。Exchange.DeclareOk exchangeDeclare(String exchange, String type,

2020-07-11 09:36:02 289

原创 RabbitMQ:快速入门

和RocketMQ一样,RabbitMQ作为消息中间件,主要负责接收、存储和转发消息。同时RabbitMQ也有生产者和消费者的概念,我们先来看看其整体模型架构。如下图:1. 核心概念介绍1.1 生产者和消费者Producer:生产者,投递消息的一方。通常来说,一条消息可以包含2个部分:消息体和标签。消息体一般是一个带有业务逻辑结构的数据,而标签则用来描述这条消息,比如一个交换机的名称和一个路由键。Consumer:消费者,接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列

2020-07-09 20:42:29 233

原创 RabbitMQ:安装

作为《学习RabbitMQ,这里没有废话》系列的开篇,理论上按照我个人的风格是要介绍一下什么是消息,什么是消息中间件,然后再过渡到本篇《RabbitMQ:安装》。但之前在《学习RocketMQ,这里没有废话》系列的开篇《RocketMQ:消息中间件简介》已经做过介绍,所以这里就不多说了,下面直接进入今天的主题。RabbitMQ是当前最主流的消息中间件之一。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Java、JMS、C、PHP等,支持AJAX

2020-07-08 20:37:01 458

原创 RocketMQ:死信队列和消费幂等

1. 死信队列上一篇《RocketMQ:消息重试》中我们提到当一条消息消费失败时,RocketMQ会进行一定次数的重试。重试的结果也很简单,无非就是在第N次重试时,被成功消费。或者就是经过M次重试后,仍然没有被消息。这通常是由于消费者在正常情况下无法正确地消费该消息。此时,RocketMQ不会立即将消息丢弃,而是将其发送到该消费者对应的特殊队列中去。在RocketMQ中,这种正常情况下无法被消费的消息被称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-

2020-07-07 21:12:01 1981

原创 RocketMQ:消息重试

消息的发送和消费并不是百分百成功的,在出现消息推送失败时,RocketMQ有何补偿方式来进行消息重试呢?这是我们今天要一起学习的点。1. 顺序消息的重试对于顺序消息,当消费者消费消息失败后,消息队列 RocketMQ 会自动不断进行消息重试(每次间隔时间为 1 秒),这时,应用会出现消息消费被阻塞的情况。因此,在使用顺序消息时,务必保证应用能够及时监控并处理消费失败的情况,避免阻塞现象的发生。2. 无序消息的重试对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,您可以通过设置返回状

2020-07-05 09:57:55 1303

原创 RocketMQ:高可用机制

RocketMQ分布式集群是通过Broker节点的Master和Slave配合达到高可用性的。Master和Slave的区别:在Broker的配置文件中,参数 brokerId的值为0表明这个Broker是Master,大于0表明这个Broker是 Slave,同时brokerRole参数也会说明这个Broker是Master还是Slave。Master角色的Broker支持读和写,Slave角色的Broker仅支持读,也就是Producer只能和Master角色的Broker连接写入消息;Consu.

2020-07-04 10:18:29 527

原创 RocketMQ:消息存储

通常来说我们对分布式队列有高可靠性的要求,所以数据要进行持久化存储。消息生产者发送消息到MQ。MQ收到消息,将消息进行持久化,即在存储系统中新增一条记录。返回ACK确认消息给生产者。然后MQ推送消息给对应的消费者,等待消费者返回ACK。如果消息消费者在指定时间内成功返回ACK,那么MQ认为消息消费成功,在存储系统中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新推送消息,重复执行4、5、6步骤。1. 存储介质关系型数据库DB存储系统可选用J

2020-07-03 21:18:40 406

原创 RocketMQ:消息发送与消费

在此之前,我们已经介绍过《RocketMQ:快速入门》和《RocketMQ:搭建集群》。现在我们已经准备好RocketMQ的环境了,接下来就是通过实战去演示RocketMQ中各种消息类型的生产和消费了。1. 开发环境(1)引入RocketMQ客户端依赖<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId&

2020-07-02 21:04:03 2075

原创 RocketMQ:搭建集群

在上一篇《RocketMQ:快速入门》之后,今天说一说如何搭建RocketMQ集群。首先看一下集群架构图:1. 集群特点NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName。不同的BrokerId来定义,BrokerId为0表示Master,非0表示Sla

2020-06-30 20:49:16 5347

原创 RocketMQ:快速入门

RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发。在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。今天我们将安装RocketMQ,并简单的使用入门案例体会一下RocketMQ。1. 准备工作1.1 下载RocketMQ毋庸置疑的,首先我们要下载RocketMQ,RocketMQ当前最新版本:4.7.0,本次我们使用的是4.4.0这个版本。官网地址:http://rocketmq.apache.org/1.2 环境要求Linux

2020-06-28 20:47:24 1172

原创 RocketMQ:消息中间件简介

1. 什么是消息中间件(1)什么是消息?消息是指:在应用程序之间传递的数据。消息可以非常简单,比如只包含文本字符串、JSON等;但也可以很复杂,比如一个对象。(2)什么是消息中间件?消息中间件是指:利用高效可靠的消息传递机制进行与平台无关的数据(我们说消息就是数据,所以这里也就是消息)交流,并基于数据通信来进行分布式系统的集成。2. 消息中间件的优缺点2.1 优点(1)应用解耦系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子

2020-06-27 09:44:35 924

原创 Redis:集群

Redis主从复制解决了读写分离,实现负载均衡的目的。哨兵机制解决了主从复制架构中当主节点宕机后,需要人为介入进行故障恢复的问题。但是随之而来的是另一个问题,Redis的每个节点都存储了所有的数据,从而导致整个架构中总数据的存储能力取决于可用存储容量最小的那个节点。于是对Redis进行集群部署,实现水平扩容也变得尤为重要。实现水平扩容的一种方案是启动多个Redis节点,然后由客户端决定每个键由哪个Redis节点存储,下次客户端读取该键时直接到该节点读取。这样当我们把整个数据分布存储在N个节点中时,每个节点

2020-06-26 09:25:22 383

原创 Redis:哨兵

在《Redis:主从复制》的最后,我们提到“从节点持久化”,在一个典型的主从架构的Redis系统中,从节点在整个系统中起到数据冗余备份和读写分离的作用。当主节点遇到异常中断服务后,开发者可以通过手动的方式选择一个从节点来升级为主节点,以使得系统能够继续对外提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。为此,Redis提供哨兵工具来实现自动化的系统监控和故障恢复功能。1. 什么是哨兵哨兵的作用就是监控Redis系统的运行状态,它的功能包括以下两个:(1)集群监控:监控主节点和从节点是否正

2020-06-25 09:47:30 250

空空如也

空空如也

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

TA关注的人

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