暂时未有相关云产品技术能力~
InfoQ签约作者、CSDN博客专家、专注于架构设计、微服务以及云原生技术分享
SpringBoot相信很多同学都非常了解,实际工作中也经常使用到。但是不知道大家在使用过程中有没有想过一个问题,SpringBoot内嵌tomcat到底是怎么启动的?内嵌tomcat启动服务的好处又是什么呢?本文将结合SpringBoot源码探讨下这些问题。
通过以上分析可知,RocketMQ实际是在原生Netty之上进行了自己的封装。最后一张图来说明NameServer启动过程中关于Netty启动的部分。在后续的文章中我们再着重分析RocketMQ如何高效使用Netty框架。
本文主要从源码角度分析了RocketMQ事务消息的过程,从源码中我们可以看出来,它是一个典型的二阶段提交的流程。那么从源码中有什么值得思考的部分呢? (1)在消息发送上面,TransactionMQProducer 继承了DefaultMQProducer 方法,最大程度的复用了底层的消息发送逻辑,在消息发送方法中通过消息属性设置来区分普通消息以及事务消息,这个在我们平常开发中也是比较典型的用法; (2)TransactionListener的使用,提供给开发者自行实现,提高了扩展性。
事务的概念就不用多说了,我相信阅读文章的童鞋都是有着非常深刻的认识。我们都知道MQ可以实现微服务之间的异步以及解耦,那么引入MQ之后,如何实现微服务之间的数据一致性是一个值得思考的问题。事务消息将分为三篇文章进行介绍,本文主要介绍RocketMQ的事务原理,第二篇文章主要分析事务消息源码实现分析。在第三篇文章中将提供一种优化方案,解决RocketMQ对于业务代码侵入较大的问题。
JVM学习技术大纲
本文主要介绍了Netty的多线程模型,它采用的是Reactor模型。处理连接请求与处理IO操作的线程隔离。基于事件轮询监听,不断获取处于就绪状态的通道。其中Boss线程池的线程负责处理连接请求,接收到accept事件之后,将对应的socket进行封装生成NioSocketChannel对象,并将其提交到workBoss线程池中,处理IO的read以及write事件。
本文主要讲述了NioServerSocketChannel创建过程以及源码分析,后面文章继续说明channel创建之后的操作,如等待连接等等。
1、多个线程去获取一个共享变量时,要求获取的是这个变量的初始值的副本。每个线程存储这个变量的副本,对这个变量副本的改变不会影响变量本身。适用于多个线程依赖不同变量值完成操作的场景。比如: 多数据源的切换 spring声明式事务 2、将ThreadLocal设置成private static的,这样ThreadLocal会尽量和线程本身一起回收。
本文主要通过Netty的服务的启动代码,初步了解了Netty在启动过程中做了哪些事情。重点分析了NioEventLoop的创建过程,之后的文章再介绍启动过程中,Netty的其他操作。
Kubernetes 作为云原生的最佳实践,已经成为了事实上的容器编排引擎标准,同时它也逐渐成为容器云时代的基础设施。本系列文章将带领大家进入Kubernetes 的世界。
本文主要介绍了BeanDefinition以及BeanDefinition的注册,BeanDefinition是Spring处理Bean的统一的数据结构,BeanDefinitionRegistry的实现类对BeanDefinition完成了注册操作,注册最终结果保存在beanDefinitionMap这个ConcurrentHashMap中。今天的内容就到这里了,我们下次再会了哦。
其实很多同学都想通过阅读框架的源码以汲取框架设计思想以及编程营养,Spring框架其实就是个很好的框架源码学习对象。我们都知道Bean是Spring框架的最小操作单元,Spring框架通过对于Bean的统一管理实现其IOC以及AOP等核心的框架功能,那么Spring框架是如何把Bean加载到环境中来进行管理的呢?本文将围绕这个话题进行详细的阐述,并配合Spring框架的源码解析。
Java并发编程系列之五:自定义线程工厂
LeetCode解题之十五:四数之和
服务逐渐向云化转移,阿里巴巴已经在今年双11宣布所有核心服务全部迁移上云。因此所以针对服务容器云化,可能会是各个公司今后都要进行的企业IT架构升级之道。从本文开始将主要介绍Docker的相关内容以及使用技巧。
在进行容器云开发过程中,我们会在本地进行一些镜像制作来进行镜像功能的测试验证。时间长了服务器中的本地镜像就会很多,此时我们需要将之前测试的镜像删除,但是我们在删除镜像的过程中会遇到一些问题,本文将围绕这个主题进行阐述。
本文主要介绍了使用Netty的好处与原因,它支持的协议越来越多,紧随JDK更新。从下文开始我们要对Netty的使用以及源码进行介绍。
观察者模式使我们在日常项目实践中比较常用的设计模式,它体现了代码模块的高内聚低耦合的特性,我们可以方便的使用它进行代码扩展。
ThreadPoolExcutor是JDK自带的线程池,也是我们在创建线程池时经常用到的创建方法。对线程池稍微有了解的同学都知道,线程池是一种典型的池化缓存设计。JDK自带了四种任务拒绝策略,但是有时候是不能满足我们实际的业务需求的,所以此时我们需要自定义拒绝策略,来处理被线程池拒绝的任务。 自带线程池拒绝策略介绍 如何自定义拒绝策略
1、当我们想要使用一个已经存在的接口,但是它不符合现有的接口数据规范,导致无法直接去访问,此时我们可以创建一个适配器就能间接去访问这个类中的方法; 2、不同系统间进行业务数据对接时,如果想要像调用自身系统接口一样使用其他系统的接口,我们需要通过适配器进行一层转换;
策略模式的使用场景为把算法实现进行提取封装,独立于调用场景之外。 策略模式的优点: 1、当业务代码存在多重逻辑判断时,策略模式可以避免大量的if-else的判断,避免代码逻辑混乱,增强代码的可维护性; 2、可将策略中的公共部分进行高度抽象,避免代码重复; 策略模式的缺点: 1、调用方必须知道所有的策略实现类,增加了调用方的使用难度; 2、如果判断逻辑较多的话,会导致策略实现类较多;
单例模式有好几种写法,可以根据需要与场景进行适当的选择。总结下单例模式的优缺点。 优点: 1、内存中对象唯一,可以节省内存空间; 2、可以做到避免频繁的创建销毁对象,提高性能; 3、避免对共享资源的不同对象占用,优化获取数据的途径; 4、为整个平台提供一个全局访问点。 缺点: 1、不适用于经常变化的对象; 2、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出; 3、如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
在实际问题排查过程中,我们需要对服务器的ip以及端口进行连通性检测,本文将介绍几种测试服务器ip以及端口的连通性的方法。
LeetCode解题之十二:三数之和
本文主要介绍了分布式事务的概念以及当前分布式事务存在的不足之处,同时着重介绍了Seata分布式事务处理机制以及的优势之处。
LeetCode解题之十一:回文数
整洁代码不仅包括实际项目中的业务代码,也包括一些系统级别的。全局异常处理属于系统级的整洁代码。如果我们把我们的项目比做成一座城市,那么类似全局异常处理、拦截器等等就相当于这座城市的排水系统、电缆布置等等。这些设施布置的好坏直接影响整个城市的运转情况。那么在项目层级来说,系统级的整洁代码就是为了使得项目可以更加高效的运转。
Linux系统系列之二:开启防火墙指定端口
本文主要对常用的Linux命令进行了解释说明,希望对需要的同学有所帮助,后续会持续更新更多的Linux使用技巧以及命令。
本文主要介绍了Elasticsearch是什么以及解决什么样的问题可以用到它,同时对Elasticsearch的核心概念以及安装做了说明,旨在让大家对Elasticsearch有个初步的认识。
本文主要阐述了消息发送的基本流程。其中包括了获取Broker地址、设置全局ID、构建请求包以及发送消息了。在下篇文章中我们继续来看消息发送的底层流程。
本文主要介绍了,消息发送之前RocketMQ进行的Broker故障延迟选择策略。它是一种对于故障Broker的一种调度策略,可以规避对于故障Broker的使用。在下文中,我们将正式进行消息发送的源码阅读以及分析。
LeetCode解题之十:整数排列
本文主要介绍了消息发送前的准备,包括了消息的有效性验证以及路由信息查找以确认消息投递到哪个具体的Broker节点之上。下篇文章将正式阐述消息的发送。
LeetCode解题之八:两两交换链表中的节点
本文主要叙述了消息的结构以及在消息发送之前,客户端启动的流程是怎样的,而客户端实例的创建时消息发送的前提。在下一篇文章中,将介绍具体的消息发送流程。
本文主要阐述了NameServer相关的路由管理的内容,路由管理是RocketMQ系统中进行消息发送以及消费的重要前提。对于该部分的理解有助于我们更加深刻
LeetCode解题之七:合并两个有序链表
线上环境出现异常时,我们想立马查看下JVM内存使用情况,想看下我们的应用中的线程状态等等。那么阿里巴巴的在线诊断神器Arthas工具就是非常不错的选择,本文主要介绍Arthas的基本用法。 Arthas工具介绍 Arthas安装 常用命令
本文主要从源码角度分析RocketMQ的底层通信机制以及RPC调用的过程。对于RocketMQ通信机制的深入理解,是我们分析和领会整个RocketMQ系统消息流转流程的基石。 消息 消息底层如何流转 总结
正则表达式几乎可以在任何语言中进行使用,无论是JS、Java或者是Python或者是其他语言。是不是很羡慕别人的正则表达式写的很6,是不是对于火星文般的一大长串正则表达式很苦恼。本文希望通过对于正则表达式的说明,让大家认识它、接近它最后爱上它。 正则表达式基础知识 常用正则表达式 Java中如何使用正则表达式
本文主要是介绍RocketMQ的通信模块,通过对于源码的阅读,拆解其中的底层通信原理。一篇文章很难完全讲清楚这其中的道道,所以会分几篇文章来进行阐述。 模块介绍 为何使用Netty通信作为底层通信框架 总结
LeetCode解题之六:有效的括号
本篇是RocketMQ源码阅读的开篇,主要对RocketMQ的架构以及相关目录结构进行介绍,为RocketMQ的源码阅读做一些前期准备工作。 源码下载 源码结构介绍 RocketMQ架构
在我们日常项目开发工作中,对于并发场景中经常出现的神奇的Bug大都是由于并发编程中的三个核心问题的不深入理解导致的,即如何进行高效的线程任务分配,如何有效的进行线程之间的相互协作以及如何保证在同一时刻只有一个线程进行共享变量的访问。那我们该如何解决并发编程这三座大山呢,这就需要我们对于Java的内存模型有着深入的理解。本文主要从以下几个方面来阐述Java的内存模型,希望对于学习并发编程的童鞋有所裨益。
LeetCode解题之五:整数转罗马数字
本文是Netty源码分析系列文章的第一篇,主要介绍NIO的基础知识。因为Netty本身就是对NIO进行了封装。 NIO概述 NIO三大组件 总结
在学习Tomcat源码之前,我们首先需要将Tomcat在IDEA中进行导入后,进行代码调试。 Idea导入 Tomcat源码步骤 总结
本篇为Tomcat源码学习的开篇,主要通过阅读Tomcat的源码来了解其真正的运行流程以及原理,同时学习其中的架构设计等等。本文主要说明Tomcat的架构。 Tomcat架构 一次HTTP请求在tomcat中的流程 总结
Java中的List集合属于一种线性的数据结构,它继承了Collection接口。常见的List集合实现有ArrayList以及LinkedList,本文将从源码分析以及使用场景等方面对ArrayList进行具体的阐述。 源码分析 使用场景 总结