- 博客(117)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 SocketException: Connection or inbound has closed
SocketException: Connection or inbound has closedProtocolException: The server failed to respond with a valid HTTP response
2021-12-08 21:21:05
2020
翻译 模式:Service Mesh
自数十年前首次引入分布式系统以来,我们了解到分布式系统可以提供给我们之前无法想到的用例,但是它们也引入了各种新问题。当这些系统罕见且简单时,工程师通过减少远程交互的数量来应对增加的复杂性。处理分布式的最安全方法是尽可能避免分布式,即使这意味着会存在系统间的重复的逻辑和数据也是如此。但是,作为一个行业,我们的需求促使我们进一步发展,从几台大型中央计算机到成千上万的小型服务。在这个新世界中,我们必须开始勇往直前,应对新的挑战和悬而未决的问题,首先要采取 case-by-case 的解决方案,然后再采用更复杂
2021-08-24 14:09:59
302
原创 RocketMQ 源码解析—路由元数据管理
RocketMQ 路由元数据管理源码详解,包含 Broker 注册、销毁等流程,RouteInfoManager 类的作用。
2021-01-20 21:52:19
566
原创 Java8 HashMap源码解读
我们先来阅读一下 HashMap 的注释来相关介绍:Map 接口的基于哈希表的实现。此实现提供所有可选的映射操作,并允许 null 值和 null 键。(HashMap 类与 Hashtable 致等效,不同之处在于它不同步并允许为null。)类不能保证映射的顺序。特别是,它不能保证顺序会随着时间的推移保持恒定。 该实现为基本操作(get 和 put)提供了恒定时间的性能,假设哈希函数将元素正确地分散在存储桶中。集合视图上的迭代所需的时间与 HashMap 实例的“容量”(存储桶数)及其大
2020-12-25 18:00:48
441
1
原创 用 State 封装状态控制逻辑
第一次看到 State 设计模式我第一个想到的场景就是我们工作中经常会涉及到的“状态机”,State 模式确实比较适合处理“状态机”这样的场景,它可以使不同状态的处理逻辑更内聚。笔者最近的参与的项目中需要将门店的作业场景进行数字化,例如门店工作人员的日常拣货作业、定期库存盘点作业等。每个作业我们都会用状态来控制它的行为,例如“已领取”的作业不能被其他人领取和执行,已关闭的作业不能再次执行,已完成的作业会用于员工的薪水计算等等,所以针对作业的每个行为我们都需要进行状态的校验,并且要控制好状态流转:这是一
2020-11-09 20:40:26
404
原创 DDD聚合设计原则
“话说天下大势,分久必合,合久必分” ——《三国演义》那到底什么时候该分?什么时候该合呢?前言领域模型的推演是领域专家和技术同学就对业务的理解和抽象进行讨论和碰撞的过程,通常情况下,对一个具有一定复杂度的业务进行建模,模型之间的关系会非常复杂。在包含复杂关联的模型中,要保证对象修改的一致性是很困难的,我们必须保证紧密关联的对象组也能保证不变性,而不仅仅只保证各个离散的对象。这个问题实际上是源于模型之中缺乏明确的边界,而聚合的出现就是在模型层面来为这个问题寻找解决.
2020-09-29 10:16:33
2938
原创 RocketMQ源码解析—客户端消息消费
阅读须知文章中使用/* */注释的方法会做深入分析正文在分析初始化和启动流程时,我们看到无论是 Consumer 还是 Producer 都会初始化和启动 MQClientInstance,而在 MQClientInstance 初始化和启动的流程中,分别会初始化和启动 pullMessageService,pullMessageService 是 RocketMQ push 模式消费的...
2020-04-01 09:56:43
864
1
原创 CQRS架构窥探
CQRS简介命令查询的责任分离Command Query Responsibility Segregation (简称CQRS) 模式是一种架构体系模式,能够使改变模型状态和查询模型状态的动作实现分离,简单理解就是读写分离。属于DDD应用领域的一个模式。提到读写分离,我们都会用到数据库的读写分离,如MySQL数据库的主备,写主,读备,主备数据的同步由MySQL数据库底层帮我们完成。CQRS在理念...
2020-02-16 17:33:00
570
原创 RocketMQ源码解析之Consumer停止
阅读须知文章中使用/* */注释的方法会做深入分析正文Consumer 的停止流程和 Producer 的停止流程有很多复用的部分,前面我们已经分析过 Producer 的停止流程,复用部分这里不再重复。Consumer 的停止同样可以依托于 Spring bean 的生命周期,在 Spring bean 销毁时调用 DefaultMQPushConsumer 的 shutdown 方法...
2019-11-07 16:08:31
1553
原创 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
575
原创 RocketMQ源码解析之Producer启动
阅读须知文章中使用/* */注释的方法会做深入分析正文使用RocketMQ发送普通消息时,一般我们会进行如下配置:<bean id="rocketmqProducer" class="org.apache.rocketmq.client.producer.DefaultMQProducer" init-method="start" destroy-method="...
2019-11-01 17:02:24
847
原创 浅谈长连接保活机制
前言在日常工作中,我们经常会接触到长连接这个概念,例如一些RPC框架(如Dubbo)、网络通信框架(Netty)等,都会涉及到长连接的概念,我们来探究一下长连接是如何保活的。长连接&短连接首先我们要知道,TCP本身是没有长连接和短连接的区分的,长短与否完全取决于我们怎么用它。长连接和短连接的简单区分如下:短连接:每次通信时,创建新的socket;一次通信结束,调用 socket...
2019-10-07 22:29:23
2523
原创 RocketMQ 源码解析—Broker 消息存储
阅读须知文章中使用/* */注释的方法会做深入分析正文在前面分析的Broker处理client发送请求流程中,我们看到了Broker会存放来自client的消息,我们来分析这个流程。...
2019-06-25 15:36:09
597
原创 RocketMQ源码解析—Broker处理消息发送请求
阅读须知文章中使用/* */注释的方法会做深入分析正文在前面分析Broker的文章,我们看到,Broker其实同样也是用NettyRemotingServer来处理远程调用,在之前分析NameServer的请求处理源码中,我们已经分析了在Netty中注册的各种ChannelHandler的作用,既然是复用的是相同的NettyRemotingServer类,那么Broker请求处理流程的不...
2019-06-08 17:10:53
1079
原创 优化冒泡排序
简介冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的...
2019-05-06 11:08:03
1120
原创 RocketMQ源码解析之Broker启动
阅读须知文章中使用/* */注释的方法会做深入分析正文之前我们分析了Broker初始化流程,接下来我们来看Broker的启动流程:BrokerStartup:public static BrokerController start(BrokerController controller) { try { /* 启动controller */ cont...
2019-04-07 21:16:31
866
原创 RocketMQ源码解析之Broker初始化
阅读须知文章中使用/* */注释的方法会做深入分析正文在启动Broker时,我们会使用类似下面的命令:nohup sh bin/mqbroker -n localhost:9876 &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
1423
原创 类加载过程结合Spring案例分析
案例最近在分析一个有关类加载过程的问题,代码如下:@Componentpublic class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void set...
2019-01-27 17:30:24
2225
原创 Spring源码解析之bean的创建
阅读须知研究了半天markdown也没发现怎么为代码块中的重点代码做特殊标记,所以这里使用//单行注释做代码的简单注释,而/**/多行注释的代码注释的同时会做深入分析,同时为了避免篇幅过长,删掉了Spring原来的注释和空行,建议配合Spring源代码进行阅读,本文对应的Spring源码的版本为4.3.8。正文之前我们都是在围绕ApplicationContext applic
2019-01-27 14:06:08
9068
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
813
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
2173
14
原创 Dubbo源码阅读顺序
Dubbo源码解析之配置解析篇,主要内容是&lt;dubbo:service/&gt;、&lt;dubbo:reference/&gt;、&lt;dubbo:registry/&gt;等dubbo标签的解析过程Dubbo源码解析之扩展点(ExtensionLoader)篇,主要内容是dubbo SPI扩展点的实现细节,扩展点的实现是dubbo的一个特色Dubbo源码解析之provider初始...
2018-12-29 17:22:49
4517
5
原创 Spring源码阅读顺序
Spring源码解析之ApplicationContext,主要内容是介绍Spring上下文初始化时的一些主要步骤Spring源码解析之默认标签的解析,如文章标题,主要内容是&amp;lt;bean/&amp;gt;、&amp;lt;beans/&amp;gt;、&amp;lt;import/&amp;gt;、&amp;lt;alias/&amp;gt;四个默认标签的解析过程
2018-12-25 14:24:15
5907
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
7740
6
原创 策略模式实践
模式简介策略模式是一种行为型模式,它定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户端应用而独立变化。策略模式适合解决当程序出现多个不同分支,而且每个分支的逻辑还比较复杂的场景。生产实践在笔者参与的交易系统中,需要支持多种支付方式,如支付宝、微信、现金、银行卡等等,每一种支付方式的处理逻辑都不通,对接的系统也不一样,所以程序中需要根据用户选择的支付方...
2018-12-06 17:58:28
612
1
原创 RocketMQ整体结构
RocketMQ 结构概述Apache RocketMQ是一个分布式消息传递和流平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性。它由四部分组成:NameServer、broker、producer 和 consumer。它们中的每一个都可以水平扩展而没有单点故障。 如上图所示。NameServer集群NameServer提供轻量级服务发现和路由。每个NameServer记录...
2018-12-03 16:20:25
623
2
原创 建造者模式实践
建造者模式是一种常见的设计模式,属于创建型模式,我们常见的工厂、单例、原型、包括《重构与模式》一书中提到的creation method都属于创建型模式。建造者适合用于构建复杂对象,它可以将创建和表示分离,使我们的代码可读性更好,更易于维护。在我们的实际开发中,经常会构建一些实体对象,比如,在笔者参与的交易系统中,会记录用户的每一笔支付,我们在创建支付实体对象时,通常会写出这样的代码:Paym...
2018-12-01 16:45:06
322
原创 为动态装饰功能抽象 Decorator
装饰者模式是一个比较常用的模式,它可以在不改变原类文件和不使用继承的情况下动态地扩展一个对象的功能。现在我们遇到这样一个需求,我们要做一个智能货架系统,它可以根据门店的销量、坪效、客单价等等一些数据来展现一个智能的陈列方案,目的是门店可以通过这种陈列方式来提升商品的销量、坪效等指标。一个货架的品类是固定的,我们拿纯净水来举例,假如我们通过上面的一些数据经过算法计算分析过后为这节货架选择了娃哈哈、...
2018-11-25 19:13:50
1402
1
原创 Spring boot自动配置源码解析
阅读须知版本:2.0.4文章中使用/* */注释的方法会做深入分析正文自动配置是Spring boot的一大亮点,让我们从Spring繁杂的配置中脱身而出,本篇文章我们就来分析一下Spring boot自动配置的源码。不知道读者是否有注意到,在分析Spring boot启动流程时,我们没有看到示例代码中@SpringBootApplication注解的解析过程,其实Spring boo...
2018-11-07 17:55:51
2329
原创 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
1693
1
原创 Dubbo源码解析之LoadBalance负载均衡
阅读须知dubbo版本:2.6.0spring版本:4.3.8文章中使用/* */注释的方法会做深入分析正文
2018-10-24 16:27:44
1093
tomcat启动时出现如下问题 求大神解答 急急急!
2015-03-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人