ホームページ バックエンド開発 PHPチュートリアル Thrift の Java と PHP データのやり取り

Thrift の Java と PHP データのやり取り

Jun 23, 2016 pm 01:29 PM

Thrift は、スケーラブルな言語間サービスを開発するために使用されるソフトウェア フレームワーク (リモート プロシージャ コール フレームワーク) であり、データ送信形式 (バイナリ、json) とネットワーク通信のサービス フレームワークをカプセル化し、多言語 (C++、Web) を提供します。 Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml のサーバーおよびクライアント プログラム コンポーネント

大規模なデータ交換およびストレージ ツールの構築に適しています。内部向け大規模システムでのデータ送信では、パフォーマンスと送信サイズの点で JSON や XML よりも明らかな利点があります。

この記事では、チュートリアルとして登録サービス インターフェイスとログイン サーバー インターフェイスを使用します。

Thrift によって開発されたいくつかの概念:

サーバー サービス モデル

ハンドラー データ処理インターフェイス

プロセッサ データ処理オブジェクト

プロトコル データ送信プロトコル

トランスポートデータ 送信方法


(1) サポートされる送信形式

TCompactProtocol ? 圧縮形式

TSimpleJSONProtocol ?書き込み専用プロトコル、生成されたファイルは簡単にスクリプト化されます言語解析。

TDebugProtocol ? デバッグを容易にするために、理解しやすく読みやすいテキスト形式を使用します

(2) サポートされる通信方式 (データ送信メソッド) (Transport)

TFileTransport: クライアントが許可するファイル (ログ) 送信クラスto ファイルがサーバーに渡され、サーバーは受信したデータをファイルに書き込むことができます。

THttpTransport: データ送信に Http 送信プロトコルを使用します

TSocket: データ送信に TCP Socket を使用します

TZlibTransport: データを圧縮して送信、または受信したデータを解凍します

主に次のカテゴリが対象です 上記のクラスは装飾されています(デコレーションモード使用)伝送効率を向上させます。

TBufferedTransport: Transport オブジェクトによって操作されるデータをバッファリングします。つまり、送信のためにバッファーからデータを読み取るか、データをバッファーに直接書き込みます。

TFramesTransport: フレーム単位で送信し、ノンブロッキング サービスで使用されます。 TBufferedTransport と同様に、関連データもバッファリングされます。同時に、固定長データの送受信もサポートされます。

TMemoryBuffer: バッファーからのデータの読み取りと書き込み

(3) サポートされているサービス モデル

TSimpleServer ? テストによく使用されるシンプルなシングルスレッド サービス モデル


TThreadedServer - マルチスレッド サービス モデル、ブロッキング IO を使用、リクエストごとに 1 つのスレッドが作成されます。

TThreadPoolServer? スレッド プール サービス モデルは、標準のブロッキング IO を使用して、リクエストを処理するために事前にスレッドのグループを作成します。

TNonblockingServer ? ノンブロッキング IO を使用するマルチスレッド サービス モデル (TframedTransport データ送信メソッドが必要)

大量の更新を処理する必要がある場合は、主に TThreadedServer と TOnblockingServer のどちらかを選択します。 TNonblockingServer は少数のスレッドを使用して多数の同時接続を処理できますが、待ち時間は TThreadedServer の方が低くなります。実際には、TThreadedServer のスループットは TOnblockingServer のスループットよりも高い場合がありますが、TThreadedServer の CPU 使用率は TOnblockingServer のスループットよりもはるかに高くなります。

サーバー側の書き込みの一般的な手順:

1. ハンドラーを作成する

2. ハンドラーに基づいてプロセッサを作成する

3. プロトコル メソッドを作成する (送信形式を設定する)

5. プロセッサー、トランスポート、およびプロトコルに基づいてサーバー

を作成します。トランスポートとプロトコルはクライアントを作成します

4. クライアントを実行する方法

上記の要約内容は以下から参照されています

正式なコードチュートリアルは以下から始まります

サービス記述ファイルtest.thriftはログインサービスと登録を定義します

/** * The first thing to know about are types. The available types in Thrift are: * *  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 * * Did you also notice that Thrift supports C style comments? */namespace java com.penngonamespace php com.penngostruct User {	1: i64 id,	2: string name,	3: string password}service LoginService{    User login(1:string name, 2:string psw);} service RegisterService{    User createUser(1:string name, 2:string psw);}
ログイン後にコピー

thrift を使用して、対応するプラットフォーム言語コードを生成します

thrift -gen java test.thrift

thrift -gen php test.thrift

php がサーバー側を生成する必要がある場合、要件は thrift -gen php:server test に変更されます.thrift

java

LoginServiceImpl.java ログイン インターフェイス ビジネスの実装

import org.apache.thrift.TException;public class LoginServiceImpl implements LoginService.Iface{	public LoginServiceImpl(){	}	public User login(String name, String psw) throws TException{		User user = null;		if(name.equals("penngo") && psw.equals("123")){			user = new User();			user.setId(1);			user.setName("penngo");		}		return user;	}}
ログイン後にコピー

RegisterServiceImpl.java 登録インターフェイス ビジネスの実装

import org.apache.thrift.TException;public class RegisterServiceImpl implements RegisterService.Iface{	public RegisterServiceImpl(){	}	public User createUser(String name, String psw) throws TException{		User user = new User();		user.setId(2);		user.setName(name);		user.setPassword(psw);		return user;	}}
ログイン後にコピー

サーバー側 Java コード

package com.penngo.main;import org.apache.thrift.TMultiplexedProcessor;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TThreadPoolServer;import org.apache.thrift.transport.TServerSocket;import org.apache.thrift.transport.TTransportException;import com.penngo.LoginService;import com.penngo.LoginServiceImpl;import com.penngo.RegisterService;import com.penngo.RegisterServiceImpl;public class Server {	private void start() {		try {			TServerSocket serverTransport = new TServerSocket(7911);			// 用户登录			LoginService.Processor loginProcessor = new LoginService.Processor(					new LoginServiceImpl());			// 用户注册			RegisterService.Processor registerProcessor = new RegisterService.Processor(					new RegisterServiceImpl());			// Factory protFactory = new TBinaryProtocol.Factory(true, true);			// TServer server = new TThreadPoolServer(new			// TThreadPoolServer.Args(serverTransport)			// .processor(loginProcessor));			TMultiplexedProcessor processor = new TMultiplexedProcessor();			processor.registerProcessor("LoginService", loginProcessor);			processor.registerProcessor("RegisterService", registerProcessor);			TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(					serverTransport).processor(processor));			System.out.println("Starting server on port 7911 ...");			server.serve();		} catch (TTransportException e) {			e.printStackTrace();		} catch (Exception e) {			e.printStackTrace();		}	}	public static void main(String args[]) {		Server srv = new Server();		srv.start();	}}
ログイン後にコピー

クライアント サイド java

package com.penngo.main;import org.apache.thrift.*;import org.apache.thrift.protocol.*;import org.apache.thrift.transport.*;import com.penngo.LoginService;import com.penngo.RegisterService;import com.penngo.User;public class Client {	public static void main(String[] args) {		try {			TTransport transport = new TSocket("localhost", 7911);			TProtocol protocol = new TBinaryProtocol(transport);			TMultiplexedProtocol mp1 = new TMultiplexedProtocol(protocol,					"LoginService");			// TProtocol protocol = new TBinaryProtocol(transport);			// LoginService.Client client = new LoginService.Client(protocol);			LoginService.Client loginClient = new LoginService.Client(mp1);			TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol,					"RegisterService");			RegisterService.Client registerClient = new RegisterService.Client(					mp2);			transport.open();			User user = loginClient.login("penngo", "123");			if (user != null) {				System.out.println("登录成功:" + user.getId() + " "						+ user.getName());			} else {				System.out.println("登录失败");			}			User user2 = registerClient.createUser("test", "123");			if (user2 != null) {				System.out.println("创建用户成功:" + user2.getId() + " "						+ user2.getName());			} else {				System.out.println("创建用户失败");			}			transport.close();		} catch (TException x) {			x.printStackTrace();		}	}}
ログイン後にコピー
-side php

rreee

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles