摘要:簡(jiǎn)介是一個(gè)軟件框架用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎以構(gòu)建在這些編程語言間無縫結(jié)合的高效的服務(wù)官網(wǎng)地址安裝的安裝比較簡(jiǎn)單在下可以直接使用快速安裝或可以通過官網(wǎng)下載這里就不再多說了當(dāng)下載安裝完畢后我們就
簡(jiǎn)介
thrift是一個(gè)軟件框架, 用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā). 它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎, 以構(gòu)建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結(jié)合的、高效的服務(wù).
官網(wǎng)地址: thrift.apache.org
Thrift 的安裝比較簡(jiǎn)單, 在 Mac 下可以直接使用 brew 快速安裝.
brew install thrift
Window 或 Linux 可以通過官網(wǎng) 下載, 這里就不再多說了.
當(dāng)下載安裝完畢后, 我們就會(huì)得到一個(gè)名為 thrift (Window 下是 thrift.exe) 的工具, 通過它就可以生成各個(gè)語言的 thrift 代碼.
基礎(chǔ) 數(shù)據(jù)類型Thrift 腳本可定義的數(shù)據(jù)類型包括以下幾種類型:
基本類型bool: 布爾值, true 或 false, 對(duì)應(yīng) Java 的 boolean
byte: 8 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 byte
i16: 16 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 short
i32: 32 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 int
i64: 64 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 long
double: 64 位浮點(diǎn)數(shù), 對(duì)應(yīng) Java 的 double
string: 未知編碼文本或二進(jìn)制字符串, 對(duì)應(yīng) Java 的 String
struct 類型定義公共的對(duì)象, 類似于 C 語言中的結(jié)構(gòu)體定義, 在 Java 中是一個(gè) JavaBean
union 類型和 C/C++ 中的 union 類似.
容器類型:list: 對(duì)應(yīng) Java 的 ArrayList
set: 對(duì)應(yīng) Java 的 HashSet
map: 對(duì)應(yīng) Java 的 HashMap
exception 類型對(duì)應(yīng) Java 的 Exception
service 類型對(duì)應(yīng)服務(wù)的類.
service 類型可以被繼承, 例如:
service PeopleDirectory { oneway void log(1: string message), void reloadDatabase() } service EmployeeDirectory extends PeopleDirectory { Employee findEmployee(1: i32employee_id) throws (1: MyError error), bool createEmployee(1: Employee new_employee) }
注意到, 在定義 PeopleDirectory 服務(wù)的 log 方法時(shí), 我們使用到了 oneway 關(guān)鍵字, 這個(gè)關(guān)鍵字的作用是告訴 thrift, 我們不關(guān)心函數(shù)的返回值, 不需要等待函數(shù)執(zhí)行完畢就可以直接返回.
oneway 關(guān)鍵字通常用于修飾無返回值(void)的函數(shù), 但是它和直接的無返回值的函數(shù)還是有區(qū)別的, 例如上面的 log 函數(shù)和 reloadDatabase 函數(shù), 當(dāng)客戶端通過 thrift 進(jìn)行遠(yuǎn)程調(diào)用服務(wù)端的 log 函數(shù)時(shí), 不需要等待服務(wù)端的 log 函數(shù)執(zhí)行結(jié)束就可以直接返回; 但是當(dāng)客戶端調(diào)用 reloadDatabase 方法時(shí), 雖然這個(gè)方法也是無返回值的, 但客戶端必須要阻塞等待, 直到服務(wù)端通知客戶端此調(diào)用已結(jié)束后, 客戶端的遠(yuǎn)程調(diào)用才可以返回.
和 Java 中的 enum 類型一樣, 例如:
enum Fruit { Apple, Banana, }例子
下面是一個(gè)在 IDL 文件中使用各種類型的例子:
enum ResponseStatus { OK = 0, ERROR = 1, } struct ListResponse { 1: required ResponseStatus status, 2: optional list關(guān)于 IDL 文件ids, 3: optional list scores, 10: optional string strategy, 11: optional string globalId, 12: optional map extraInfo, } service Hello { string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() }
所謂 IDL, 即 接口描述語言, 在使用 thrift 前, 需要提供一個(gè) .thrift 后綴的文件, 其內(nèi)容是使用 IDL 描述的服務(wù)接口信息.
例如如下的一個(gè)接口描述:
namespace java com.xys.thrift service HelloWorldService { string sayHello(string name); }
這里我們定義了一個(gè)名為 HelloWorldService 的接口, 它有一個(gè)方法, 即 sayHello. 當(dāng)通過 thrift --gen java test.thrift 來生成 thrift 接口服務(wù)時(shí), 會(huì)產(chǎn)生一個(gè) HelloWorldService.java 的文件, 在此文件中會(huì)定義一個(gè) HelloWorldService.Iface 接口, 我們?cè)诜?wù)器端實(shí)現(xiàn)此接口即可.
服務(wù)器端編碼基本步驟實(shí)現(xiàn)服務(wù)處理接口 impl
創(chuàng)建 Processor
創(chuàng)建 Transport
創(chuàng)建 Protocol
創(chuàng)建 Server
啟動(dòng) Server
例如:
public class HelloServer { public static final int SERVER_PORT = 8080; public static void main(String[] args) throws Exception { HelloServer server = new HelloServer(); server.startServer(); } public void startServer() throws Exception { // 創(chuàng)建 TProcessor TProcessor tprocessor = new HelloWorldService.Processor客戶端編碼基本步驟(new HelloWorldImpl()); // 創(chuàng)建 TServerTransport, TServerSocket 繼承于 TServerTransport TServerSocket serverTransport = new TServerSocket(SERVER_PORT); // 創(chuàng)建 TProtocol TProtocolFactory protocolFactory = new TBinaryProtocol.Factory(); TServer.Args tArgs = new TServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(protocolFactory); // 創(chuàng)建 TServer TServer server = new TSimpleServer(tArgs); // 啟動(dòng) Server server.serve(); } }
創(chuàng)建 Transport
創(chuàng)建 Protocol
基于 Potocol 創(chuàng)建 Client
打開 Transport
調(diào)用服務(wù)相應(yīng)的方法.
public class HelloClient { public static final String SERVER_IP = "localhost"; public static final int SERVER_PORT = 8080; public static final int TIMEOUT = 30000; public static void main(String[] args) throws Exception { HelloClient client = new HelloClient(); client.startClient("XYS"); } public void startClient(String userName) throws Exception { // 創(chuàng)建 TTransport TTransport transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT); // 創(chuàng)建 TProtocol TProtocol protocol = new TBinaryProtocol(transport); // 創(chuàng)建客戶端. HelloWorldService.Client client = new HelloWorldService.Client(protocol); // 打開 TTransport transport.open(); // 調(diào)用服務(wù)方法 String result = client.sayHello(userName); System.out.println("Result: " + result); transport.close(); } }Thrift 的網(wǎng)絡(luò)棧
如上圖所示, thrift 的網(wǎng)絡(luò)棧包含了 transport 層, protocol 層, processor 層和 Server/Client 層.
Transport 層Transport 層提供了從網(wǎng)絡(luò)中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入網(wǎng)絡(luò)的抽象.
Transport 層和 Protocol 層相互獨(dú)立, 我們可以根據(jù)自己需要選擇不同的 Transport 層, 而對(duì)上層的邏輯不造成任何影響.
Thrift 的 Java 實(shí)現(xiàn)中, 我們使用接口 TTransport 來描述傳輸層對(duì)象, 這個(gè)接口提供的常用方法有:
open close read write flush
而在服務(wù)器端, 我們通常會(huì)使用 TServerTransport 來監(jiān)聽客戶端的請(qǐng)求, 并生成相對(duì)應(yīng)的 Transport 對(duì)象, 這個(gè)接口提供的常用方法有:
open listen accept close
為了使用上的方便, Thrift 提供了如下幾個(gè)常用 Transport:
TSocket: 這個(gè) transport 使用阻塞 socket 來收發(fā)數(shù)據(jù).
TFramedTransport: 以幀的形式發(fā)送數(shù)據(jù), 每幀前面是一個(gè)長(zhǎng)度. 當(dāng)服務(wù)方使用 non-blocking IO 時(shí)(即服務(wù)器端使用的是 TNonblockingServerSocket), 那么就必須使用 TFramedTransport.
TMemoryTransport: 使用內(nèi)存 I/O. Java 實(shí)現(xiàn)中在內(nèi)部使用了 ByteArrayOutputStream
TZlibTransport: 使用 Zlib 壓縮傳輸?shù)臄?shù)據(jù). 在 Java 中未實(shí)現(xiàn).
Protocol 層(數(shù)據(jù)傳輸協(xié)議層)這一層的作用是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為可通過 Transport 傳輸?shù)臄?shù)據(jù)流或者反操作, 即我們所謂的 序列化 和 反序列化.
常用的協(xié)議有:
TBinaryProtocol, 二進(jìn)制格式
TCompactProtocol, 壓縮格式
TJSONProtocol, JSON 格式
TSimpleJSONProtocol, 提供 JSON 只寫協(xié)議, 生成的文件很容易通過腳本語言解析.
TDebugProtocoal, 使用人類可讀的 Text 格式, 幫助調(diào)試
注意, 客戶端和服務(wù)器的協(xié)議要一樣.
Processor 層Processor 層對(duì)象由 Thrift 根據(jù)用戶的 IDL 文件所生成, 我們通常不能隨意指定.
這一層主要有兩個(gè)功能:
從 Protocol 層讀取數(shù)據(jù), 然后轉(zhuǎn)交給對(duì)應(yīng)的 handler 處理
將 handler 處理的結(jié)構(gòu)發(fā)送 Prootcol 層.
Server 層Thrift 提供的 Server 層實(shí)現(xiàn)有:
TNonblockingServer: 這個(gè)是一個(gè)基于多線程, 非阻塞 IO 的 Server 層實(shí)現(xiàn), 它專門用于處理大量的并發(fā)請(qǐng)求的
THsHaServer: 辦同步/半異步服務(wù)器模型, 基于 TNonblockingServer 實(shí)現(xiàn).
TThreadPoolServer: 基于多線程, 阻塞 IO 的 Server 層實(shí)現(xiàn), 它所消耗的系統(tǒng)資源比 TNonblockingServer 高, 不過可以提供更高的吞吐量.
TSimpleServer: 這個(gè)實(shí)現(xiàn)主要是用于測(cè)試目的. 它只有一個(gè)線程, 并且是阻塞 IO, 因此在同一時(shí)間只能處理一個(gè)連接.
使用例子下面的例子在我的 Github 上有源碼, 直接 clone 即可.
依賴org.apache.thrift libthrift 0.10.0
thrift 版本: 0.10.0
注意, jar 包的版本需要和 thrift 版本一致, 不然可能會(huì)有一些編譯錯(cuò)誤
test.thrift
namespace java com.xys.thrift service HelloWorldService { string sayHello(string name); }編譯
cd src/main/resources/ thrift --gen java test.thrift mv gen-java/com/xys/thrift/HelloWorldService.java ../java/com/xys/thrift
當(dāng)執(zhí)行 thrift --gen java test.thrift 命令后, 會(huì)在當(dāng)前目錄下生成一個(gè) gen-java 目錄, 其中會(huì)以包路徑格式存放著生成的服務(wù)器端 thrift 代碼, 我們將其拷貝到工程對(duì)應(yīng)的目錄下即可.
服務(wù)實(shí)現(xiàn)public class HelloWorldImpl implements HelloWorldService.Iface { public HelloWorldImpl() { } @Override public String sayHello(String name) throws TException { return "Hello, " + name; } }服務(wù)端/客戶端實(shí)現(xiàn)
下面我們分別根據(jù)服務(wù)器端的幾種不同類型, 來分別實(shí)現(xiàn)它們, 并對(duì)比這些模型的異同點(diǎn).
TSimpleServer 服務(wù)器模型TSimpleServer 是一個(gè)簡(jiǎn)單的服務(wù)器端模型, 它只有一個(gè)線程, 并且使用的是阻塞 IO 模型, 因此一般用于測(cè)試環(huán)境中.
public class SimpleHelloServer { public static final int SERVER_PORT = 8080; public static void main(String[] args) throws Exception { SimpleHelloServer server = new SimpleHelloServer(); server.startServer(); } public void startServer() throws Exception { TProcessor tprocessor = new HelloWorldService.Processor( new HelloWorldImpl()); TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TSimpleServer.Args tArgs = new TSimpleServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TSimpleServer(tArgs); server.serve(); } }
我們?cè)诜?wù)器端的代碼中, 沒有顯示地指定 Transport 的類型, 這個(gè)是因?yàn)?TSimpleServer.Args 在構(gòu)造時(shí), 會(huì)指定一個(gè)默認(rèn)的 TransportFactory, 當(dāng)有新的客戶端連接時(shí), 就會(huì)生成一個(gè) TSocket 的 Transport 實(shí)例. 由于這一點(diǎn), 我們?cè)诳蛻舳藢?shí)現(xiàn)時(shí), 也就需要指定客戶端的 Transport 為 TSocket 才行.
public class SimpleHelloClient { public static final String SERVER_IP = "localhost"; public static final int SERVER_PORT = 8080; public static final int TIMEOUT = 30000; public void startClient(String userName) throws Exception { TTransport transport = null; transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT); // 協(xié)議要和服務(wù)端一致 TProtocol protocol = new TBinaryProtocol(transport); HelloWorldService.Client client = new HelloWorldService.Client( protocol); transport.open(); String result = client.sayHello(userName); System.out.println("Result: " + result); transport.close(); } public static void main(String[] args) throws Exception { SimpleHelloClient client = new SimpleHelloClient(); client.startClient("XYS"); } }TThreadPoolServer 服務(wù)器模型
TThreadPoolServer 是一個(gè)基于線程池和傳統(tǒng)的阻塞 IO 模型實(shí)現(xiàn), 每個(gè)線程對(duì)應(yīng)著一個(gè)連接.
public class ThreadPoolHelloServer { public static final int SERVER_PORT = 8080; public static void main(String[] args) throws Exception { ThreadPoolHelloServer server = new ThreadPoolHelloServer(); server.startServer(); } public void startServer() throws Exception { TProcessor tprocessor = new HelloWorldService.Processor( new HelloWorldImpl()); TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TThreadPoolServer(tArgs); server.serve(); } }
TThreadPoolServer 的服務(wù)器端實(shí)現(xiàn)和 TSimpleServer 的沒有很大區(qū)別, 只不過是在對(duì)應(yīng)的地方把 TSimpleServer 改為 TThreadPoolServer 即可.
同樣地, 我們?cè)?TThreadPoolServer 服務(wù)器端的代碼中, 和 TSimpleServer 一樣, 沒有顯示地指定 Transport 的類型, 這里的原因和 TSimpleServer 的一樣, 就不再贅述了.
代碼實(shí)現(xiàn)和 SimpleHelloClient 一樣.
TNonblockingServer 服務(wù)器模型TNonblockingServer 是基于線程池的, 并且使用了 Java 提供的 NIO 機(jī)制實(shí)現(xiàn)非阻塞 IO, 這個(gè)模型可以并發(fā)處理大量的客戶端連接.
注意, 當(dāng)使用 TNonblockingServer 模型是, 服務(wù)器端和客戶端的 Transport 層需要指定為 TFramedTransport 或 TFastFramedTransport.
public class NonblockingHelloServer { public static final int SERVER_PORT = 8080; public static void main(String[] args) throws Exception { NonblockingHelloServer server = new NonblockingHelloServer(); server.startServer(); } public void startServer() throws Exception { TProcessor tprocessor = new HelloWorldService.Processor( new HelloWorldImpl()); TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); TNonblockingServer.Args tArgs = new TNonblockingServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); // 下面這個(gè)設(shè)置 TransportFactory 的語句可以去掉 tArgs.transportFactory(new TFramedTransport.Factory()); TServer server = new TNonblockingServer(tArgs); server.serve(); } }
前面我們提到, 在 TThreadPoolServer 和 TSimpleServer 的服務(wù)器端代碼實(shí)現(xiàn)中, 我們并沒有顯示地為服務(wù)器端設(shè)置 Transport, 因?yàn)?TSimpleServer.Args 和 TThreadPoolServer.Args 設(shè)置了默認(rèn)的 TransportFactory, 其最終生成的 Transport 是一個(gè) TSocket 實(shí)例.
那么在 TNonblockingServer 中又會(huì)是怎樣的情況呢?
通過查看代碼我們可以發(fā)現(xiàn), TNonblockingServer.Args 構(gòu)造時(shí), 會(huì)調(diào)用父類 AbstractNonblockingServerArgs 的構(gòu)造器, 其源碼如下:
public AbstractNonblockingServerArgs(TNonblockingServerTransport transport) { super(transport); this.transportFactory(new TFramedTransport.Factory()); }
可以看到, TNonblockingServer.Args 也會(huì)設(shè)置一個(gè)默認(rèn)的 TransportFactory, 它的類型是 TFramedTransport#Factory, 因此最終 TNonblockingServer 所使用的 Transport 其實(shí)是 TFramedTransport 類型的, 這也就是為什么客戶端也必須使用 TFramedTransport(或TFastFramedTransport) 類型的 Transport 的原因了.
分析到這里, 回過頭來看代碼實(shí)現(xiàn), 我們就發(fā)現(xiàn)其實(shí)代碼中 tArgs.transportFactory(new TFramedTransport.Factory()) 這一句是多余的, 不過為了強(qiáng)調(diào)一下, 我還是保留了.
public class NonblockingHelloClient { public static final String SERVER_IP = "localhost"; public static final int SERVER_PORT = 8080; public static final int TIMEOUT = 30000; public void startClient(String userName) throws Exception { TTransport transport = null; // 客戶端使用 TFastFramedTransport 也是可以的. transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT)); // 協(xié)議要和服務(wù)端一致 TProtocol protocol = new TBinaryProtocol(transport); HelloWorldService.Client client = new HelloWorldService.Client( protocol); transport.open(); String result = client.sayHello(userName); System.out.println("Result: " + result); transport.close(); } public static void main(String[] args) throws Exception { NonblockingHelloClient client = new NonblockingHelloClient(); client.startClient("XYS"); } }
在 TNonblockingServer 服務(wù)器模型下, 除了使痛不式的客戶端調(diào)用方式, 我們還可以在客戶端中使用異步調(diào)用的方式, 具體代碼如下:
public class NonblockingAsyncHelloClient { public static final String SERVER_IP = "localhost"; public static final int SERVER_PORT = 8080; public static final int TIMEOUT = 30000; public void startClient(String userName) throws Exception { TAsyncClientManager clientManager = new TAsyncClientManager(); TNonblockingTransport transport = new TNonblockingSocket(SERVER_IP, SERVER_PORT, TIMEOUT); // 協(xié)議要和服務(wù)端一致 TProtocolFactory protocolFactory = new TBinaryProtocol.Factory(); HelloWorldService.AsyncClient client = new HelloWorldService.AsyncClient( protocolFactory, clientManager, transport); client.sayHello(userName, new AsyncHandler()); Thread.sleep(500); } class AsyncHandler implements AsyncMethodCallback{ @Override public void onComplete(String response) { System.out.println("Got result: " + response); } @Override public void onError(Exception exception) { System.out.println("Got error: " + exception.getMessage()); } } public static void main(String[] args) throws Exception { NonblockingAsyncHelloClient client = new NonblockingAsyncHelloClient(); client.startClient("XYS"); } }
可以看到, 使用異步的客戶端調(diào)用方式實(shí)現(xiàn)起來就比較復(fù)雜了. 和 NonblockingHelloClient 對(duì)比, 我們可以看到有幾點(diǎn)不同:
異步客戶端中需要定義一個(gè) TAsyncClientManager 實(shí)例, 而同步客戶端模式下不需要.
異步客戶端 Transport 層使用的是 TNonblockingSocket, 而同步客戶端使用的是 TFramedTransport
異步客戶端的 Procotol 層對(duì)象需要使用 TProtocolFactory 來生成, 而同步客戶端需要用戶手動(dòng)生成.
異步客戶端的 Client 是 HelloWorldService.AsyncClient, 而同步客戶的 Client 是 HelloWorldService.Client
最后也是最關(guān)鍵的不同點(diǎn), 異步客戶端需要提供一個(gè)異步處理 Handler, 用于處理服務(wù)器的回復(fù).
我們?cè)賮砜匆幌?AsyncHandler 這個(gè)類. 這個(gè)類是用于異步回調(diào)用的, 當(dāng)我們正常收到了服務(wù)器的回應(yīng)后, Thrift 就會(huì)自動(dòng)回調(diào)我們的 onComplete 方法, 因此我們?cè)谶@里就可以設(shè)置我們的后續(xù)處理邏輯.
當(dāng) Thrift 遠(yuǎn)程調(diào)用服務(wù)器端出現(xiàn)異常時(shí)(例如服務(wù)器未啟動(dòng)), 那么就會(huì)回調(diào)到 onError 方法, 我們?cè)谶@個(gè)方法中就可以做相應(yīng)的錯(cuò)誤處理.
即 Half-Sync/Half-Async, 半同步/半異步服務(wù)器模型, 底層的實(shí)現(xiàn)其實(shí)還是依賴于 TNonblockingServer, 因此它所需要的 Transport 也是 TFramedTransport.
public class HsHaHelloServer { public static final int SERVER_PORT = 8080; public static void main(String[] args) throws Exception { HsHaHelloServer server = new HsHaHelloServer(); server.startServer(); } public void startServer() throws Exception { TProcessor tprocessor = new HelloWorldService.Processor( new HelloWorldImpl()); TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); THsHaServer.Args tArgs = new THsHaServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new THsHaServer(tArgs); server.serve(); } }
和 NonblockingHelloClient 一致.
參考Learning-Apache-Thrift
Thrift入門及Java實(shí)例演示
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66763.html
摘要:具體可以參考消息隊(duì)列之具體可以參考實(shí)戰(zhàn)之快速入門十分鐘入門阿里中間件團(tuán)隊(duì)博客是一個(gè)分布式的可分區(qū)的可復(fù)制的基于發(fā)布訂閱的消息系統(tǒng)主要用于大數(shù)據(jù)領(lǐng)域當(dāng)然在分布式系統(tǒng)中也有應(yīng)用。目前市面上流行的消息隊(duì)列就是阿里借鑒的原理用開發(fā)而得。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問題,目前已經(jīng)開源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snail...
摘要:使用入門目前項(xiàng)目使用來作為服務(wù)之間調(diào)用的底層框架,組內(nèi)人員說可以嘗試使用替換他,性能更出色,且使用更方便。所以找了一些資料,為做一個(gè)入門??蛻舳丝蛻舳艘虢涌?,使用生成代理,來訪問遠(yuǎn)程服務(wù)對(duì)象。 thrift使用入門 目前項(xiàng)目使用hessian來作為服務(wù)之間RPC調(diào)用的底層框架,組內(nèi)人員說可以嘗試使用thrift替換他,thrift性能更出色,且使用更方便。所以找了一些資料,為thri...
摘要:簡(jiǎn)介是什么是一個(gè)軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。的功能允許定義一個(gè)簡(jiǎn)單的定義文件中的數(shù)據(jù)類型和服務(wù)接口,以作為輸入文件,編譯器生成代碼用來方便地生成客戶端和服務(wù)器通信的無縫跨編程語言。 Thrift 簡(jiǎn)介 Thrift 是什么 Thrift是一個(gè)軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Go,P...
閱讀 1707·2021-10-09 09:44
閱讀 3268·2021-09-27 13:36
閱讀 1527·2021-09-22 15:33
閱讀 1281·2021-09-22 15:23
閱讀 1168·2021-09-06 15:02
閱讀 1705·2019-08-29 16:14
閱讀 2913·2019-08-29 15:26
閱讀 2414·2019-08-28 18:08