thriftjava
㈠ 在預先不知道數據類型的情況下怎麼使用 thrift
工程目錄如下:
project
idl/
gen.bat
thrift.exe
main.thrift
res/
a.jpg
lib/
a.py
其中idl裡面存放大茄脊的是thrift相關的配置文件內容。gen.bat的內容如下:
點擊(此處)折疊或打開
@ECHO OFF
set THRIFT_CODEDEFINE=main.thrift
if "%1"=="" goto genDefault
:genDefault
call thrift-0.7.0.exe --gen py main.thrift
goto end
:genByArg
call thrift-0.7.0.exe --gen java:hashcode %1
call thrift-0.7.0.exe --gen php %1
call thrift-0.7.0.exe --gen py %1
goto end
:exit
exit /b 1
:end
exit /b 0
可以給它傳遞一個thrift配置文件然後編譯輸出相應的代碼.
ps:如果是py的話中文是個問題的.需要手工置#coding:utf-8
main.thrift的內容如下
點擊(此處)折疊或打開
namespace py thriftlib.adspub.thrift
exception ThrfitException {
1: i32 errCode,
2: string msg
}
struct ResultInfo{
1: i32 err,
2: string value,
3: string msg
}
struct A {
1: string type,
2: i32 age
}
struct B {
1: i32 id,
2: list a
}
service InfoService {
ResultInfo deployTemplateCreate(1:B deployObject,2:string username);
list deployPlanList(1:string planName);
}
簡單介紹一下如何編寫thrift配置文件
數據類型:
bool,byte,i16,i32,i64,double,string,binary[二進制類型,在做文件伺服器的時候使用]
structs:定義了一個類對象。其實就是一個OOP裡面的類
容器類:list,set:集合,map: 字典。包括了三種容器對象
異常:這個跟傳統的異常沒有太納凱大的差異
服務:類似於定義了滾滲一個介面或純抽象類。程序員要做的就是去實現這些介面然後就可以暴露給客戶端調用了。
定義完了thrift文件之後就可以寫代碼了
㈡ 怎麼生成thrift 代碼
編寫,thrift文件,以筆者項目為例,auth.thrift,把auth.thrift拷貝到D盤Thrift目錄襪旁森下,在命令行輸入:thrift -gen java D:\Thrift\auth.thrift
在目錄下即告畝可生成啟臘EntityAuth.java文件。將java文件拷貝到自己的項目里即可使用了。
㈢ 如何用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)
}
㈣ thrift struct怎麼實現繼承的效果
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 : thrift生成API的能力還是非常的有限,比如在struct中只能使用簡單的數據類型(不支持Date,Collection<?>等),不過我們能從User中看出,它生成的類實現了"Serializable"介面和"TBase"介面.
其中Serializable介面表明這個類的實例是需要序列化之後在網路中傳輸的,為了不幹擾JAVA本身的序列化和反序列化機制,它還重寫了readObject和writeObject方法.不過這對thrift本身並沒有幫助.
TBase介面是thrift序列化和反序列化時使用的,它的兩個核心方法:read和write.在上述的thrift文件中,struct定義的每個屬性都有一個序號,比如:1:id,那麼thrift在序列化時,將會根據序號的順序依次將屬性的"名稱 + 值"寫入inputStream中,反序列化也是如此.(具體參見read和write的實現).
因為thrift的序列化和反序列化實例數據時,是根據"屬性序號"進行,這可以保證數據在inputstream和outputstream中順序是嚴格的.這一點也要求API開發者,如果更改了thrift文件中的struct定義,需要重新生成客戶端API,否則服務將無法繼續使用(可能報錯,也可能數據錯誤).thrift序列化/反序列化的過程和JAVA自帶的序列化機制不同,它將不會攜帶額外的class結構,此外thrift這種序列化機制更加適合網路傳輸,而且性能更加高效.
2. UserService.Client: 在生成的UserService中,有個Client靜態類,這個類就是一個典型的代理類,此類已經實現了UserService的所有方法.開發者需要使用Client類中的API方法與Thrift server端交互,它將負責與Thrift server的Socket鏈接中,發送請求和接收響應.
㈤ 關於java分布式應用開發除了bbo還有什麼框架可推薦嗎
關於java分布式應用開發除了bbo還有下面幾個框架可推薦:
spring-cloud,其他的如twitter的finagle,facebook的thrift。
㈥ ts怎麼用javaclient
使用Java Client來閉沖孫使用Apache Thrift,轎鏈首先你需要安裝Apache Thrift,然後在你的Java項目中添加Thrift的jar文件,然後使判基用Thrift提供的工具來生成你的Java客戶端代碼,最後你可以使用這些代碼來調用Thrift服務。
㈦ thrift和google protobuffer各有什麼優劣
Google就是Google,就算是推白菜出來,也一樣能讓人側目。其實protocol buffers也不是什麼新鮮的概念,且不說傳統的ASN.1, ICE這些有點類似的東西,facebook一年前就推出了thrift,應該說定位是非常的接近的。也有謠傳說是先有了protocol buffers在google內部流行,然後google的人跳槽到facebook,就出了thrift這個東西……呵呵,停止八卦,言歸正傳。 觀察法看到的優缺點 Thrift: 支持的語言更廣泛一些c++, java, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php, squeak(真夠變態的) protobuf 目前還是只支持c++, java, python, 其他語言有待開發. Thrift提供的功能更豐富一些: Thrift提供了簡單的RPC構架(其實不簡單了, block, nonblock的都有了…..) protobuf好像一心一意做好自己判尺扒的事情,只提供了序列化和反序列化的功能。 Thrift支持多種協議格式. Thrift的代碼實現,有專門的TProtocol和TTransport抽象,相互配合,可以實現多種協議,方便集成各種傳輸方式。至少目前Thrift就能使用json作為序列化協議。 protobuf好像只安心一種協議,並下決心掘昌把這個格式做好。輸入輸出也是標準的stream. 認真的說也不完全這樣,protobuf為了調試方便,也提供了Text_Fromat功能,這個也算一個nonbinary格式支持,這樣看來完全新協議還是有可能的。 Thrift還提供了不少語言的C mole(性能啊,都是性能啊) protobuf全部pure language實現, 反正現在已經都5到10倍速度了,不在乎了….. thrift目前不支持Windows平台,至困塌少c++語言的runtime library和generated code是不不能在windows平台上使用的。(這真有點讓人難以接受啊,現代科技這么發達,還有怪獸boost,支持windows有這么難嗎?) protobuf沒有這個問題,提供了visual studio的項目文件,可以很順利的在windows平台下編譯。(題外話: 如果不知道googletest怎麼在windows平台上使用,可以參考protobuf的測試用例)。 The Thrift C++ runtime library does not currently work on Windows. This means that you』ll be able to compile ThriftIDL files to C++/Java/Python/etc., but you won』t be able to compile and run the generated C++ code under Windows. thrift wiki protobuf側重點是語言表達,同時在存儲效率上也下了不少功夫。用protobuf來直接讀寫數據結構相當的方便。 thrift側重點是構建誇語言的可伸縮的服務,特點就是支持的語言多,同時提供了完整的rpc service framework,可以很方便的直接構建服務,不需要做太多其他的工作。 數據類型相對固定的情況下,不論是thrift還是protobuf都會比直接處理xml要方便很多。不管是dom還是類sax,總沒有直接出數據結構訪問來的方便啊
㈧ 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鏈接,發送請求接收響應.