Thrift作為客戶端流程(多路復用)

以下是一個 使用多路復用(TMultiplexedProtocol) 的 Thrift 客戶端完整流程和關鍵函數(以 Java 為例),適用于當服務端使用 TMultiplexedProcessor 注冊了多個服務時,客戶端可以區分并調用不同的服務。

? 客戶端整體流程(使用 TMultiplexedProtocol)

1. 定義多個服務(以兩個為例)

// example1.thrift
namespace java exampleservice ExampleService1 {string sayHello(1:string name)
}
// example2.thrift
namespace java exampleservice ExampleService2 {i32 add(1:i32 a, 2:i32 b)
}

使用 Thrift 編譯器生成 Java 代碼:

thrift --gen java example1.thrift
thrift --gen java example2.thrift

2. 服務端使用多路復用(服務端部分簡略)

TMultiplexedProcessor multiplexedProcessor = new TMultiplexedProcessor();multiplexedProcessor.registerProcessor("ExampleService1", new ExampleService1.Processor<>(new ExampleService1Impl()));
multiplexedProcessor.registerProcessor("ExampleService2", new ExampleService2.Processor<>(new ExampleService2Impl()));TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(multiplexedProcessor));
server.serve();

3. 客戶端實現(核心)

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TMultiplexedProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;import example.ExampleService1;
import example.ExampleService2;public class ThriftClient {public static void main(String[] args) {TTransport transport = null;try {// 1. 打開傳輸層連接transport = new TSocket("localhost", 9090);transport.open();// 2. 創建基礎協議TProtocol baseProtocol = new TBinaryProtocol(transport);// 3. 使用多路復用協議(針對不同服務)TMultiplexedProtocol protocol1 = new TMultiplexedProtocol(baseProtocol, "ExampleService1");TMultiplexedProtocol protocol2 = new TMultiplexedProtocol(baseProtocol, "ExampleService2");// 4. 創建客戶端 Stub(代理)ExampleService1.Client client1 = new ExampleService1.Client(protocol1);ExampleService2.Client client2 = new ExampleService2.Client(protocol2);// 5. 調用服務方法String greeting = client1.sayHello("Alice");int result = client2.add(5, 7);System.out.println("Service1 response: " + greeting);System.out.println("Service2 response: " + result);} catch (Exception e) {e.printStackTrace();} finally {// 6. 關閉連接if (transport != null) {transport.close();}}}
}

4. C++ 版本:客戶端實現

客戶端代碼(C++)
#include 
#include 
#include 
#include #include "ExampleService1.h"
#include "ExampleService2.h"using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;int main() {try {// 客戶端連接std::shared_ptr socket(new TSocket("localhost", 9090));std::shared_ptr transport(new TBufferedTransport(socket));std::shared_ptr protocol(new TBinaryProtocol(transport));transport->open();// 使用多路復用協議TMultiplexedProtocol protocol1(protocol, "ExampleService1");TMultiplexedProtocol protocol2(protocol, "ExampleService2");// 創建客戶端ExampleService1Client client1(protocol1);ExampleService2Client client2(protocol2);// 調用服務std::string greeting;client1.sayHello(greeting, "Alice");std::cout << "Response from ExampleService1: " << greeting << std::endl;int result;client2.add(result, 5, 7);std::cout << "Response from ExampleService2: " << result << std::endl;transport->close();} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}return 0;
}

🔍 客戶端關鍵類和函數說明

類 / 函數
作用說明
TSocket(host, port)
創建客戶端傳輸連接(基于 TCP)
transport.open()
打開連接
TBinaryProtocol
使用二進制協議進行編碼
TMultiplexedProtocol
多路復用協議,用于標識服務名稱
ExampleService1.Client
客戶端代理,調用服務方法
client1.sayHello("Alice")
實際調用遠程服務端方法
transport.close()
關閉連接

? 小提示

  • 多路復用的關鍵是:
    • 服務端使用 TMultiplexedProcessor 注冊服務(帶名字);
    • 客戶端用 TMultiplexedProtocol 創建不同服務的協議實例(帶同樣的名字)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910249.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現PDF文件添加水印的功能

通過Java代碼實現PDF文件添加水印的功能&#xff0c;主要依賴iText庫&#xff08;用于PDF操作&#xff09;和OSS SDK&#xff08;可選&#xff0c;用于文件上傳&#xff09;。以下是實現的核心步驟&#xff1a; 首先添加依賴 <!-- 添加 PDF 水印 --><dependency>…

Swoft2 框架精華教程:Swoft 的視圖組件

概述 用模板對頁面進行渲染&#xff0c;這是比較經典的一種設計方式了。主要目的是在服務器端進行頁面渲染&#xff0c;以使客戶端瀏覽器可以直接拿到頁面 html 的代碼&#xff0c;這樣對搜索引擎對網站的收錄比較友好。如果是前后端分離的形式&#xff0c;由于前后端交互是用…

[學習] 哈希碼:原理、用途與實現詳解(C代碼示例)

哈希碼&#xff1a;原理、用途與實現詳解 博主在《在C語言中使用字典》一文中&#xff0c;使用哈希來實現鍵值對的快速檢索&#xff0c;今天對哈希這一算法工具&#xff0c;進行一些深入的研究&#xff0c;爭取能能做到知其然亦知其所以然。 文章目錄 哈希碼&#xff1a;原理、…

golang--channel的關鍵特性和行為

Go 語言 Channel 的核心特性與行為深度解析 Channel 是 Go 語言并發編程的核心組件&#xff0c;用于在不同 goroutine 之間進行通信和同步。以下是其關鍵特性和行為的全面分析&#xff1a; 一、基本特性 1. 類型安全通信管道 ch : make(chan int) // 只能傳遞整數2. 方向性…

HarmonyOS 5 鴻蒙多模態融合測試技術方案詳解

以下是針對HarmonyOS 5多模態融合測試的技術方案詳解&#xff0c;綜合交互邏輯、容錯機制及分布式驗證等核心模塊&#xff1a; ?一、多模態交互核心邏輯驗證? ?事件融合機制? 通過kit.AbilityKit監聽語音指令&#xff0c;結合ArkUI手勢系統捕獲屏幕坐標&#xff1a; import…

在AI普及的大環境下神經網絡在新能源汽車熱管理系統中的應用簡介

一、神經網絡的核心原理與結構 1. 生物啟發與基礎組成 神經網絡&#xff08;Artificial Neural Network, ANN&#xff09;受生物神經元信息處理機制啟發&#xff0c;由大量人工神經元互聯構成計算模型。每個神經元接收輸入信號&#xff08;如溫度、流量等物理量&#xff09;&a…

? CATIA V5與3DEXPERIENCE協同設計:引領無人機行業新紀元

在無人機行業蓬勃發展的今天&#xff0c;傳統設計流程正面臨前所未有的系統性挑戰。更令人擔憂的是&#xff0c;隨著無人機應用場景的不斷拓展&#xff0c;從農業植保到城市物流&#xff0c;從應急救援到軍事偵察&#xff0c;對產品性能的要求日益嚴苛。傳統設計方法已難以應對…

關于科技公司經營的一些想法

分析了一些我們公司的問題&#xff1a; 1&#xff0c;測試 重視測試&#xff0c;加大測試投入 2&#xff0c;人才 人才評判標準&#xff1a;結果論&#xff0c;主要根據該崗位問題的解決效率與質量評判。工作時長不重要 任人唯賢。盡可能錄用能解決問題的人才&#xff0c;不…

校招生成長日記(一):初來乍到

提前來了幾天&#xff0c;感受一下廣東的生活。第一印象就是悶熱&#xff01;后面嘗了潮汕火鍋&#xff0c;椰子雞&#xff0c;荔枝&#xff0c;都很不錯&#xff01;&#xff01;&#xff01;就是沒有重口味的&#xff0c;好想念我的酸辣粉&#xff0c;麻辣燙啊......y走了瞬間…

【精選】移動端學習平臺設計與開發 移動端平臺開發(含資料閱讀、時事新聞、時政答題與討論功能) 基于移動端的專題教育平臺設計與實現

博主介紹&#xff1a; ?我是阿龍&#xff0c;一名專注于Java技術領域的程序員&#xff0c;全網擁有10W粉絲。作為CSDN特邀作者、博客專家、新星計劃導師&#xff0c;我在計算機畢業設計開發方面積累了豐富的經驗。同時&#xff0c;我也是掘金、華為云、阿里云、InfoQ等平臺…

Protobuf 高級特性詳解 —— 嵌套消息、Oneof 字段與自定義選項

在前幾篇文章中&#xff0c;我們已經掌握了 Protocol Buffers&#xff08;Protobuf&#xff09;的基礎語法、.proto 文件的結構、以及如何使用 Go 和 Java 進行數據的序列化與反序列化操作。本篇文章將深入探討 Protobuf 的高級特性&#xff0c;包括&#xff1a; 嵌套消息&…

golang--數據類型與存儲

在 Go 語言中&#xff0c;理解值類型&#xff08;value types&#xff09;和引用類型&#xff08;reference types&#xff09;的區別對于編寫高效、正確的代碼至關重要。以下是主要的區別點和需要注意的特殊情況&#xff1a; 一、值類型&#xff08;Value Types&#xff09; …

uniapp——輪播圖、產品列表輪播、上一頁、下一頁、一屏三張圖

案例展示 組件封裝 <template><view><view class="showSwiperBox"><view class="topSwiper"><swiper class="swiper" :autoplay="autoplay" interval="5000" :previous-margin="margin&qu…

用Python實現安全封裝EXE文件加密保護工具

一、概述 這個Python腳本實現了一個強大的EXE文件加密保護工具,它能夠將任何Windows可執行文件封裝到一個帶密碼保護的GUI程序中。核心功能包括: 使用AES-256加密算法保護原始EXE文件 創建美觀的密碼驗證界面 支持自定義程序圖標 自動處理PyInstaller打包過程 修復Tkinter在…

vue3監聽屬性watch和watchEffect的詳解

文章目錄 1. 前言2. 常規用法3. 監聽對象和route變化4. 使用場景4.1 即時表單驗證4.2 搜索聯想功能4.3 數據變化聯動處理 5. watchEffect詳解5-1 基本概念5-2 核心用法基礎示例&#xff1a;自動響應依賴變化處理異步副作用停止監聽與清理副作用 5-3 高級場景應用監聽多個響應式…

Spring IoC核心實現揭秘

Spring IoC(控制反轉)的實現機制是Spring框架的核心,其本質是將對象的創建、依賴管理和生命周期控制權從應用程序代碼轉移到容器中。以下是其核心實現機制: ?? 一、核心實現步驟 配置元數據加載 容器啟動時讀取XML/注解/Java配置類,解析為BeanDefinition對象(包含類名、…

Solidity內部合約創建全解析:解鎖Web3開發新姿勢

合約創建基礎 new 關鍵字創建合約 在 Solidity 中&#xff0c;new關鍵字是創建合約實例的最基本方式&#xff0c;它就像是一個 “魔法鑰匙”&#xff0c;能夠在以太坊區塊鏈上生成一個全新的合約實例。使用new關鍵字創建合約的過程非常直觀&#xff0c;就像我們在其他編程語言…

OCR大模型,破解金融文檔處理困境,從文字識別到文字理解

金融機構在日常運營中處理海量文檔。這些文檔類型多樣&#xff0c;格式復雜&#xff0c;是業務運營的基礎。如何高效、準確地處理這些文檔&#xff0c;直接影響機構的運營效率與風險控制水平。新一代的OCR大模型技術為此提供了有效的解決方案。它提升了文檔處理的自動化程度與數…

2025.6.21筆記(2)

1.編寫一個程序&#xff0c;輸入一個整數&#xff0c;判斷它是奇數還是偶數 解題思路&#xff1a; 1.因為要判斷輸入的數是奇數還是偶數&#xff0c;所以要用到if判斷 2.判讀奇偶數&#xff1a;如果這個數%20&#xff0c;則它為偶數&#xff0c;如果這個數%2!0&#xff0c;則…

【Ambari3.0.0 部署】Step7—Mariadb初始化-適用于el8

如果有其他系統部署需求可以參考原文 https://doc.janettr.com/install/manual/ MariaDB 10 是 Ambari 及大數據平臺的常見數據庫方案。本文適配 Rocky Linux 8.10&#xff0c;涵蓋 MariaDB 10.11 推薦安裝、YUM 源配置、參數優化、初始化和安全設置&#xff0c;幫助你一步到位…