thrift rpc 四种类型的服务端的实现详细介绍

thrift rpc 四种类型的服务端的实现详细介绍

这里主要是使用 thrift 开发的时候服务器端的实现,以及 thrift 提供给我们多钟的服务的实现,以及每个实现的服务器的特点和 API 介绍,TServer 主要包含以下几种实现

  • TSimpleServer
    • 阻塞的但线程模式,他并没有实战价值,只是对于学习 thrift 服务器的简单入门是十分友好的
  • TThreadPoolServer
    • 阻塞线程池的设计模式
  • TNonblockingServer
    • 非阻塞的但线程模式
  • TSelectorServer
    • 他的实现主要是 selector 模型,主从 selector 模式,跟我们了解过的 netty 中使用的设计十分类似

TSimpleServer

既然他是一个没有实战价值的服务实现,那为什么我们要学习他兵器在入门阶段使用它呢,因为就是因为它的简单,才利于学习,利于我们了解 thrift 中对于服务的设计,对于接下来对多线程乃至主从 selector 的学习也会有很好的铺垫作用。

TSimpleServer 的内部实现原理

内部的实现是依靠 JDK 的 SocketServer + accept 并且没有使用 thread 来提高效率,是一个阻塞的但线程模式。

// 打开查看方法 org.apache.thrift.server.TSimpleServer#serve
// 这里有一个执行的片段 client = serverTransport_.accept(); 这就是实现 accept 的核心逻辑

TThreadPoolServer

线程池的版本他使用了一个线程池来解决的阻塞的请求,但是他也是阻塞的,一个线程池只能处理一个请求,它的大致流程 accept -> 接收到请求 -> 分配线程执行 它的好处不言而喻可以同时提供给多个客户端的服务,但是坏处是如果线程池的设置太多会占用太多资源,如果某个线程发生阻塞这个时候只能阻塞等待这个线程执行完毕,但是如果太少又没有办法给更多的客户端提供服务

private static void tThreadPoolServer() throws TTransportException {// TTransportFactorytry (final TServerTransport serverTransport = new TServerSocket(9090)) {final TThreadPoolServer threadPoolServer = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).protocolFactory(new TBinaryProtocol.Factory()).processor(new UserService.Processor<>(new UserServiceImpl())));threadPoolServer.serve();}
}

和 simple 的版本最重要的区别就是在 TServer 使用的是 TThreadPoolServer,他内置一个线程池

/*** 可以在构造器中看到有一个线程池的创建和复制逻辑*/
public TThreadPoolServer(Args args) {super(args);stopTimeoutUnit = args.stopTimeoutUnit;stopTimeoutVal = args.stopTimeoutVal;// 赋值线程池executorService_ =args.executorService != null ? args.executorService : createDefaultExecutorService(args);
}

他的线程池创建逻辑

public int minWorkerThreads = 5;
public int maxWorkerThreads = Integer.MAX_VALUE;private static ExecutorService createDefaultExecutorService(Args args) {return new ThreadPoolExecutor(args.minWorkerThreads, // 默认的核心线程args.maxWorkerThreads, // 最大的线程池60L,TimeUnit.SECONDS,new SynchronousQueue<>(),// 线程工厂new ThreadFactory() {final AtomicLong count = new AtomicLong();@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setDaemon(true);thread.setName (String.format("TThreadPoolServer WorkerProcess-%d", count.getAndIncrement()));return thread;}});
}public Args maxWorkerThreads(int n) {maxWorkerThreads = n;return this;
}

我们可以看到最大的默认线程池的数量是 Integer.MAX_VALUE,但是是可以配置的,我们尽量不要使用它的默认配置可以自己创建线程池,如果不自己创建可以在使用默认线程池的时候指定最大的线程池,使用方法 maxWorkerThreads,防止在使用的时候出现 OOM

执行流程

accept -> 分配 worker 线程执行任务(这里面的内容就是但线程的执行流程)

非阻塞 IO

thrift 的规定中,非阻塞的 server 必须使用的 tTransportTFramedTransport,但是如果使用 TFramedTransport 必须对应的 tProtocol 则必须是搭配的是 TCompactProtocol,因此在客户端的选择上肯定也是要使用的网络传输 -> TFramedTransport,使用的协议肯定自然也是 -> TCompactProtocol,但是为什么会存在这样强制的搭配选择呢?大概官方的意图是既然选择了 NIO 的模式肯定是选择了更高效的模式,所以一不做二不休,直接一次性到位,必须搭配对应更高效的压缩的模式来传输数据。

TNonBlockingServer

TNonBlockingServer 是一个非阻塞 IO,底层的实现是使用的 NIO,但是他使用的是但线程,并没有使用多线程,这就导致在实际生产中并不会选择这个作为我们的服务端的实现方式。不过可以见到看一下他们的编码实现方式

服务端的代码实现
public static void main(String[] args) throws TTransportException {tNonBlockingServer();
}private static void tNonBlockingServer() throws TTransportException {try (final TNonblockingServerTransport framedTransport = new TNonblockingServerSocket(9090)) {final TNonblockingServer nonblockingServer = new TNonblockingServer(new TNonblockingServer.Args(framedTransport).protocolFactory(new TCompactProtocol.Factory()).processor(new UserService.Processor<>(new UserServiceImpl())));framedTransport.accept();nonblockingServer.serve();}
}
客户端的代码实现
public static void main(String[] args) {simpleNioClient();
}public static void simpleNioClient() {try (TFramedTransport tFramedTransport = new TFramedTransport(new TSocket("localhost", 9090))) {tFramedTransport.open();System.out.println(new UserService.Client(new TCompactProtocol(tFramedTransport)).queryUserByNameAndPassword("new User()", "222"));} catch (TException e) {throw new RuntimeException(e);}
}

TThreadSelectorServer

TThreadSelectorServer 其实底层的实现是一个主从的 Reactor 模型,一下是他的架构实现图,关于主从 reactor 的调度流程

/*** 服务端的代码实现*/
private static void tThreadSelectorServer() throws TTransportException {try (TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(9090)) {serverSocket.accept();final TThreadedSelectorServer selectorServer = new TThreadedSelectorServer(new TThreadedSelectorServer.Args(serverSocket).protocolFactory(new TCompactProtocol.Factory()).processor(new UserService.Processor<>(new UserServiceImpl())));selectorServer.serve();}
}

默认的实现线程池大小是 5,可以配置 workerThreads 这个其实就是指定的核心线程数。默认的是 5 使用的创建线程池的方式为 new ThreadPoolExecutor(...),但是也可以自己创建线程池,使用 executorService 这个参数进行配置。底层其实和 TNonBlockingServer 是一样的,知识在单线程的基础上增加了线程池的支持使其在执行 work 任务的时候可以更高效的使用线程池来执行任务。

在这里插入图片描述

注意点地方

  • 客户端的 thrift 版本必须和服务端使用的 thrift 的版本一致
  • 客户端使用的纯属和协议必须和服务端的一直,也就是 tTransport,tProtocol

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463879.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution(object):def isValidBST(self, root):"…

[Prometheus学习笔记]从架构到案例,一站式教程

文章目录 Prometheus 优势Prometheus 的组件、架构Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标&#xff0c;它在本地存储所有抓取到的样本数据&#xff0c;并对此数据执行一系列规则&#xff0c;以汇总和记录现有数据的新时间序列或生成告警。可以通…

抓住亚马逊、shein新品扶持期,利用测评提升搜索排名与销量

亚马逊的卖家们应该意识到&#xff0c;新发布的产品在上线后的2到4周内&#xff0c;通常会获得平台的流量支持。这一阶段被称为“新品流量黄金期”&#xff0c;在此期间&#xff0c;产品的搜索排名和曝光率通常会比平时更高。因此&#xff0c;如何有效利用这一阶段&#xff0c;…

轻松入门WordPress:在Ubuntu上搭建本地网站并配置公网访问地址

文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站&#xff0c…

华为云计算知识总结——及案例分享

目录 一、华为云计算基础知识二、华为云计算相关案例实战案例一&#xff1a;搭建弹性云服务器&#xff08;ECS&#xff09;并部署Web应用案例二&#xff1a;构建基于OBS的图片存储和分发系统案例三&#xff1a;基于RDS的高可用数据库应用案例四&#xff1a;使用华为云DDoS防护保…

银行金融知识竞赛活动策划方案

根据《中国人民银行**市中心支行“创新金融服务&#xff0c;支持经济发展”业务竟赛活动实施方案》安排&#xff0c;中支决定于9月28日举办**市人民银行系统“创新金融服务&#xff0c;支持经济发展”现场业务竞赛&#xff0c;为确保业务竞赛组织工作顺利开展&#xff0c;特制定…

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…

引领数字时代:万码优才如何变革IT人才招聘新体验(这里有更精准的推荐)

目录 引领数字时代&#xff1a;万码优才如何变革IT人才招聘新体验引领未来科技&#xff0c;精准链接IT精英精准匹配&#xff0c;高效对接海量资源&#xff0c;覆盖广泛优化体验&#xff0c;简化流程 全面升级&#xff1a;AI赋能数字人才职业成长AI模拟面试职场千问智能简历评估…

Rocky Linux 9安装后无法远程ssh密码登录解决

在Rocky Linux 9版本中&#xff0c;为了增加安全性&#xff0c;默认情况下禁用SSH root密码登录。这是系统默认设定的规则&#xff0c;我们同样也可以更改它。   允许Rocky Linux 9 root用户通过ssh登录方法&#xff1a; 1.编辑SSH配置文件 2.找到以下内容 PermitRootLogin …

1.2 图像处理基本操作

在本实战中&#xff0c;我们将学习如何使用OpenCV进行基本的图像处理操作。首先&#xff0c;我们将通过cv2.imread()函数读取图像&#xff0c;并使用cv2.imshow()在窗口中显示它。接着&#xff0c;我们将探索如何通过cv2.imwrite()保存图像&#xff0c;并设置不同的参数以控制图…

【C++】哈希表模拟:开散列技术与哈希冲突处理

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制

高级动画可以显著提升用户体验&#xff0c;为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画&#xff0c;包括弹性动画、透明度渐变和旋转缩放组合动画等示例。 关键词 高级动画弹性缓动自动动画缓动曲线 一、Animation 组件的高级缓动曲线 缓动曲线&#…

SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;启动流程之SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;启动流程之引导上下文DefaultBootstrapContext 目录 前言一、入口二、DefaultBootstrapContext1、BootstrapRegistry接口2、BootstrapCon…

ELK之路第三步——日志收集筛选logstash和filebeat

logstash和filebeat&#xff08;偷懒版&#xff09; 前言logstash1.下载2.修改配置文件3.测试启动4.文件启动 filebeat1.下载2.配置3.启动 前言 上一篇&#xff0c;我们说到了可视化界面Kibana的安装&#xff0c;这一篇&#xff0c;会简单介绍logstash和filebeat的安装和配置。…

Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 房屋信息详情 个人中心 管理员登录界面 管理员功能界面 用户管理界面 房屋信…

深度学习笔记之BERT(一)BERT的基本认识

深度学习笔记之BERT——BERT的基本认识 引言回顾&#xff1a;Transformer的策略回顾&#xff1a;Word2vec的策略和局限性 BERT \text{BERT} BERT的基本理念抽象的双向BERT的预训练策略 预训练与微调 引言 从本节开始&#xff0c;将介绍 BERT \text{BERT} BERT系列模型以及其常…

YOLOv8改进,YOLOv8引入ResCBAM注意力机制,二次创新C2f结构

摘要 腕部创伤甚至骨折在日常生活中经常发生,在儿童中,他们占骨折病例的很大比例。在进行手术之前,外科医生通常会要求患者先进行 X 光成像,并根据放射科医生的分析进行手术准备。随着神经网络的发展,“You Only Look Once”(YOLO)系列模型在骨折检测中的应用越来越广泛…

CSS--两列网页布局,三列布局和多行多列布局

两列网页布局 两列网页布局实验 先将一个未运用浮动效果的网页结构写出来 <style>header{/* 给页眉设置宽高和样式 */width:1000px;height: 40px;background-color: gray;border: 3px brown solid;margin-bottom: 5px;}article{width:1000px;height: 600px;background-c…

如何使用Web-Check和cpolar实现安全的远程网站监测与管理

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本期给大家分享一个网站检测工具Web-Check&#xff0c;能帮你全面了解网…

Webserver(2.6)信号

目录 信号的概念信号相关的函数killraiseabortalarm1s钟电脑能数多少个数&#xff1f; setitimer过3s以后&#xff0c;每隔2s定时一次 信号捕捉函数signalsigaction 信号集sigprocmask编写一个程序&#xff0c;把所有的常规信号未决状态打印到屏幕 sigchld信号 信号的概念 比如…