路由注册之处理请求包|学习笔记

简介: 快速学习路由注册之处理请求包

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)路由注册之处理请求包】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12466


路由注册之处理请求包

 

处理心跳包

在broker发送请求之后,NameServer如何处理:

在NameServer项目中有一个processor包,processor里有个DefaultRequestProcessor类,在这类当中,负责处理它所接受到的请求,结合下图来看:

image.png

processRequest负责接受心跳注册请求,之后是对请求类型进行判断,因为NameServer不仅仅接受broker的心跳请求,还会接受producer和consumer的请求。

switch (request.getcode()) {

case Requestcode.PuT_kv_cONFIG:

return this.putkvconfig(ctx,request);

case Requestcode.GET_KV_CONFIG:

return this.getKvconfig(ctx,request);

case Requestcode.DELETE_Kv_CONFIG:

return this.deletekvconfig(ctx,request);

case Requestcode.QUERY_DATA_VERSION:

return queryBrokerTopicconfig(ctx,request);

case Requestcode.REGISTER_BROKER:

Version brokerVersion = MQversion.value2version(reque

st.getVersion());

if (brokerVersion.ordinal() >= MQversion.version.v3_0_11.

ordinal()) {

return this.registerBrokerwithFilterserver(ctx,request);

}else {

return this.registerBroker( ctx,request);

case Requestcode. UNREGISTER_BROKER:

return this.unregisterBroker( ctx, request);

在registerBroker中最核心的路由注册由RouteInfoManger完成

//获得响应

final Remotingcommand response = Remotingcommand.createResponsecommand(RegisterBrokerResponseHeader.class);

//创建响应头

final RegisterBrokerResponseHeader responseHeader = (RegisterBrokerResponseHeader)response .readcustomHeader();

final RegisterBrokerRequestHeader= (RegisterBrokerRequestHeader)request.decodecommandCustomHeader(RegisterBrokerRequestHeader.class) ;

以上准备工作完成后,通过RouteinfoManager进行注册:

RegisterBrokerResult result = this.namesrvcontroller.getRou

teinfoManager( ).registerBroker(

requestHeader.getclusterName(),

requestHeader.getBrokerAddr(),

requestHeader.getBrokerName( ),

requestHeader-getBrokerId(),

requestHeader.getHaServerAddr( ),

topicconfigwrapper,

filterServerList: null,

ctx.channel()

);

在注册时,注意this. lock.writeLock( ). lockInterruptibly()代码,这行代码说明路由注册是同步,串行化的过程,故在上图中有“加锁”标识。下面对clusterAddrTable和brokerAddrTable进行维护,然后在往下运行,对brokerLiveTable进行了维护。

在DefaultRequestProcesso代码中,如果当前brokerVersion版本大于3.0.11,运行的是registerBrokerwithFilterServer方法。

if (brokerVersion.ordinal() >= MQversion.version.v3_e_11.ord

inal()) {

return this.registerBrokerwithFilterServer(ctx,request);

如果,filterserverList不为空,会进行维护处理。

if (filterserverList !=-nul1) {

if (filterserverList.isEmpty() {

this.fi1terserverTable.remove(brokerAddr);

}else {

this.filterserverTable.put(brokerAddr,filterserverList);

}

}

总结:在NameServer处理心跳包时主要用到DefaultRequestProcesso和RouteInfoManger两个类,真正工作的是RouteInfoManger,在维护路由表时是同步状态。

相关文章
springboot 获取访问接口的请求的IP地址
springboot 获取访问接口的请求的IP地址
2726 0
|
5月前
|
JSON Java API
技术笔记:springboot项目使用拦截器实现一个简单的网关请求透传
技术笔记:springboot项目使用拦截器实现一个简单的网关请求透传
231 0
在自定义服务器框架中处理 GET 请求
在自定义服务器框架中处理 GET 请求
|
6月前
|
监控 API 开发工具
邮件中继中转邮箱API发送邮件的方法和步骤
AokSend介绍了使用邮件中继中转邮箱API发送邮件的步骤:理解API概念,获取API密钥,设置发件人和收件人信息,构建并发送API请求,处理响应,监控调试,及完善邮件功能。该服务支持大量验证码发送、触发式接口和高触达SMTP/API接口。选择合适提供商并参考文档可优化邮件发送。
|
搜索推荐 前端开发
【接口请求配置】axios 某个单独接口的个性化配置
【接口请求配置】axios 某个单独接口的个性化配置
226 0
|
负载均衡 前端开发 Java
统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
262 0
SpringCloudGateway手动编写路由规则对请求进行转发
SpringCloudGateway手动编写路由规则对请求进行转发 这篇文章主要是提供一种转发路由的代码实现方式,之前说的gateway都是使用配置文件来对请求进行路由,这样虽然很简单,但是不够灵活,如果后端对应很多服务实例,网关想要根据自己的规则来转发请求,比如编写不同的负载均衡策略,做一些特别的权重,以及在运行过程中动态的变更转发地址,这些用配置文件来做都不够灵活,没法自由的定义规则。
|
开发工具
基于Gin封装Web框架 - 4. 注册路由组
基于Gin封装Web框架 - 4. 注册路由组
294 0
基于Gin封装Web框架 - 4. 注册路由组
|
JSON Java 数据格式
SpringCloud GateWay通过过滤器GatewayFilter修改请求或响应内容
Spring Cloud Gateway在有些场景中需要获取request body内容进行参数校验或参数修改,我们通过在GatewayFilter中获取请求内容来获取和修改请求体,下面我们就基于ServerWebExchange来实现。
1431 0
|
前端开发
Nuxt 配置端口和代理转发记录备忘
将新的项目的url,固定带上项目名,这里先记录一下,后面有时间再仔细研究
421 0