自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 资源 (1)
  • 论坛 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 用 State 封装状态控制逻辑

第一次看到 State 设计模式我第一个想到的场景就是我们工作中经常会涉及到的“状态机”,State 模式确实比较适合处理“状态机”这样的场景,它可以使不同状态的处理逻辑更内聚。笔者最近的参与的项目中需要将门店的作业场景进行数字化,例如门店工作人员的日常拣货作业、定期库存盘点作业等。每个作业我们都会用状态来控制它的行为,例如“已领取”的作业不能被其他人领取和执行,已关闭的作业不能再次执行,已完成的作业会用于员工的薪水计算等等,所以针对作业的每个行为我们都需要进行状态的校验,并且要控制好状态流转:这是一

2020-11-09 20:40:26 79

原创 DDD聚合设计原则

“话说天下大势,分久必合,合久必分”                  ——《三国演义》那到底什么时候该分?什么时候该合呢?前言领域模型的推演是领域专家和技术同学就对业务的理解和抽象进行讨论和碰撞的过程,通常情况下,对一个具有一定复杂度的业务进行建模,模型之间的关系会非常复杂。在包含复杂关联的模型中,要保证对象修改的一致性是很困难的,我们必须保证紧密关联的对象组也能保证不变性,而不仅仅只保证各个离散的对象。这个问题实际上是源于模型之中缺乏明确的边界,而聚合的出现就是在模型层面来为这个问题寻找解决.

2020-09-29 10:16:33 280

原创 RocketMQ源码解析—客户端消息消费

阅读须知文章中使用/* */注释的方法会做深入分析正文在分析初始化和启动流程时,我们看到无论是 Consumer 还是 Producer 都会初始化和启动 MQClientInstance,而在 MQClientInstance 初始化和启动的流程中,分别会初始化和启动 pullMessageService,pullMessageService 是 RocketMQ push 模式消费的...

2020-04-01 09:56:43 357 1

原创 RocketMQ源码解析之rebalance

阅读须知文章中使用/* */注释的方法会做深入分析正文

2020-03-22 22:49:12 297

原创 CQRS架构窥探

CQRS简介命令查询的责任分离Command Query Responsibility Segregation (简称CQRS) 模式是一种架构体系模式,能够使改变模型状态和查询模型状态的动作实现分离,简单理解就是读写分离。属于DDD应用领域的一个模式。提到读写分离,我们都会用到数据库的读写分离,如MySQL数据库的主备,写主,读备,主备数据的同步由MySQL数据库底层帮我们完成。CQRS在理念...

2020-02-16 17:33:00 298

原创 RocketMQ源码解析—客户端消息发送

阅读须知文章中使用/* */注释的方法会做深入分析正文在使用 RocketMQ 进行消息发送时,我们可以使用 DefaultMQProducer.send 方法进行消息发送,send 方法有很多重载的版本,我们通过最简单的一个切入分析:DefaultMQProducer:public SendResult send( Message msg) throws MQClientE...

2019-11-08 16:47:35 215

原创 RocketMQ源码解析之Consumer停止

阅读须知文章中使用/* */注释的方法会做深入分析正文Consumer 的停止流程和 Producer 的停止流程有很多复用的部分,前面我们已经分析过 Producer 的停止流程,复用部分这里不再重复。Consumer 的停止同样可以依托于 Spring bean 的生命周期,在 Spring bean 销毁时调用 DefaultMQPushConsumer 的 shutdown 方法...

2019-11-07 16:08:31 389

原创 RocketMQ源码解析之Consumer启动

阅读须知文章中使用/* */注释的方法会做深入分析正文<bean id="rocketmqConsumer" class="org.apache.rocketmq.client.consumer.DefaultMQPushConsumer" init-method="start" destroy-method="shutdown"> <pro...

2019-11-07 15:19:21 199

原创 RocketMQ源码解析之Producer停止

阅读需知使用/* */注释的方法会做深入分析正文Producer的停止同样

2019-11-06 14:09:12 304

原创 RocketMQ源码解析之Producer启动

阅读须知文章中使用/* */注释的方法会做深入分析正文使用RocketMQ发送普通消息时,一般我们会进行如下配置:<bean id="rocketmqProducer" class="org.apache.rocketmq.client.producer.DefaultMQProducer" init-method="start" destroy-method="...

2019-11-01 17:02:24 315

原创 浅谈长连接保活机制

前言在日常工作中,我们经常会接触到长连接这个概念,例如一些RPC框架(如Dubbo)、网络通信框架(Netty)等,都会涉及到长连接的概念,我们来探究一下长连接是如何保活的。长连接&短连接首先我们要知道,TCP本身是没有长连接和短连接的区分的,长短与否完全取决于我们怎么用它。长连接和短连接的简单区分如下:短连接:每次通信时,创建新的socket;一次通信结束,调用 socket...

2019-10-07 22:29:23 1166

原创 RocketMQ源码解析之Broker消息刷盘

阅读须知文章中使用/* */注释的方法会做深入分析正文

2019-09-02 00:12:42 829

原创 RocketMQ源码解析之Broker消息存储

阅读须知文章中使用/* */注释的方法会做深入分析正文在前面分析的Broker处理client发送请求流程中,我们看到了Broker会存放来自client的消息,我们来分析这个流程。...

2019-06-25 15:36:09 317

原创 RocketMQ源码解析—Broker处理消息发送请求

阅读须知文章中使用/* */注释的方法会做深入分析正文在前面分析Broker的文章,我们看到,Broker其实同样也是用NettyRemotingServer来处理远程调用,在之前分析NameServer的请求处理源码中,我们已经分析了在Netty中注册的各种ChannelHandler的作用,既然是复用的是相同的NettyRemotingServer类,那么Broker请求处理流程的不...

2019-06-08 17:10:53 479

原创 冒泡排序浅析

简介冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的...

2019-05-06 11:08:03 219

原创 RocketMQ源码解析之Broker启动

阅读须知文章中使用/* */注释的方法会做深入分析正文之前我们分析了Broker初始化流程,接下来我们来看Broker的启动流程:BrokerStartup:public static BrokerController start(BrokerController controller) { try { /* 启动controller */ cont...

2019-04-07 21:16:31 502

原创 为什么InnoDB使用B+树作为索引数据结构

前言我们都知道,MySQL索引的数据结构是

2019-03-31 23:38:08 300

原创 RocketMQ源码解析之Broker初始化

阅读须知文章中使用/* */注释的方法会做深入分析正文在启动Broker时,我们会使用类似下面的命令:nohup sh bin/mqbroker -n localhost:9876 &amp;amp;amp;amp;amp;amp;amp;amp;在mqbroker脚本中的最后一行,我们看到这样的语句:sh ${ROCKETMQ_HOME}/bin/runbroker.sh org.apache.rocketmq.broker.Bro...

2019-03-10 21:51:52 790

原创 RocketMQ源码解析之NameServer请求处理

阅读须知文章中使用/* */注释的方法会做深入分析正文

2019-02-13 21:46:09 420 2

原创 类加载过程结合Spring案例分析

案例最近在分析一个有关类加载过程的问题,代码如下:@Componentpublic class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void set...

2019-01-27 17:30:24 1726

原创 Spring源码解析之bean的创建

阅读须知研究了半天markdown也没发现怎么为代码块中的重点代码做特殊标记,所以这里使用//单行注释做代码的简单注释,而/**/多行注释的代码注释的同时会做深入分析,同时为了避免篇幅过长,删掉了Spring原来的注释和空行,建议配合Spring源代码进行阅读,本文对应的Spring源码的版本为4.3.8。正文之前我们都是在围绕ApplicationContext applic

2019-01-27 14:06:08 7389 2

原创 类加载过程整理

各种调用初始化顺序我们用一个小demo来验证一下各种调用的初始化顺序:demo1public class Test { public static void main(String[] args) { new C1(); }}class C1 { public static C2 c2 = new C2(); public C3 ...

2019-01-26 20:29:16 599 2

原创 RocketMQ源码解析之NameServer启动和停止

阅读须知文章中使用/* */注释的方法会做深入分析正文关于RocketMQ源码的下载和构建,这里不多重复,很简单,相信大家都搞的定。启动请参考官方文档:http://rocketmq.apache.org/docs/quick-start/源码git地址:https://github.com/apache/rocketmq在前面的文章中,我们分析了RocketMQ的整体结构,其...

2019-01-24 20:38:45 1579 2

原创 MyBatis缓存不一致问题测试

数据准备首先我们创建两张表:CREATE TABLE `person` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `name` varchar(45) NOT NULL DEFAULT '' COM...

2019-01-02 17:00:55 582 11

原创 Dubbo源码阅读顺序

Dubbo源码解析之配置解析篇,主要内容是&amp;lt;dubbo:service/&amp;gt;、&amp;lt;dubbo:reference/&amp;gt;、&amp;lt;dubbo:registry/&amp;gt;等dubbo标签的解析过程Dubbo源码解析之扩展点(ExtensionLoader)篇,主要内容是dubbo SPI扩展点的实现细节,扩展点的实现是dubbo的一个特色Dubbo源码解析之provider初始...

2018-12-29 17:22:49 3375 4

原创 Spring源码阅读顺序

Spring源码解析之ApplicationContext,主要内容是介绍Spring上下文初始化时的一些主要步骤Spring源码解析之默认标签的解析,如文章标题,主要内容是&amp;amp;lt;bean/&amp;amp;gt;、&amp;amp;lt;beans/&amp;amp;gt;、&amp;amp;lt;import/&amp;amp;gt;、&amp;amp;lt;alias/&amp;amp;gt;四个默认标签的解析过程

2018-12-25 14:24:15 3141 10

原创 Spring boot内嵌tomcat源码解析

阅读须知版本:2.0.4文章中使用/* */注释的方法会做深入分析正文我们知道,在使用Spring boot搭建web工程时,我们不需要自己搭建一个tomcat服务器,只需要引入spring-boot-starter-web,在应用启动时会自动启动嵌入版的tomcat作为应用服务器,下面我们来分析这个过程。之前我们分析了Spring boot的启动流程和自动配置流程,而嵌入tomca...

2018-12-15 16:16:32 5738 9

原创 策略模式实践

模式简介策略模式是一种行为型模式,它定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户端应用而独立变化。策略模式适合解决当程序出现多个不同分支,而且每个分支的逻辑还比较复杂的场景。生产实践在笔者参与的交易系统中,需要支持多种支付方式,如支付宝、微信、现金、银行卡等等,每一种支付方式的处理逻辑都不通,对接的系统也不一样,所以程序中需要根据用户选择的支付方...

2018-12-06 17:58:28 349

原创 RocketMQ整体结构

RocketMQ 结构概述Apache RocketMQ是一个分布式消息传递和流平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性。它由四部分组成:NameServer、broker、producer 和 consumer。它们中的每一个都可以水平扩展而没有单点故障。 如上图所示。NameServer集群NameServer提供轻量级服务发现和路由。每个NameServer记录...

2018-12-03 16:20:25 287 2

原创 建造者模式实践

建造者模式是一种常见的设计模式,属于创建型模式,我们常见的工厂、单例、原型、包括《重构与模式》一书中提到的creation method都属于创建型模式。建造者适合用于构建复杂对象,它可以将创建和表示分离,使我们的代码可读性更好,更易于维护。在我们的实际开发中,经常会构建一些实体对象,比如,在笔者参与的交易系统中,会记录用户的每一笔支付,我们在创建支付实体对象时,通常会写出这样的代码:Paym...

2018-12-01 16:45:06 216

原创 为动态装饰功能抽象 Decorator

装饰者模式是一个比较常用的模式,它可以在不改变原类文件和不使用继承的情况下动态地扩展一个对象的功能。现在我们遇到这样一个需求,我们要做一个智能货架系统,它可以根据门店的销量、坪效、客单价等等一些数据来展现一个智能的陈列方案,目的是门店可以通过这种陈列方式来提升商品的销量、坪效等指标。一个货架的品类是固定的,我们拿纯净水来举例,假如我们通过上面的一些数据经过算法计算分析过后为这节货架选择了娃哈哈、...

2018-11-25 19:13:50 1265 1

原创 CyclicBarrier源码解析

阅读需知jdk版本:1.8使用/* */注释的方法会做深入分析正文public CyclicBarrier(int parties) { this(parties, null);}/** * @param parties 在栅栏被触发之前必须调用await方法的线程数 * @param barrierAction 栅栏触发时执行的命令,如果没有操作则执行null */...

2018-11-09 11:42:12 414

原创 Spring boot自动配置源码解析

阅读须知版本:2.0.4文章中使用/* */注释的方法会做深入分析正文自动配置是Spring boot的一大亮点,让我们从Spring繁杂的配置中脱身而出,本篇文章我们就来分析一下Spring boot自动配置的源码。不知道读者是否有注意到,在分析Spring boot启动流程时,我们没有看到示例代码中@SpringBootApplication注解的解析过程,其实Spring boo...

2018-11-07 17:55:51 1826

原创 Spring boot启动流程源码解析

阅读须知版本:2.0.4文章中使用/* */注释的方法会做深入分析正文@SpringBootApplicationpublic class BootApplication { public static void main(String[] args) { SpringApplication.run(BootApplication.class, args);...

2018-11-06 17:40:34 1282

原创 Dubbo源码解析之LoadBalance负载均衡

阅读须知dubbo版本:2.6.0spring版本:4.3.8文章中使用/* */注释的方法会做深入分析正文

2018-10-24 16:27:44 782

原创 Dubbo源码解析之consumer关联provider

阅读须知dubbo版本:2.6.0spring版本:4.3.8文章中使用/* */注释的方法会做深入分析正文我们知道,dubbo的生产者和消费者的关系维护在注册中心,所以,消费者关联生产者肯定是需要订阅注册中心的相关生产者信息才能完成,在Dubbo源码解析之registry注册中心这篇文章中我们分析了dubbo有关注册中心的一些操作如注册、订阅等,在文章的最后,我们分析了消费者订阅注...

2018-10-11 19:47:49 635

原创 Dubbo源码解析之consumer调用篇

阅读须知dubbo版本:2.6.0spring版本:4.3.8文章中使用/* */注释的方法会做深入分析正文

2018-10-11 10:50:00 828

原创 Dubbo源码解析之consumer初始化

阅读须知dubbo版本:2.6.0spring版本:4.3.8文章中使用/* */注释的方法会做深入分析正文dubbo的consumer由ReferenceBean初始化,我们先来看一下这个类的层次结构:我们看到ReferenceBean实现了InitializingBean,所以我们先来看一下它的afterPropertiesSet方法实现:ReferenceBean:pu...

2018-10-07 17:46:39 972

原创 Dubbo源码解析之provider调用篇

阅读须知dubbo版本:2.6.0spring版本:4.3.8注释规则: //单行注释做普通注释/**/多行注释做深入分析建议配合源码阅读正文在之前的源码分析文章中,我们看到了dubbo用netty作为底层的网络通信框架,熟悉netty的同学应该知道,使用netty时我们会使用它的各种Handler作为处理一些网络事件的处理器,在开启netty服务时,dubbo添加

2018-09-19 20:23:34 1055

原创 Dubbo源码解析之provider暴露篇

阅读须知dubbo版本:2.6.0spring版本:4.3.8文章中使用/* */注释的方法会做深入分析正文承接provider初始化篇,本篇文章我们来分析provider的暴露过程。ServiceConfig:private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List&amp;lt;URL&amp;gt; ...

2018-09-19 00:06:42 994

Java 8实战(中文完整版).pdf

java8 实战 中文版 完整版 清晰 java8 in action 中文翻译版

2018-05-04

mybatis一对多能否用resultType的方式实现

发表于 2016-11-30 最后回复 2016-11-30

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

TA关注的人 TA的粉丝

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