1、用thrift 或 gRPC 之類的框架做 app 和伺服器的通信合適嗎
完全可以的。
thrift是Facebook開源出來的項目,現在交給了Apache來管理。thrift是用來針對不同語言系統內之間數據容調用的。thrift支持c,c++,Erlang,java,python,ruby,php等語言。thrift允許定義一個簡單的定義文件中的數據類型和服務介面,這個文件就是IDL(Interface Definition Language),以作為輸入文件,編譯器生成代碼。簡單的說就是thrift定義了統一的文件(對象或者結構體,服務介面),使用thrift的編譯器能夠生成對應語言的代碼文件。thrft之所以是跨語言的原意就是他通過語言無關的自定義語言來生成語言相關的代碼。
2、請教hbase 的thrift 伺服器端無故退出的問題
看那個錯誤,是regionserver掛了,不是thrift的問題
thrift應該是不會經常宕掉的。
3、java怎麼連接thrift伺服器
package net.johnc.thrift;
import org.apache.thrift.TException;
public class TestImpl implements Test.Iface {
public void ping(int length) throws TException {
System.out.println("calling ping ,length=" + length);
}
}
4、有使用Thrift開發Service服務的嗎,有什麼要注意的
按使用方式分類:
類別 區別
startService 啟動的服務 主要用於啟動一個服務執行後台任務,不進行通信。停止服務使用stopService
bindService 啟動的服務 該方法啟動的服務要進行通信。停止服務使用unbindService
startService 同時也 bindService 啟動的服務 停止服務應同時使用stepService與unbindService
以上面三種方式啟動的服務其生命周期也有區別,將在隨後給出。
2、Service 與 Thread 的區別
很多時候,你可能會問,為什麼要用 Service,而不用 Thread 呢,因為用 Thread 是很方便的,比起 Service
也方便多了,下面我詳細的來解釋一下。
1). Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。可以用 Thread 來執行一些非同步的操作。
2). Service:Service 是android的一種機制,當它運行的時候如果是Local Service,那麼對應的 Service
是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote
Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上。因此請不要把 Service
理解成線程,它跟線程半毛錢的關系都沒有!
既然這樣,那麼我們為什麼要用 Service 呢?其實這跟 android 的系統機制有關,我們先拿 Thread 來說。Thread 的運行是獨立於
Activity 的,也就是說當一個 Activity 被 finish 之後,如果你沒有主動停止 Thread 或者 Thread 里的 run
方法沒有執行完畢的話,Thread 也會一直執行。因此這里會出現一個問題:當 Activity 被 finish 之後,你不再持有該 Thread
的引用。另一方面,你沒有辦法在不同的 Activity 中對同一 Thread 進行控制。
舉個例子:如果你的 Thread 需要不停地隔一段時間就要連接伺服器做某種同步的話,該 Thread 需要在 Activity
沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 裡面控制之前創建的
Thread。因此你便需要創建並啟動一個 Service ,在 Service 裡面創建、運行並控制該 Thread,這樣便解決了該問題(因為任何
Activity 都可以控制同一 Service,而系統也只會創建一個對應 Service 的實例)。
因此你可以把 Service 想像成一種消息服務,而你可以在任何有 Context 的地方調用
Context.startService、Context.stopService、
Context.bindService,Context.unbindService,來控制它,你也可以在 Service 里注冊
BroadcastReceiver,在其他地方通過發送 broadcast 來控制它,當然這些都是 Thread 做不到的。
3、Service的生命周期1). 被啟動的服務的生命周期:如果一個Service被某個Activity 調用 Context.startService
方法啟動,那麼不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都
在後台運行。如果一個Service被startService
方法多次啟動,那麼onCreate方法只會調用一次,onStart將會被調用多次(對應調用startService的次數),並且系統只會創建
Service的一個實例(因此你應該知道只需要一次stopService調用)。該Service將會一直在後台運行,而不管對應程序的
Activity是否在運行,直到被調用stopService,或自身的stopSelf方法。當然如果系統資源不足,android系統也可能結束服 務。
2). 被綁定的服務的生命周期:如果一個Service被某個Activity 調用 Context.bindService 方法綁定啟動,不管調用
bindService 調用幾次,onCreate方法都只會調用一次,同時onStart方法始終不會被調用。當連接建立之後,Service將會一直運行,除非調用
Context.unbindService 斷開連接或者之前調用bindService 的 Context
不存在了(如Activity被finish的時候),系統將會自動停止Service,對應onDestroy將被調用。
3).
被啟動又被綁定的服務的生命周期:如果一個Service又被啟動又被綁定,則該Service將會一直在後台運行。並且不管如何調用,onCreate
始終只會調用一次,對應startService調用多少次,Service的onStart便會調用多少次。調用unbindService將不會停止
Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。
4). 當服務被停止時清除服務:當一個Service被終止(1、調用stopService;2、調用stopSelf;3、不再有綁定的連接(沒有被啟
動))時,onDestroy方法將會被調用,在這里你應當做一些清除工作,如停止在Service中創建並運行的線程。
特別注意:
1、你應當知道在調用 bindService 綁定到Service的時候,你就應當保證在某處調用 unbindService 解除綁定(盡管
Activity 被 finish 的時候綁定會自動解除,並且Service會自動停止);
2、你應當注意 使用 startService 啟動服務之後,一定要使用
stopService停止服務,不管你是否使用bindService;
3、同時使用 startService 與 bindService 要注意到,Service
的終止,需要unbindService與stopService同時調用,才能終止 Service,不管 startService 與 bindService
的調用順序,如果先調用 unbindService 此時服務不會自動終止,再調用 stopService 之後服務才會停止,如果先調用 stopService
此時服務也不會終止,而再調用 unbindService 或者 之前調用 bindService 的 Context 不存在了(如Activity 被
finish 的時候)之後服務才會自動停止;
4、當在旋轉手機屏幕的時候,當手機屏幕在逗橫地逗豎地變換時,此時如果你的 Activity 如果會自動旋轉的話,旋轉其實是 Activity
的重新創建,因此旋轉之前的使用 bindService 建立的連接便會斷開(Context 不存在了),對應服務的生命周期與上述相同。
5、在 sdk 2.0 及其以後的版本中,對應的 onStart 已經被否決變為了 onStartCommand,不過之前的 onStart
任然有效。這意味著,如果你開發的應用程序用的 sdk 為 2.0 及其以後的版本,那麼你應當使用 onStartCommand 而不是 onStart。
4、startService 啟動服務
想要用 startService 啟動服務,不管Local 還是 Remote 我們需要做的工作都是一樣簡單。當然要記得在
Androidmanifest.xml 中注冊 service。
根據上面的生命周期,我們便會給出 Service 中的代碼框架:
package com.newcj.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class LocalService1 extends Service {
/**
* onBind 是 Service 的虛方法,因此我們不得不實現它。
* 返回 null,表示客服端不能建立到此服務的連接。
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
對應生命周期系統回調函數上面已經說明,在對應地方加上適當的代碼即可。下面是啟動與停止 Service 的代碼:
// 啟動一個 Activity
startActivity(new Intent(this, LocalService1.class));
...
// 停止一個 Activity
stopService(new Intent(this, LocalService1.class));
對應的 Intent 為標志服務類的 Intent。
5、Local 與 Remote 服務綁定
同樣記得在 Androidmanifest.xml 中注冊 service
1). Local 服務綁定:Local 服務的綁定較簡單,首先在 Service 中我們需要實現 Service 的抽象方法
onBind,並返回一個實現 IBinder 介面的對象。
5、thrift server 運行2天後,內存暴增,請問可能原因
三台伺服器,抄每個regionserver的請求都有襲上千?將thrift的最大線程數再調大,thrift的內存調大看看,ulimit參數調大hbase-env.shexportHBASE_THRIFT_OPTS="-Xmx1g-Xms1g-Xmn512m"這里設的是1g,可以根據情況調大
6、什麼是Thrift
thrift是一抄個軟體框架,用來進行可擴襲展且跨語言的服務的開發。它結合了功能強大的軟體堆棧和代碼生成引擎,以構建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。
thrift最初由facebook開發用做系統內各語言之間的RPC通信 。
2007年由facebook貢獻到apache基金 ,08年5月進入apache孵化器 。
支持多種語言之間的RPC方式的通信:php語言client可以構造一個對象,調用相應的服務方法來調用java語言的服務 ,跨越語言的C/S RPC調用 。
thrift允許定義一個簡單的定義文件中的數據類型和服務介面,以作為輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和伺服器通信的無縫跨編程語言。
7、thrift server 英語怎麼說
thrift server
節儉伺服器
server
英 [ˈsɜ:və(r)] 美 [ˈsɜ:rvə(r)]
n.
伺服器 ;侍者;上菜用具;發球者
復數: servers
雙語例句
Now the client and server can communicate securely using SSL.
現在客戶端和伺服器可內以使用SSL進行通信了容。
8、thrift中眾多博客教程中說的伺服器端和客戶端分別指的是什麼?客戶端比如我是java語言,是java代碼嗎?
客戶端是客戶下載之後用的,比如QQ,伺服器端就是後台支持的地方,像WEB項目都是事版情在伺服器權端運作的,客戶端的就是代碼一般在客戶下載的客戶端里運行伺服器那邊就是資料庫支持,伺服器端的程序(web)就是代碼程序都在伺服器上運行客戶負載小
9、有會thrift的嗎
thrift中的數據類型
下面是thrift本身對類型的重定義,看一下:
bool Boolean, one byte
byte Signed byte
i16 Signed 16-bit integer
i32 Signed 32-bit integer
i64 Signed 64-bit integer
double 64-bit floating point value
string String
binary Blob (byte array)
map<t1,t2> Map from one type to another
list<t1> Ordered list of one type
set<t1> Set of unique elements of one type
通過上面的說明,我們可以看出,thrift裡面有的是各種語言公有的類型,而一些個別語言中才出現的東西,如dictionary,hash等並沒有在thrift中出現,這是正常的,對於一種公用語言來說,它不應該包括那些特殊的東西,而它可以為那些特殊的東西建立一個自己的標准,讓自己去適應它們,如thrift里的map<t1,t2>類型相當於CSharp里的Dictionary<t1,t2>字典類型,這些在生成目標語言之後,都可以進行驗證。
thrift中沒有類,但有結構體
我想,這應該是對C語言的一種照顧,在thrift中沒有出現class(類)的概念,而有值類型struct,實事上,對於結構的認識我們一直都有偏見,讓為某些高級語言里有了類,就不應該有結構了,還說自己的代碼中從來沒有出現過結構。在這里,我需要對這位同學說,你的代碼里之所以沒有結構,完成是因為你對這種數據類型的不理解,不深入引起的,對於業務簡單,或者沒有業務的對象來說,為了將屬性進行封裝,完成可以使用結構來實現,看看C語言你就知道結構有多重要了,呵呵。
枚舉:
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
結構(結構體)
struct DataSync{
1:bool IsSync,/*是否要同步*/
2:string FilePath,/*文件路徑*/
3:i64 CurrentSeek,/*當前針*/
}
異常
exception InvalidOperation {
1: i32 what,
2: string why
}
服務,我們的介面定義在服務中,介面是客戶端與伺服器端通訊的基礎,客戶端使用自己語言的介面與伺服器端通訊,客戶端與伺服器端的平台,開發環境可以完全不同,只要知識服務端的IP和埠即可實現通訊,這就是across language的thrift的魅力!
service FileTransport{
bool Upload(1:DataSegment dataSegment),/*客戶端傳入一個byte數組,伺服器返回是否上傳成功,desPath表示上傳後存儲的路徑*/
binary Download(1:string fileUrl),/*客戶端傳入一個URL,伺服器返回這個URL指向的文件,並為byte數組的形式返回*/
DataSync IsSync(1:string fileName),/*檢測文件是否需要進行同步上傳*/
bool UpdateDataSync(1:DataSync dataSync)/*從資料庫中更新數據同步狀態,主鍵為文件完整名稱*/
}
當我們運行thrift命令去生成目標代碼後,在指定的gen文件夾中生成,例如生成csharp的代碼,它會在thrift同級目錄中建立一個gen-csharp文件夾,然後代碼生成會以結構,枚舉,服務為單位去生成多個文件。如圖: