点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试资料

作者:莫那 鲁道

cnblogs.com/stateis0/p/9062171.html

目录

  • dubbo 的 Consumer 消费者如何使用 Netty

  • dubbo 的 Provider 提供者如何使用 Netty

  • 总结

前言

众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。

1. dubbo 的 Consumer 消费者如何使用 Netty

注意:此次代码使用了从 github 上 clone 的 dubbo 源码中的 dubbo-demo 例子。

代码如下:

    System.setProperty("java.net.preferIPv4Stack", "true");ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});context.start();// @1DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxyint a = 0;while (true) {try {Thread.sleep(1000);System.err.println( ++ a + " ");String hello = demoService.sayHello("world"); // call remote methodSystem.out.println(hello); // get result} catch (Throwable throwable) {throwable.printStackTrace();}}

当代码执行到 @1 的时候,会调用 Spring 容器的 getBean 方法,而 dubbo 扩展了 FactoryBean,所以,会调用 getObject 方法,该方法会创建代理对象。

这个过程中会调用 DubboProtocol 实例的 getClients(URL url) 方法,当这个给定的 URL 的 client 没有初始化则创建,然后放入缓存,代码如下:

这个 initClient 方法就是创建 Netty 的 client 的。

最终调用的就是抽象父类 AbstractClient 的构造方法,构造方法中包含了创建 Socket 客户端,连接客户端等行为。

public AbstractClient(URL url, ChannelHandler handler) throws RemotingException {doOpen();connect();
}

doOpent 方法用来创建 Netty 的 bootstrap :

protected void doOpen() throws Throwable {NettyHelper.setNettyLoggerFactory();bootstrap = new ClientBootstrap(channelFactory);bootstrap.setOption("keepAlive", true);bootstrap.setOption("tcpNoDelay", true);bootstrap.setOption("connectTimeoutMillis", getTimeout());final NettyHandler nettyHandler = new NettyHandler(getUrl(), this);bootstrap.setPipelineFactory(new ChannelPipelineFactory() {public ChannelPipeline getPipeline() {NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), NettyClient.this);ChannelPipeline pipeline = Channels.pipeline();pipeline.addLast("decoder", adapter.getDecoder());pipeline.addLast("encoder", adapter.getEncoder());pipeline.addLast("handler", nettyHandler);return pipeline;}});
}

connect 方法用来连接提供者:

protected void doConnect() throws Throwable {long start = System.currentTimeMillis();ChannelFuture future = bootstrap.connect(getConnectAddress());boolean ret = future.awaitUninterruptibly(getConnectTimeout(), TimeUnit.MILLISECONDS);if (ret && future.isSuccess()) {Channel newChannel = future.getChannel();newChannel.setInterestOps(Channel.OP_READ_WRITE);}
}

上面的代码中,调用了 bootstrap 的 connect 方法,熟悉的 Netty 连接操作。当然这里使用的是 jboss 的 netty3,稍微有点区别。当连接成功后,注册写事件,准备开始向提供者传递数据。

当 main 方法中调用 demoService.sayHello("world") 的时候,最终会调用 HeaderExchangeChannel 的 request 方法,通过 channel 进行请求。

public ResponseFuture request(Object request, int timeout) throws RemotingException {Request req = new Request();req.setVersion("2.0.0");req.setTwoWay(true);req.setData(request);DefaultFuture future = new DefaultFuture(channel, req, timeout);channel.send(req);return future;
}

send 方法中最后调用 jboss Netty 中继承了 NioSocketChannel 的 NioClientSocketChannel 的 write 方法。完成了一次数据的传输。

2. dubbo 的 Provider 提供者如何使用 Netty

Provider demo 代码:

System.setProperty("java.net.preferIPv4Stack", "true");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
context.start();
System.in.read(); // press any key to exit

Provider 作为被访问方,肯定是一个 Server 模式的 Socket。如何启动的呢?

当 Spring 容器启动的时候,会调用一些扩展类的初始化方法,比如继承了 InitializingBean,ApplicationContextAware,ApplicationListener 。而 dubbo 创建了 ServiceBean 继承了一个监听器。Spring 会调用他的 onApplicationEvent 方法,该类有一个 export 方法,用于打开 ServerSocket 。

然后执行了 DubboProtocol 的 createServer 方法,然后创建了一个 NettyServer 对象。NettyServer 对象的
构造方法同样是 doOpen 方法和。代码如下:

protected void doOpen() throws Throwable {NettyHelper.setNettyLoggerFactory();ExecutorService boss = Executors.newCachedThreadPool(new NamedThreadFactory("NettyServerBoss", true));ExecutorService worker = Executors.newCachedThreadPool(new NamedThreadFactory("NettyServerWorker", true));ChannelFactory channelFactory = new NioServerSocketChannelFactory(boss, worker, getUrl().getPositiveParameter(Constants.IO_THREADS_KEY, Constants.DEFAULT_IO_THREADS));bootstrap = new ServerBootstrap(channelFactory);final NettyHandler nettyHandler = new NettyHandler(getUrl(), this);channels = nettyHandler.getChannels();bootstrap.setPipelineFactory(new ChannelPipelineFactory() {public ChannelPipeline getPipeline() {NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), NettyServer.this);ChannelPipeline pipeline = Channels.pipeline();pipeline.addLast("decoder", adapter.getDecoder());pipeline.addLast("encoder", adapter.getEncoder());pipeline.addLast("handler", nettyHandler);return pipeline;}});channel = bootstrap.bind(getBindAddress());
}

该方法中,看到了熟悉的 boss 线程,worker 线程,和 ServerBootstrap,在添加了编解码 handler 之后,添加一个 NettyHandler,最后调用 bind 方法,完成绑定端口的工作。和我们使用 Netty 是一摸一样。

3. 总结

可以看到,dubbo 使用 Netty 还是挺简单的,消费者使用 NettyClient,提供者使用 NettyServer,Provider 启动的时候,会开启端口监听,使用我们平时启动 Netty 一样的方式。而 Client 在 Spring getBean 的时候,会创建 Client,当调用远程方法的时候,将数据通过 dubbo 协议编码发送到 NettyServer,然后 NettServer 收到数据后解码,并调用本地方法,并返回数据,完成一次完美的 RPC 调用。

好,关于 dubbo 如何使用 Netty 就简短的介绍到这里。

good luck!!!!

热门内容:

  • 2020年Java框架排行榜,谁居榜首?

  • 如何优雅地根治null值引起的Bug!

  • 史上最全的数据库面试题,不看后悔篇!

  • 解锁新姿势:探讨复杂的 if-else 语句“优雅处理”的思路

  • “醒醒吧,世界上有技术驱动型公司!”

  • HttpClient连接池设置引发的一次雪崩

  • SpringBoot 整合 Shiro 实现动态权限加载更新+ Session 共享 + 单点登录

  • 老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...

  • Mybatis:颠覆你心中对事务的理解

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

看 Netty 在 Dubbo 中如何应用相关推荐

  1. 将serversocket 写在按钮事件中连接不上_看 Netty 在 Dubbo 中如何应用

    作者:莫那 鲁道http://cnblogs.com/stateis0/p/9062171.html 目录 dubbo 的 Consumer 消费者如何使用 Netty dubbo 的 Provide ...

  2. Netty第二章 2020 7-4——Netty在Dubbo中的应用(3)关于单一长连接

    dubbo中单一长连接的理解和常见误区 1.低版本dubbo dubbo默认是单一长连接,那么这个默认在哪里,长连接又是什么意思,单一长连接又是什么意思呢? 首先dubbo底层用的是netty,所以长 ...

  3. Netty 在 Dubbo 中是如何应用的?

    众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟. 1. dubbo 的 Consumer 消费者如何使用 Netty 注意 ...

  4. Dubbo中的连接控制,你真的理解吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 刚发现微信公众号有了标签功能,于是乎,我将我 Dubbo 相关的文章都打上了标签,仔细一统计,这已经是我第 41 篇原创的 D ...

  5. 线程组名称_Netty在Dubbo中的线程名称

    在项目中,我们会使用RocketMQ和Dubbo.前者用于发送或消费消息,后者用于两个模块之间的接口调用. RocketMQ和Dubbo在它们的底层都使用Netty作为网络通信的框架.那么今天我们就来 ...

  6. dubbo 消费者也要暴露端口吗_一文详细解读 Dubbo 中的 http 协议

    (给ImportNew加星标,提高Java技能) 转自:Kirito的技术分享,作者:kiritomoe 太阳红彤彤,花儿五颜六色,各位读者朋友好,又来到了分享 Dubbo 知识点的时候了.说到 Du ...

  7. dubbo协议_一文详细解读 Dubbo 中的 http 协议

    太阳红彤彤,花儿五颜六色,各位读者朋友好,又来到了分享 Dubbo 知识点的时候了.说到 Dubbo 框架支持的协议,你的第一反应是什么?大概会有 Dubbo 默认支持的 dubbo 协议,以及老生常 ...

  8. Dubbo中暴露服务的过程解析

    原文链接 dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者延迟设置为-1(delay="-1" ...

  9. spring整合各种RPC框架(netty、dubbo、dubbox、gRPC、Motan)-续(Motan)

    继上文 :spring整合各种RPC框架(netty.dubbo.dubbox.gRPC.Motan)-续(gRPC) Motan相关介绍? Motan是新浪微博开源的一套基于java开发的RPC框架 ...

最新文章

  1. 廖雪峰python教程pdf-爬虫:把廖雪峰的教程转换成 PDF 电子书
  2. java图形界面应用程序(转)
  3. linux shell 时间运算以及时间差计算方法
  4. 在.NET Core微服务中使用HostBuilder和Generic Host
  5. qt int转换成qstring_「QT界面编程实例」创建颜色下拉框并改变窗体颜色(调色板)...
  6. 第十节:基于MVC5+Unity+EF+Log4Net的基础结构搭建
  7. html+lt;input+file样式,不同内核的浏览器中文件选择控件的外观也不相同
  8. 如何在SQL Server 2017中实现图形数据库
  9. Python升级包不成功,试试豆瓣资源吧
  10. sinx/cosx的泰勒展开式与库函数的比较
  11. 超声波测距仪编程_超声波测距详细资料及程序代码
  12. django 关于视频播放
  13. 云课堂服务器技术支持,中学语音教室云课堂云服务器
  14. java里人带狗散步,不想带狗狗出门散步,告诉你5个遛狗的好处,不仅仅只有狗狗受益...
  15. jsp中文传值到java乱码_jsp传递参数中文乱码解决办法
  16. python职业发展规划-python职业发展
  17. 送自费购买的 9 台 Kindle,价值 5400 元
  18. uni-app页面截图保存到相册
  19. 关于keil uvision5打开程序device没有芯片型号选择的问题
  20. 霍尼韦尔携手柯蒂斯-莱特公司用互联技术重塑飞机飞行数据记录器

热门文章

  1. 【转载】“error LNK1169: 找到一个或多个多重定义的符号”的解决方法
  2. linux安装配置postgres及使用dblink
  3. ehcache导致Tomcat重启出错
  4. java web中文乱码处理笔记
  5. JqGridView 1.0.0.0发布
  6. LeetCode实战:合并两个有序链表
  7. 健身也内卷?这届网友用 Python 掌握了做标准俯卧撑的秘诀
  8. 用Matplotlib轻松复刻分析图,看看哪个城市买房最自由
  9. 参与开源项目,结识技术大牛!CSDN“开源加速器计划”招募志愿者啦!
  10. 32岁程序员面试被拒:比又穷又忙更可怕的,是2020年你还不懂...