rocketmq之源码分析netty简要分析(五)

这里介绍的都是有一定netty基础的,如果没有可以从网上找一个netty的入门
涉及到两个方面的操作,一是服务端,二是客户端
大体的类关系如图

根据netty的整理通信,可以大体整理的调用示意图如下:

具体的实现如下:

服务端:
1,构造器
    NettyRemotingServer
        ServerBootstrap构造,是netty的入口
        publicExecutor初始化,根据配置的线程数构造固定的线程池,值得商榷,阿里的java规范不建议这样用
        eventLoopGroupBoss初始化,netty服务端的链接管理
        eventLoopGroupSelector初始化,netty服务端的selector
        loadSslContext加载,加载配置的ssl安全套接字
    核心重要:
        useEpoll()的选择,针对不同的平台,针对不同的nio的实现,判断底层是否支持epoll
        顺便说下nio
        从历史发展来看,底层先后经历了select -》poll -》 epoll
        select模型:客户端连接的文件描述全部都放置在一个集合中,并且最大1024。select的操作有空间和时间的浪费,但是所有平台都支持
        每次调用select时,都需要将fd集合从用户拷贝到内核,如果fd集合大则开销就大
        每次调用select时,需要在内核遍历传进来的所有fd才能确定哪个连接就绪,这个开销也很大
        select的fd描述默认是1024个,单进程的并发是有限制
        poll模型:与select模型类似,本质的区别是存放fd的集合不一样,poll进行了加强,可以维持任意多个连接
        epoll模型:是前面两个的加强版,fd可以是无限制的,但并不是所有情况下epoll都比前面的好,但是解决了前面的问题
        没有最大并发连接数的限制,取决于服务器配置
        不在全量的轮询fd,不会随着fd的增加而效率下降,为每个fd增加callback函数,只有活跃的才会调用callback。
        减少了内存拷贝,采用的是mmap的文件映射内存来实现共享内存
        问题,如果所有的socket都活跃,可能有性能问题

        如果当前系统支持epoll则选择的是nio中的EpollEventLoopGroup,否则选择默认的NioEventLoopGroup

2,启动
    NettyRemotingServer
        netty服务端的核心流程
            group的设置,服务端分离boss和worker
            性能选择io模型
            参数设置,基于当前功能的最优socket,tcp参数设置
            绑定端口
            设置handler
                编码,解码,连接,业务
            启动服务执行端口监听

3,处理
    NettyServerHandler:处理请求的核心操作,内部封装注册了事件处理对应的对象
        channelRead0:是集成netty的实现的重写方法,接受客户端的请求数据
            processMessageReceived:处理接受的数据
                processRequestCommand:处理请求数据
                    RequestCode:根据code获得对应的业务逻辑处理单元
                    ctx.writeAndFlush:将数据返回给服务调用端

基于netty设计实现业务数据交互的核心

netty的channle的writeAndFlush的操作都是异步操作,无法同步得到结果,需要设计一个数据结构保障数据的唯一传输和回复
1,设计集合:responseTable,是安全的map集合
2,唯一标示:int opaque = request.getOpaque(),有提交的请求生成唯一标示
3,时间处理:ResponseFuture中定义了CountDownLatch的统计及时间的超时设计
4,异常处理:定时扫描响应集合,scanResponseTable,针对超时的异常处理机制

 

客户端:
1,构造器
    NettyRemotingClient:netty的客户端核心实现
        publicExecutor:共享的线程池配置,构建个性的线程名称
        eventLoopGroupWorker:netty的worker的构造,构建个性化的线程名称
        sslContext:判断是否启动安全套接字配置,如果启用加载ssl

2,启动
    NettyRemotingClient
        netty的客户端标椎化启动流程
            group的设置,独立的eventGroup
            io模型设置:NioSocketChannel
            性能参数设置:基于当前服务最优的socket,tcp参数
            设置handler
                编码,解码,Idle,链接管理,业务
            扫描相应的responseTable的超时业务

            处理连接事件管理

3,处理
    NettyClientHandler:客户端的业务逻辑处理响应
        channelRead0:netty的标准数据接收
            processMessageReceived:处理接受的数据
                processResponseCommand:处理响应数据,主要是接受服务端的反馈
                    responseTable.get(opaque):根据相应的唯一标识,获取原请求的数据异步结构
                    responseTable.remove(opaque):删除已经获得的异步结构
                    responseFuture.putResponse(cmd); 将结果赋值给原请求数据
                    responseFuture.release(); 通知原请求可以获得结果
4,业务操作
    invokeSync:同步调用发送消息
        getAndCreateChannel:根据ip地址获得netty的channel,此时会用到netty的启动Bootstrap对象
        doBeforeRpcHooks:前置处理
        invokeSyncImpl:实际的调用
        doAfterRpcHooks:后置处理
            invokeSyncImpl:实际的调用
                request.getOpaque():获得唯一标志
                ResponseFuture:封装请求的异步结构,包括唯一标示和channel
                responseTable.put:将异步结构放置到集合中,key为唯一标示
                channel.writeAndFlush:调用netty的channel发送数据
                responseFuture.waitResponse:等待响应的结果

转载于:https://my.oschina.net/wangshuaixin/blog/3055707

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值