導航:首頁 > 編程語言 > thrift非同步java

thrift非同步java

發布時間:2023-08-23 03:06:48

⑴ 如何用thrift精準地表示日期類型

要編寫Thrift定義文件,肯定要熟悉Thrift常見的數據類型:
1.基本類型(括弧內為對應的java類型):
bool(boolean): 布爾類型(TRUE or FALSE)
byte(byte): 8位帶符號整數
i16(short): 16位帶符號整數
i32(int): 32位帶符號整數
i64(long): 64位帶符號整數
double(double): 64位浮點數
string(String): 採用UTF-8編碼的字元串
2.特殊類型(括弧內為對應的Java類型):
binary(ByteBuffer):未經過編碼的位元組流
3.Structs(結構):
struct定義了一個很普通的OOP對象,但是沒有繼承特性。
struct UserProfile {
1: i32 uid,
2: string name,
3: string blurb
}
如果變數有默認值,可以直接寫在定義文件里:
struct UserProfile {
1: i32 uid = 1,
2: string name = "User1",
3: string blurb
}

4.容器,除了上面提到的基本數據類型,Thrift還支持以下容器類型:
list(java.util.ArrayList):
set(java.util.HashSet):
map(java.util.HashMap):
用法如下:
struct Node {
1: i32 id,
2: string name,
3: list<i32> subNodeList,
4: map<i32,string> subNodeMap,
5: set<i32> subNodeSet
}

包含定義的其他Object:
struct SubNode {
1: i32 uid,
2: string name,
3: i32 pid
}
struct Node {
1: i32 uid,
2: string name,
3: list<subNode> subNodes
}

5.Services服務,也就是對外展現的介面:
service UserStorage {
void store(1: UserProfile user),
UserProfile retrieve(1: i32 uid)
}

⑵ rpc的實現機制是什麼

RPC 的全稱是 Remote Procere Call 是一種進程間通信方式。它允許程序調用另一個地址空間(通常是共享網路的另一台機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即無論是調用本地介面/服務的還是遠程的介面/服務,本質上編寫的調用代碼基本相同。

比如兩台伺服器A,B,一個應用部署在A伺服器上,想要調用B伺服器上應用提供的函數或者方法,由於不在一個內存空間,不能直接調用,這時候需要通過就可以應用RPC框架的實現來解決。

RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)

RPC 是一個請求響應模型。客戶端發起請求,伺服器返回響應(類似於Http的工作方式)

RPC 在使用形式上像調用本地函數(或方法)一樣去調用遠程的函數(或方法)。

二、常見RPC框架

幾種比較典型的RPC的實現和調用框架。

(1)RMI實現,利用java.rmi包實現,基於Java遠程方法協議(Java Remote Method Protocol)

和java的原生序列化。

(2)Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基於HTTP協議,採用二進制編解碼。

(3)THRIFT是一種可伸縮的跨語言服務的軟體框架。thrift允許你定義一個描述文件,描述數據類型和服務介面。依據該文件,編譯器方便地生成RPC客戶端和伺服器通信代碼。

二、RPC框架實現原理

在RPC框架中主要有三個角色:Provider、Consumer和Registry。如下圖所示:

RPC框架面試總結-RPC原理及實現

節點角色說明:

* Server: 暴露服務的服務提供方。

* Client: 調用遠程服務的服務消費方。

* Registry: 服務注冊與發現的注冊中心。

三、RPC調用流程

RPC基本流程圖:

RPC框架面試總結-RPC原理及實現

一次完整的RPC調用流程(同步調用,非同步另說)如下:

1)服務消費方(client)調用以本地調用方式調用服務;

2)client stub接收到調用後負責將方法、參數等組裝成能夠進行網路傳輸的消息體;

3)client stub找到服務地址,並將消息發送到服務端;

4)server stub收到消息後進行解碼;

5)server stub根據解碼結果調用本地的服務;

6)本地服務執行並將結果返回給server stub;

7)server stub將返回結果打包成消息並發送至消費方;

8)client stub接收到消息,並進行解碼;

9)服務消費方得到最終結果。

RPC框架的目標就是要2~8這些步驟都封裝起來,讓用戶對這些細節透明。

四、服務注冊&發現

RPC框架面試總結-RPC原理及實現

服務提供者啟動後主動向注冊中心注冊機器ip、port以及提供的服務列表;

服務消費者啟動時向注冊中心獲取服務提供方地址列表,可實現軟負載均衡和Failover;

五、使用到的技術

1、動態代理

生成 client stub和server stub需要用到 Java 動態代理技術 ,我們可以使用JDK原生的動態代理機制,可以使用一些開源位元組碼工具框架 如:CgLib、Javassist等。

2、序列化

為了能在網路上傳輸和接收 Java對象,我們需要對它進行 序列化和反序列化操作。

* 序列化:將Java對象轉換成byte[]的過程,也就是編碼的過程;

* 反序列化:將byte[]轉換成Java對象的過程;

可以使用Java原生的序列化機制,但是效率非常低,推薦使用一些開源的、成熟的序列化技術,例如:protobuf、Thrift、hessian、Kryo、Msgpack

關於序列化工具性能比較可以參考:jvm-serializers

3、NIO

當前很多RPC框架都直接基於netty這一IO通信框架,比如阿里巴巴的HSF、bbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。

4、服務注冊中心

可選技術:

* Redis

* Zookeeper

* Consul

* Etcd

⑶ thrift c++ 服務端的非同步怎麼實現

仰望明天

thrift服務端的c++語言實現
1.thrift 概念1
thrift是一個軟體框架,用來進行可擴展且跨語言的服務的開發。它結合了功能強大的軟體堆棧和代碼生成引擎,以構建在 C++, Java, Python, php, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。
thrift最初由facebook開發,07年四月開放源碼,08年5月進入apache孵化器。
thrift允許你定義一個簡單的定義文件中的數據類型和服務介面。以作為輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和伺服器通信的無縫跨編程語言。
2.生成c++語言的thrift服務端
利用thrift軟體框架進行開發要首先進行環境的搭建,安裝thrift運行庫。
基本流程如下:
1)定義數據類型和服務介面文件:test.thrift;
2)利用代碼生成引擎生成服務端框架,thrift --gen cpp test.thrift;
3)在./gen-cpp/test_server.skeleton.cpp文件中添加定製的服務;
4)編寫客戶端程序向服務端請求服務。
詳細過程可以參加註釋2給出的鏈接地址。
thrift定義了自己的數據類型,從而實現了跨語言平台之間的數據交換,關於thrift數據類型的詳細說明可以參加註釋3給出的鏈接地址。
3.php客戶端
基於c++語言實現的thrift服務端程序經常被用在網站的後台提供實時且高效的服務,通常客戶端程序是php語言的實現版本。只要根據數據類型和服務介面文件test.thrift生成php語言的介面文件即可用來調用。方法是thrift --gen php test.thrift,調用該命令後會在工作目錄下生成./gen-php目錄,裡面有php語言的介面文件。
注釋:

⑷ 找一下怎麼根據thrift文件生成java需要使用的類

提供一種命令行的方式,利用axis——下載一個axis,假設2-1.5版本,解壓運行cmd,進入axis的bin目錄,執行如下命令:axis2-1.5\bin>wsdl2java.bat-uriD:\wsdl.xml-oD:\output-pcom.bd.zd-uri:wsdl文件-o:Java文件輸出路徑-p:生成的Java文件包名

⑸ thrift非同步客戶端怎麼結束調用

首先創建thrift文件

namespace Java thriftservice Hello{ string helloString(1:string para)}
執行thrift -gen Java test.thrift會生成一個Hello.java文件
將Hello.java文件拷貝至IDE
server端代碼:

[java] view plain

[java] view plain
package com.thrift.test.thrift;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket

⑹ thrift不是一種rpc框架嗎,為什麼看到有人也用它做序列化

Apache Thrift 跨語言服務框架,本質RPC;我發service需要放候,遇跨語言調用問題,JAVA語言發UserService用提供獲取用戶信息服務,服務消費端PHP/Python/C++等,我能所語言都適配相應調用式,候我奈使用Http作訪問協議;服務消費端能使用HTTP,且更加傾向於 操作本API式 使用服務,我需要Thrift提供支持.
本文UserService例,描述使用thrift式,及其原理..
. service.thrift
struct User{
1:i64 id,
2:string name,
3:i64 timestamp,
4:bool vip
}

service UserService{
User getById(1:i64 id)
}

二. API文件
首先載安裝thrift客戶端,比windows平台,載thrift.exe,處需要提醒,同thrift客戶端版本API能兼容.本例使用thrift-0.9.0.exe;通"--gen"指定API所適配語言.本實例java客戶端API.
//windows平台,API文件輸service目錄(目錄需要存)
> thrift.exe --gen java -o service service.thrift

三. UserService實現類
public class UserServiceImpl implements UserService.Iface {
@Override
public User getById(long id){
System.out.println("invoke...id:" + id);
return new User();//for test
}
}

四.原理簡析
1. User.java : thriftAPI能力非限,比struct能使用簡單數據類型(支持Date,Collection等),我能User看,類實現"Serializable"介面"TBase"介面.
其Serializable介面表明類實例需要序列化網路傳輸,干擾JAVA本身序列化反序列化機制,重寫readObjectwriteObject.thrift本身並沒幫助.
TBase介面thrift序列化反序列化使用,兩核:readwrite.述thrift文件,struct定義每屬性都序號,比:1:id,thrift序列化,根據序號順序依屬性"名稱 + 值"寫入inputStream,反序列化.(具體參見readwrite實現).
thrift序列化反序列化實例數據,根據"屬性序號"進行,保證數據inputstreamoutputstream順序嚴格.點要求API發者,更改thrift文件struct定義,需要重新客戶端API,否則服務繼續使用(能報錯,能數據錯誤).thrift序列化/反序列化程JAVA自帶序列化機制同,攜帶額外class結構,外thrift種序列化機制更加適合網路傳輸,且性能更加高效.
2. UserService.Client: UserService,Client靜態類,類典型代理類,類已經實現UserService所.發者需要使用Client類API與Thrift server端交互,負責與Thrift serverSocket鏈接,發送請求接收響應.

閱讀全文

與thrift非同步java相關的資料

熱點內容
bcrpt加密原理 瀏覽:397
女程序員寫的小說 瀏覽:774
華為路由器ip設置命令 瀏覽:552
如何打開軟體伺服器 瀏覽:756
單片機介面技術及應用 瀏覽:751
linux下執行腳本文件 瀏覽:127
撥號加密保護 瀏覽:435
b站彈幕加密 瀏覽:601
交友盲盒源碼破解 瀏覽:248
單片機100位百位符號 瀏覽:686
用友通加密狗壞了 瀏覽:550
如何在伺服器上配置外網網址 瀏覽:844
阿里雲伺服器的硬體在哪裡 瀏覽:54
python自動注冊谷歌 瀏覽:330
phpini驗證碼 瀏覽:826
解壓後的文件怎麼驅動 瀏覽:328
老闆要程序員加班 瀏覽:416
泰爾pdf 瀏覽:313
視頻轉碼壓縮哪款軟體好 瀏覽:649
盯盯拍記錄儀下載什麼app 瀏覽:438