![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SpringCloudAlibaba
文章平均质量分 75
vinylon1022
这个作者很懒,什么都没留下…
展开
-
RocketMQ十四、Broker处理Consumer请求
首先我们知道RocketMQ是将Producer发来的消息全部放入CommitLog里面,消费时是通过维护ConsumerQueue来帮助Consumer进行消费。当Broker收到Consumer的pull请求时,会先读取ConsumerQueue得到offset,然后再读取CommitLog得到消息内容。我们看一下broker启动时初始化的处理pull请求的处理器:this.remotingServer.registerProcessor(RequestCode.PULL_MESSAGE, thi.原创 2021-05-28 15:27:57 · 384 阅读 · 0 评论 -
RocketMQ十三、Broker的消息接收
先回过头来看一下broker启动时注册的消息处理器:public void registerProcessor() { /** * SendMessageProcessor */ SendMessageProcessor sendProcessor = new SendMessageProcessor(this); sendProcessor.registerSendMessageHook(sendMessageHookList); sendProces原创 2021-05-28 10:59:46 · 211 阅读 · 0 评论 -
RocketMQ十二、Broker启动
本篇开始介绍Broker部分的内容,主要包括Broker的启动、消息的接收、消息的处理。broker的启动主要分为两个过程,即initialize初始化和start启动BrokerStartup类的main方法:public static void main(String[] args) { start(createBrokerController(args));}其中createBrokerController方法初始化过程,start方法启动过程initializepublic原创 2021-05-28 10:21:22 · 839 阅读 · 0 评论 -
RocketMQ十一、消息存储(3)
本篇我们分析一下整体存储的流程。首先入口方法DefaultMessageStore的putMessage方法:@Overridepublic PutMessageResult putMessage(MessageExtBrokerInner msg) { // 状态检查 PutMessageStatus checkStoreStatus = this.checkStoreStatus(); if (checkStoreStatus != PutMessageStatus.PUT_原创 2021-05-27 16:17:49 · 108 阅读 · 0 评论 -
RocketMQ十、消息存储(2)
分析一下RocketMQ消息存储中的几个关键对象。MappedFileRocketMQ的文件操作是基于MappedByteBuffer操作的,MappedFile类是对MappedByteBuffer的包装,具有创建文件(使用非堆区内存), 写入, 提交, 读取, 释放, 关闭等功能, RocketMQ使用该类实现数据从内存到磁盘的持久化。其中:属性fileChannel: 该类对应的文件通道.mappedByteBuffer: 文件在内存中的映射. 如前文所述RocketMQ使用内存映射的方原创 2021-05-27 14:16:19 · 243 阅读 · 0 评论 -
RocketMQ九、消息存储(1)
前面提到RocketMQ是基于Topic模型的,这里先简单了解一下broker中是如何存储消息的。首先要知道的,RocketMQ的消息存储是基于文件系统的,主要包含三类文件:CommitLog、ConsumerQueue、IndexFile。其中:CommitLog 消息主体以及元数据的存储主体。 所有producer端写入的消息主体内容都会写入到CommitLog文件中。虽然消息内容的长度不是固定长度的,但是对于CommitLog,每个CommitLog文件是固定长度的,大小是1G(这么做的主要目原创 2021-05-27 11:13:26 · 155 阅读 · 0 评论 -
RocketMQ八、nameserver的请求处理
继续DefaultRequestProcessor的processRequest方法:@Overridepublic RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException { if (ctx != null) { log.debug("receive request, {} {} {}",原创 2021-05-14 16:41:12 · 177 阅读 · 0 评论 -
RocketMQ七、rocketMQ的网络通信模块
关于rocketMQ的netty消息处理,实际上都在一个rocketmq-remoting模块中。不管是nameserver还是broker,从netty的handler开始是统一的结构。我们先以nameserver部分的跟踪一下。前一篇看到过netty的启动,我们回过来再看一下:@Overridepublic void start() { ... prepareSharableHandlers(); ServerBootstrap childHandler =原创 2021-05-14 15:59:32 · 226 阅读 · 0 评论 -
RocketMQ六、NameServer的启动
首先我们先理解nameserver在做什么。简单来说就是一个注册中心,用于管理broker的地址信息和topic的信息,客户端可以通过nameserver获得topic信息,通过topic获取broker相关信息,以及每个broker上topic的queue信息等。也就是说nameserver维护了整个MQ集群的元数据信息,客户端可以通过链接nameserver得到这些信息,以明确将对应的消息发送到哪个broker上去。NameServer的启动NamesrvStartup类的main方法:pu原创 2021-05-14 15:35:18 · 361 阅读 · 0 评论 -
RocketMQ五、生产消费模型
简单介绍一下我对RocketMQ的topic的结构理解: 每个topic会有多个queue队列,每个queue会有多份分布在不同的broker上,如下图:consumer在消费一个topic时,选择某一个Queue进行消费,同ConsumerGroup下不同的consumer消费的是不同的queue,不同ConsumerGroup下的consumer可以消费同一个queue:...原创 2021-05-14 11:27:14 · 206 阅读 · 0 评论 -
RocketMQ四、Client的通信
Client -> Broker直接看DefaultMQProducerImpl的send方法:private SendResult sendDefaultImpl( Message msg, final CommunicationMode communicationMode, final SendCallback sendCallback, final long timeout) throws MQClientException, RemotingExcepti原创 2021-04-29 11:38:33 · 414 阅读 · 0 评论 -
RocketMQ三、Consumer的启动
我们先看一下RocketMQAutoConfiguration的定义:@Configuration@EnableConfigurationProperties(RocketMQProperties.class)@ConditionalOnClass({ MQAdmin.class, ObjectMapper.class })@ConditionalOnProperty(prefix = "rocketmq", value = "name-server")@Import({ JacksonFallb原创 2021-04-29 10:09:34 · 1177 阅读 · 0 评论 -
RocketMQ二、producer端启动
前面简单了解了一下RocketMQ的使用。本文分析一下producer端的启动流程。首先还是看一下RocketMQ的配置类:@Bean @ConditionalOnMissingBean(DefaultMQProducer.class) @ConditionalOnProperty(prefix = "rocketmq", value = {"name-server", "producer.group"}) public DefaultMQProducer defaultMQPr原创 2021-04-28 14:27:33 · 1035 阅读 · 0 评论 -
RocketMQ一、使用RocketMQ
最近比较忙,好长时间没有更新了。正好最近在使用rocketMQ,先聊聊使用过程中的一些情况吧。引入springboot环境中引入rocketMQ很简单,加入相应的starter即可:<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId></dependency>原创 2021-02-05 10:45:51 · 1212 阅读 · 0 评论 -
Nacos源码分析二十四、Raft选举过程(2)
MasterElection 投票前面我们看到了MasterElection用于选举的任务,我们再看一下run方法:@Overridepublic void run() { try { // ready状态 if (!peers.isReady()) { return; } //获取本地结点 RaftPeer local = peers.local(); // 任期-500原创 2021-01-12 16:33:36 · 450 阅读 · 0 评论 -
Nacos源码分析二十三、Raft选举过程(1)
关于raft的原理就不多介绍了,有兴趣的百度吧。这里提供一个小动画,蛮形象的,加深理解吧。我们知道raft节点的状态只有leader、follower、candidate三种。各状态流转如下:然后我们讲几个概念:majority 大多数term任期 – 任期是不断增加的election选举然后有两个超时时间election timeout – 选举超时时间heatbeat timeout – 心跳超时时间下面我们看一下nacos启动时做了什么吧。我们思考一下既然要看启动做了什么,原创 2021-01-12 11:41:56 · 817 阅读 · 0 评论 -
Nacos源码分析二十二、数据一致性同步-CP
然后是RaftConsistencyServiceImpl CP强制一致性实现。同样是put方法:@Overridepublic void put(String key, Record value) throws NacosException { try { raftCore.signalPublish(key, value); } catch (Exception e) { Loggers.RAFT.error("Raft put failed.",原创 2021-01-11 15:02:02 · 777 阅读 · 0 评论 -
Nacos源码分析二十一、数据一致性同步-AP
先讨论DistroConsistencyServiceImpl AP最终一致性的实现。我们知道当添加实例时会调用到put方法:@Overridepublic void put(String key, Record value) throws NacosException { onPut(key, value); // 一致性协议的同步数据。这里同步数据是异步任务执行的,也就是说先返回客户端put成功再同步,弱一致性。 AP模型 distroProtocol.sync(new D原创 2021-01-11 14:47:18 · 1164 阅读 · 1 评论 -
Nacos源码分析二十、数据一致性同步总览
之前在讨论服务端实例注册时已经看到了部分数据一致性同步的相关内容。 以下两篇把这个课题单独拿出来讨论一下。Nacos内部使用AP、CP两种一致性方案,如果实例是临时的,则是AP,如果是永久的,则是CP。一致性服务接口是ConsistencyService,我们看一下它的类图:其中左半部分是AP,右半部分是CP。中间的DelegateConsistencyServiceImpl是一个代理类,通过它来确定是使用AP还是CP:@DependsOn("ProtocolManager")@Service(原创 2021-01-11 14:31:04 · 483 阅读 · 0 评论 -
Nacos源码分析十九、服务端处理查询实例列表
前面分析客户端服务发现时,已经知道是调用NacosNamingService的getAllInstances方法查询实例列表,跟进去是NamingProxy的queryList方法:public String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly) throws NacosException { final Map<String, String&原创 2021-01-11 13:39:32 · 799 阅读 · 0 评论 -
Nacos源码分析十八、服务端的心跳处理
上篇在服务注册时我们注意到,每个Service实例化时会创建一个心跳检测任务ClientBeatCheckTask:@Overridepublic void run() { try { if (!getDistroMapper().responsible(service.getName())) { return; } if (!getSwitchDomain().isHealthCheckEnabled()原创 2021-01-11 13:28:16 · 494 阅读 · 0 评论 -
Nacos源码分析十七、服务端实例注册分析
本篇讨论nacos服务端对于实例注册的处理流程。先回想一下客户端如何发起注册请求的,代码在NacosNamingService的registerService方法:@Overridepublic void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException { if (instance.isEphemeral()) { BeatInfo原创 2021-01-11 11:29:12 · 638 阅读 · 0 评论 -
Nacos源码分析十六、服务端配置新增修改和删除
Nacos服务端对于配置的新增修改和删除这部分,相对比较简单。代码还是在ConfigController里,publishConfig方法提供新增和修改,deleteConfig方法提供删除操作publicConfig@PostMapping@Secured(action = ActionTypes.WRITE, parser = ConfigResourceParser.class)public Boolean publishConfig(HttpServletRequest request,原创 2021-01-08 15:45:00 · 989 阅读 · 0 评论 -
Nacos源码分析十五、服务端处理配置监听
还记得NacosConfigService里的那个长轮询监听配置变更么?ClientWorker类里的LongPollingRunnable内部类。我们看一下它的run方法里的这句:List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList);这个方法就是调用服务端的/v1/cs/configs/listener接口,以监听可能出现变更的配置数据。往里跟一下代码:List&l原创 2021-01-08 15:21:54 · 696 阅读 · 0 评论 -
Nacos源码分析十四、服务端处理获取配置请求
Nacos客户端的学习已经基本告一段落。从本篇开始我们把关注点放在服务端。我们知道nacos服务端主要功能就是提供配置中心的功能和命名服务。接下来我们还是按这两部分讨论。首先是配置中心。我们先看一下服务端如何处理客户端发起的获取配置的请求,相应接口是在com.alibaba.nacos.config.server.controller.ConfigController中定义,我们看一下getConfig方法:@GetMapping@Secured(action = ActionTypes.READ,原创 2021-01-08 11:52:11 · 492 阅读 · 0 评论 -
Nacos源码分析十三、客户端服务发现
前面分析了NacosNamingService的基本工作内容,下面我们结合dubbo看一下服务发现部分内容。先看一下dubbo中RegistryProtocol的refer方法:public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException { ... return doRefer(cluster, registry, type, url);}private <原创 2021-01-08 09:46:23 · 327 阅读 · 0 评论 -
Nacos源码分析十二、NacosNamingService
上篇说到Nacos对于服务注册和发现的支持是通过NamingService接口来实现的,对应的实现类是NacosNamingService,本篇详细介绍这个类。先上一个结构图简单看一下这个类的结构,有个大体的了解:看一下初始化代码:private void init(Properties properties) throws NacosException { ValidatorUtils.checkInitParam(properties); this.namespace = Ini原创 2021-01-07 17:39:53 · 988 阅读 · 0 评论 -
Nacos源码分析十一、客户端服务注册
前面部分主要是分析了nacos作为配置中心时,客户端的相关逻辑,主要包括:configService的初始化,对数据的监听结合spring-cloud实现动态配置更新。关于nacos服务端的存储结构后面再统一分析。本篇分析nacos作为注册中心时客户端如何进行服务注册。我们以dubbo+nacos为例。首先添加依赖:<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId原创 2021-01-07 13:49:12 · 595 阅读 · 0 评论 -
Nacos源码分析十、配置动态刷新(3)
前文提到RefreshScope中维护了一个map缓存,缓存的内容是包装原bean的BeanLifecycleWrapper,这个包装类具备销毁能力。当新的配置更新通知来后,我们只要能找到RefreshScope去销毁了对应的bean,那么再次使用时cglib的proxy就会重新去获取target类实例,然后重新实例化。回到NacosContextRefresher类,看一下注册监听的代码:private void registerNacosListener(final String groupKey,原创 2021-01-07 09:26:58 · 1017 阅读 · 2 评论 -
Nacos源码分析九、配置动态刷新(2)
前文分析了@RefreshScope注解和RefreshScope类相关内容,我们了解到此时被@RefreshScope注解的类所对应的代理类类型已经换成了LockedScopedProxyFactoryBean,本篇主要分析这个类的作用。首先看一下这个类的类图:从这个图上可以看到FactoryBean。 这是一个工厂bean,也就是说容器中getBean得到的对象是通过它的getObject方法得到的。BeanFactoryAware。 beanFactory注入,需要关注一下setBeanF原创 2021-01-06 17:47:18 · 398 阅读 · 0 评论 -
Nacos源码分析八、配置动态刷新(1)
回顾一下前面分析的内容,NacosConfigAutoConfiguration定义了NacosContextRefresher监听器,监听ApplicationReadyEvent事件,当触发事件后会往nacos的configService中注册配置监听,Nacos在收到配置变更时会向applicationContext发布RefreshEvent事件。下面我们分析触发这个事件的后续操作。首先我们定义一下测试代码:@RestController@RequestMapping("/refreshCon原创 2021-01-06 16:56:41 · 823 阅读 · 0 评论 -
Nacos源码分析七、NacosConfigAutoConfiguration配置类
Nacos除了Bootstrap的自动配置类,同时也配置了SpringBoot的自动配置:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,\com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfigurationNacosConfigEndpoint原创 2021-01-06 08:55:10 · 1479 阅读 · 0 评论 -
Nacos源码分析六、NacosConfigBootstrapConfiguration配置类
前文在分析BootStrapApplicationListener时得到当引入nacos时,会加载NacosConfigBootstrapConfiguration配置类:@Configuration(proxyBeanMethods = false)@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)public class NacosConfigBootstrapConfi原创 2021-01-05 17:23:57 · 3937 阅读 · 0 评论 -
Nacos源码分析五、BootstrapApplicationListener运行原理(2)
接着上篇,我们看BootstrapImportSelectorConfiguration配置类:@Configuration(proxyBeanMethods = false)@Import(BootstrapImportSelector.class)public class BootstrapImportSelectorConfiguration {}Import了一个Selector:@Overridepublic String[] selectImports(AnnotationMe原创 2021-01-05 16:33:58 · 579 阅读 · 0 评论 -
Nacos源码分析四、BootstrapApplicationListener运行原理(1)
要理解nacos的配置变更如何更新到应用的配置上,这部分的内容属于SpringCloud部分的,要全部串起来,需要了解spring-cloud-context和spring-cloud-alibaba-nacos-config相关的内容。一下学习过程spring-cloud-alibaba-nacos-config版本为2.2.1.RELEASE,对应spring-cloud-context版本为2.2.2.RELEASE我们先看BootStrapApplicationListener怎么来的吧首先sp原创 2021-01-05 15:39:27 · 788 阅读 · 2 评论 -
Nacos源码分析三、配置中心(2)
从NacosConfigService的构造方法里this.worker = new ClientWorker(this.agent, this.configFilterChainManager, properties);这行代码开始,看下ClientWorker的初始化做了什么:public ClientWorker(final HttpAgent agent, final ConfigFilterChainManager configFilterChainManager, fin原创 2021-01-05 13:37:27 · 539 阅读 · 1 评论 -
Nacos源码分析二、配置中心(1)
首先nacos服务端分为集群部署和单机部署两种模式,我们以单机部署为例。具体部署方式参考官方文档。链接这里默认启动本地单机模式服务端。我们以com.alibaba.nacos.example.ConfigExample这个测试类进行分析。public static void main(String[] args) throws NacosException, InterruptedException { String serverAddr = "localhost"; String原创 2021-01-05 13:36:40 · 1294 阅读 · 0 评论 -
Nacos源码分析一、前言
今天开始进入nacos的学习。nacos是spring-cloud-alibaba下的一个组件,致力于配置中心和注册中心。服务(Service)是Nacos世界的一等公民。既然知道了nacos的作用,那么我们需要学习哪方面的内容呢?大概整理了一下,后面的学习过程也是按照这些内容一步步进行。作为配置中心如何实现配置数据的远程管理; 当配置发生变更时如何同步到应用服务。–这部分是spring-cloud-alibaba内容。作为注册中心,需要实现注册中心相关功能provider端如何以nacos作原创 2021-01-05 13:35:35 · 1023 阅读 · 0 评论 -
Dubbo源码分析十六、dubbo编解码
单独分析一下dubbo的编解码过程。默认情况下使用dubbo自己定义的编码协议。我们先来看一下 Dubbo 数据包结构。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vh5EtRPv-1609227698562)(.\imgs\data-format.jpg)]Dubbo 数据包分为消息头和消息体,消息头用于存储一些元信息,比如魔数(Magic),数据包类型(Request/Response),消息体长度(Data Length)等。消息体中用于存储具体的调用消息,比如原创 2020-12-29 15:42:12 · 494 阅读 · 2 评论 -
Dubbo源码分析十五、服务调用过程(2)
本篇分析provider端收到消息的处理过程先上一个IO线程的调用栈:NettyServerHandler#channelRead(ChannelHandlerContext, MessageEvent)—> AbstractPeer#received(Channel, Object)—> MultiMessageHandler#received(Channel, Object)—> HeartbeatHandler#received(Channel, Object)—>原创 2020-12-29 15:18:54 · 213 阅读 · 0 评论