返回顶部
首页 > 资讯 > 精选 >Java Dubbo协议下的服务端线程如何使用
  • 463
分享到

Java Dubbo协议下的服务端线程如何使用

2023-07-05 07:07:12 463人浏览 独家记忆
摘要

本篇内容主要讲解“Java dubbo协议下的服务端线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Dubbo协议下的服务端线程如何使用”吧!Provid

本篇内容主要讲解“Java dubbo协议下的服务端线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Dubbo协议下的服务端线程如何使用”吧!

Provider端线程模型

在了解服务端线程模型之前,先了解一下Dubbo对Channel上的操作抽象,Dubbo将Channel上的操作成了5中行为,分别是:建立连接、断开连接、发送消息、接收消息、异常捕获,Channel上的操作的接口为org.apache.dubbo.remoting.ChannelHandler,该接口是SPI的,用户可以自己扩展,接口代码如下:

该接口抽象的五种Channel上的行为解释如下:

  • 建立连接:connected,主要是的职责是在channel记录read、write的时间,以及处理建立连接后的回调逻辑,比如dubbo支持在断开后自定义回调的hook(onconnect),即在该操作中执行。

  • 断开连接:disconnected,主要是的职责是在channel移除read、write的时间,以及处理端开连接后的回调逻辑,比如dubbo支持在断开后自定义回调的hook(ondisconnect),即在该操作中执行。

  • 发送消息:sent,包括发送请求和发送响应。记录write的时间。

  • 接收消息:received,包括接收请求和接收响应。记录read的时间。

  • 异常捕获:caught,用于处理在channel上发生的各类异常。

Dubbo框架的线程模型与以上这五种行为息息相关,Dubbo协议Provider端线程模型提供了五种实现,虽说都是五种但是别把二者混淆,线程模型的顶级接口是org.apache.dubbo.remoting.Dispatcher,该接口也是SPI的,提供的五种实现分别是AllDispatcherDirectDispatcherMessageOnlyDispatcherExecutionDispatcherConnectionOrderedDispatcher,默认的使用的是AllDispatcher

Java Dubbo协议下的服务端线程如何使用

org.apache.dubbo.remoting.ChannelHandler作为Channel上的行为的顶级接口对应Dubbo协议Provider端的5种线程模型同样也提供了对应的5种实现,分别是AllChannelHandlerDirectChannelHandlerMessageOnlyChannelHandlerExecutionChannelHandlerConnectionOrderedChannelHandler,这里Channel上行为的具体实现不展开讨论。

Java Dubbo协议下的服务端线程如何使用

Channel上行为和线程模型之间使用策略可以参考org.apache.dubbo.remoting.transport.dispatcher.ChannelHandlers的源代码,这里不做详细的介绍,下面的各个章节只针对5种线程模型做简单的介绍。

AllDispatcher

IO线程上的操作:

  • 接口响应序列化

  • sent操作

Dubbo线程池上的操作:

  • received、connected、disconnected、caught都是在Dubbo线程池上执行

  • 服务端反序列化操作的Dubbo线程池上执行

AllDispatcher代码如下,AllDispatcherdispatch方法实例化了AllChannelHandlerAllChannelHandler实现了received、connected、disconnected、caught操作在dubbo线程池中,代码如下:

public class AllDispatcher implements Dispatcher {    public static final String NAME = "all";    @Override    public ChannelHandler dispatch(ChannelHandler handler, URL url) {        return new AllChannelHandler(handler, url);    }}
public class AllChannelHandler extends WrappedChannelHandler {    public AllChannelHandler(ChannelHandler handler, URL url) {        super(handler, url);    }    @Override    public void connected(Channel channel) throws RemotingException {        ExecutorService executor = getSharedExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.CONNECTED));        } catch (Throwable t) {            throw new ExecutionException("connect event", channel, getClass() + " error when process connected event .", t);        }    }    @Override    public void disconnected(Channel channel) throws RemotingException {        ExecutorService executor = getSharedExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.DISCONNECTED));        } catch (Throwable t) {            throw new ExecutionException("disconnect event", channel, getClass() + " error when process disconnected event .", t);        }    }    @Override    public void received(Channel channel, Object message) throws RemotingException {        ExecutorService executor = getPreferredExecutorService(message);        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));        } catch (Throwable t) {            if(message instanceof Request && t instanceof RejectedExecutionException){                sendFeedback(channel, (Request) message, t);                return;            }            throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);        }    }    @Override    public void caught(Channel channel, Throwable exception) throws RemotingException {        ExecutorService executor = getSharedExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.CAUGHT, exception));        } catch (Throwable t) {            throw new ExecutionException("caught event", channel, getClass() + " error when process caught event .", t);        }    }}

DirectDispatcher

该线程模型Channel上的所有行为均在IO线程中执行,并没有在Dubbo线程池中执行

DirectDispatcherAllDispatcher相似,实例化了DirectChannelHandlerDirectChannelHandler只实现了received行为,但是received中获取的线程池如果是ThreadlessExecutor才会提交task,否则也是在ChannelHandler中执行received行为,ThreadlessExecutor和普通线程池最大的区别是不会管理任何线程,这里不展开讨论。

public class DirectDispatcher implements Dispatcher {    public static final String NAME = "direct";    @Override    public ChannelHandler dispatch(ChannelHandler handler, URL url) {        return new DirectChannelHandler(handler, url);    }}
public class DirectChannelHandler extends WrappedChannelHandler {    public DirectChannelHandler(ChannelHandler handler, URL url) {        super(handler, url);    }    @Override    public void received(Channel channel, Object message) throws RemotingException {        ExecutorService executor = getPreferredExecutorService(message);        if (executor instanceof ThreadlessExecutor) {            try {                executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));            } catch (Throwable t) {                throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);            }        } else {            handler.received(channel, message);        }    }}

ExecutionDispatcher

在IO线程中执行的操作有:

  • sent、connected、disconnected、caught操作在IO线程上执行。

  • 序列化响应在IO线程上执行。

在Dubbo线程中执行的操作有:

  • received都是在Dubbo线程上执行的。

  • 反序列化请求的行为在Dubbo中做的。

同样的,我们可以直接看ExecutionChannelHandler源码,逻辑是当message的类型是Request时received行为在Dubbo线程池执行。感兴趣的可以自己看源码,这里不做介绍。

MessageOnlyDispatcher

Message Only Dispatcher所有的received行为和反序列化都是在dubbo线程池中执行的

public class MessageOnlyChannelHandler extends WrappedChannelHandler {    public MessageOnlyChannelHandler(ChannelHandler handler, URL url) {        super(handler, url);    }    @Override    public void received(Channel channel, Object message) throws RemotingException {        ExecutorService executor = getPreferredExecutorService(message);        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));        } catch (Throwable t) {            if(message instanceof Request && t instanceof RejectedExecutionException){                sendFeedback(channel, (Request) message, t);                return;            }            throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);        }    }}

ConnectionOrderedDispatcher

该线程模型与AllDispatcher类似,sent操作和相应的序列化是在IO线程上执行;connected、disconnected、received、caught操作在dubbo线程池上执行,他们的区别是在connected、disconnected行为上ConnectionOrderedDispatcher做了线程池隔离,并且在Dubbo connected thread pool中提供了链接限制、告警灯能力,我们直接看ConnectionOrderedChannelHandler源码,代码如下:

public class ConnectionOrderedChannelHandler extends WrappedChannelHandler {    protected final ThreadPoolExecutor connectionExecutor;    private final int queueWarningLimit;    public ConnectionOrderedChannelHandler(ChannelHandler handler, URL url) {        super(handler, url);        String threadName = url.getParameter(THREAD_NAME_KEY, DEFAULT_THREAD_NAME);        connectionExecutor = new ThreadPoolExecutor(1, 1,                0L, TimeUnit.MILLISECONDS,                new LinkedBlockingQueue<Runnable>(url.getPositiveParameter(CONNECT_QUEUE_CAPACITY, Integer.MAX_VALUE)),                new NamedThreadFactory(threadName, true),                new AbortPolicyWithReport(threadName, url)        );  // FIXME There's no place to release connectionExecutor!        queueWarningLimit = url.getParameter(CONNECT_QUEUE_WARNING_SIZE, DEFAULT_CONNECT_QUEUE_WARNING_SIZE);    }    @Override    public void connected(Channel channel) throws RemotingException {        try {            checkQueueLength();            connectionExecutor.execute(new ChannelEventRunnable(channel, handler, ChannelState.CONNECTED));        } catch (Throwable t) {            throw new ExecutionException("connect event", channel, getClass() + " error when process connected event .", t);        }    }    @Override    public void disconnected(Channel channel) throws RemotingException {        try {            checkQueueLength();            connectionExecutor.execute(new ChannelEventRunnable(channel, handler, ChannelState.DISCONNECTED));        } catch (Throwable t) {            throw new ExecutionException("disconnected event", channel, getClass() + " error when process disconnected event .", t);        }    }    @Override    public void received(Channel channel, Object message) throws RemotingException {        ExecutorService executor = getPreferredExecutorService(message);        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));        } catch (Throwable t) {            if (message instanceof Request && t instanceof RejectedExecutionException) {                sendFeedback(channel, (Request) message, t);                return;            }            throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);        }    }    @Override    public void caught(Channel channel, Throwable exception) throws RemotingException {        ExecutorService executor = getSharedExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.CAUGHT, exception));        } catch (Throwable t) {            throw new ExecutionException("caught event", channel, getClass() + " error when process caught event .", t);        }    }    private void checkQueueLength() {        if (connectionExecutor.getQueue().size() > queueWarningLimit) {            logger.warn(new IllegalThreadStateException("connectionordered channel handler queue size: " + connectionExecutor.getQueue().size() + " exceed the warning limit number :" + queueWarningLimit));        }    }}

到此,相信大家对“Java Dubbo协议下的服务端线程如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java Dubbo协议下的服务端线程如何使用

本文链接: https://lsjlt.com/news/350405.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java Dubbo协议下的服务端线程如何使用
    本篇内容主要讲解“Java Dubbo协议下的服务端线程如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Dubbo协议下的服务端线程如何使用”吧!Provid...
    99+
    2023-07-05
  • JavaDubbo协议下的服务端线程使用详解
    目录Provider端线程模型AllDispatcherDirectDispatcherExecutionDispatcherMessageOnlyDispatcherConnect...
    99+
    2023-03-01
    Java Dubbo服务端线程 Java服务端线程模型
  • 如何使用加密的远程终端协议(RDP)保护CentOS服务器
    要使用加密的远程终端协议(RDP)保护CentOS服务器,您可以按照以下步骤进行操作:1. 安装并配置Xfce桌面环境(或其他桌面环...
    99+
    2023-10-12
    CentOS
  • 如何在java中的使用UDP协议
    本篇文章为大家展示了如何在java中的使用UDP协议,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认...
    99+
    2023-06-06
  • Java中如何使用HTTP协议进行编程?
    Java中如何使用HTTP协议进行编程? 在现代Web应用程序中,HTTP协议是最常用的协议之一。Java提供了丰富的API和库来处理HTTP请求和响应。本文将介绍Java中如何使用HTTP协议进行编程。 一、使用URLConnection...
    99+
    2023-10-12
    http 编程算法 存储
  • 如何建立云服务器端口协议服务端口
    建立云服务器端口协议服务端口是一项非常复杂的任务,需要考虑许多因素。以下是一些有用的建议,可以帮助你建立云服务器端口协议服务端口: 确保你的云服务器有可用的服务器端口:你需要确保你的云服务器有足够的可用端口来提供端口服务。一般来说,你需...
    99+
    2023-10-26
    端口 协议 服务器
  • 如何建立云服务器端口协议
    建立云服务器端口协议可以按照以下步骤进行: 确定端口号:选择云端服务器的端口号。例如,您可以使用主机控制台上提供的TCP/IP端口号来查找云端服务器的端口号。 配置端口:在您的云服务器上安装所需的协议。例如,可以配置以下步骤: ho...
    99+
    2023-10-26
    端口 协议 服务器
  • 如何建立云服务器端口协议服务
    建立云服务器端口协议服务是一个比较复杂的任务,需要考虑许多因素,包括服务提供商、网络服务提供商和应用程序编程接口(API)等因素。下面是一种简单的方法来创建一个端口协议服务: 确定云服务器提供商:在开始创建云服务器端口协议服务之前,需要...
    99+
    2023-10-26
    端口 协议 服务器
  • 如何建立云服务器端口协议服务端口命令
    建立云服务器端口协议服务端口的命令有很多,以下是一些常用的命令: CMD /etc/server/statistics:列出您需要使用端口的实例名称。 Shell脚本:使用命令行工具创建一个Shell脚本,可以检查服务器的端口状态,并在...
    99+
    2023-10-27
    端口 命令 协议
  • 如何建立云服务器端口协议服务端口连接
    建立云服务器端口协议服务端口连接需要考虑以下几个步骤: 确定服务器的位置和端口:在选择服务器后,需要确定服务器的位置和端口信息,这些信息可以帮助我们更好地确定服务端口的连接端口。 下载服务端软件并安装:将云服务器端软件下载到本地机器并安...
    99+
    2023-10-27
    端口 协议 服务器
  • 如何建立云服务器端口协议服务模式
    建立云服务器端口协议服务模式通常需要使用以下步骤: 选择云服务器平台:了解云服务器的平台选择,云服务器平台提供哪些端口,需要连接哪些端口和协议类型等信息。 选择网络协议:选择网络协议,需要了解所使用的网络协议,包括TCP/IP协议、HT...
    99+
    2023-10-26
    端口 协议 模式
  • 如何建立云服务器端口协议服务系统
    建立云服务器端口协议服务系统通常需要考虑以下步骤: 选择云服务器平台:不同的云服务器平台提供的服务有不同的端口设置。比如说: Google云服务器平台提供了 100000 端口,Facebook云服务器平台提供了 8080 端口等...
    99+
    2023-10-26
    端口 协议 服务器
  • 如何建立云服务器端口协议文件
    建立云服务器端口协议文件,需要先建立一个包含服务器端口号的文件,这个文件可以包含任何服务器的端口号。通常使用.so来编写这个文件: @echo off echo off; 然后,可以根据需要添加或删除端口号。例如,对于一个需要在Web...
    99+
    2023-10-26
    端口 协议 服务器
  • 美国服务器使用TCP协议的端口有哪些
    美国服务器使用TCP协议的端口有:1、FTP,文件传输协议,使用21端口;2、Telnet,用于远程登陆的端口,使用23端口;3、SMTP,邮件传送协议,使用25端口;4、POP3,用于接收邮件,使用110端口。具体内容如下:FTP定义了文...
    99+
    2024-04-02
  • PHP 中如何使用 HTTP 协议和 Apache 服务器?
    PHP 是一种广泛使用的开源脚本语言,它最初是为 Web 开发而设计的。在 Web 开发过程中,使用 HTTP 协议和 Apache 服务器是非常常见的,因为它们是 Web 应用程序的基础。在本文中,我们将探讨如何使用 PHP 中的 HTT...
    99+
    2023-11-06
    http apache javascript
  • 如何建立云服务器端口协议服务端口命令方式
    首先,让我们来了解一下如何在命令行中建立端口协议服务端口。在命令行中建立端口协议服务端口的基本步骤是:打开终端、连接到远程服务器、使用终端的命令和选项、发送选项到终端。在这些步骤中,我们需要使用终端的命令和选项,并且需要使用端口选项来指明需...
    99+
    2023-10-27
    端口 命令 协议
  • 如何建立云服务器端口协议文件夹
    建立云服务器端口协议文件夹可以遵循以下步骤: 打开命令提示符。 输入 net/ip://服务器地址和端口 ,以及 nat-gateway://服务器地址和端口 ,如下所示: net // 服务器地址和端口 nat-gateway //服...
    99+
    2023-10-26
    端口 文件夹 协议
  • Java Socket如何使用加密协议传输对象
    本篇文章为大家展示了Java Socket如何使用加密协议传输对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密...
    99+
    2023-06-17
  • 如何在Java应用程序中集成HTTP协议?
    Java是一种广泛使用的编程语言,它可以用于开发各种类型的应用程序,包括网络应用程序。HTTP协议是Web应用程序中最常用的协议之一,它可以用于在客户端和服务器之间传输数据。在本文中,我们将探讨如何在Java应用程序中集成HTTP协议。 ...
    99+
    2023-08-18
    http npm spring
  • 如何使用加密的远程登录协议(SSH)保护CentOS服务器
    要保护CentOS服务器,可以使用加密的远程登录协议(SSH)。以下是使用SSH保护CentOS服务器的步骤:1. 安装SSH服务器...
    99+
    2023-10-12
    CentOS
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作