In diesem Artikel habe ich beschlossen, gRPC für die Kommunikation zwischen dem Server und dem Client in dem Projekt zu verwenden, an dem ich gerade arbeite, und ich habe geschrieben, dass ich viel recherchiert habe, während ich ein Tutorial zur Implementierung von gRPC auf Android durchgeführt habe. ..
Was ist gRPC? Wie in der Übersicht erwähnt, handelt es sich um ein von Google entwickeltes Kommunikationsprotokoll. [Remoteprozeduraufruf](https://ja.wikipedia.org/wiki/%E9%81%A0%E9%9A%94%E6%89%8B%E7%B6%9A%E3%81%8D%E5 % 91% BC% E5% 87% BA% E3% 81% 97) wurde entwickelt, um eine Technologie zu realisieren, mit der Server und Client durch direkten Aufruf der Servermethode kommunizieren können und umgekehrt. Ich tat.
In der herkömmlichen REST-API wurden Informationen hauptsächlich mit Json ausgetauscht. Da jedoch Server und Client getrennt implementiert werden, sind die Implementierungskosten gestiegen.
GRPC kann jedoch Implementierungen verschiedener Programmiersprachen generieren, indem einfach API-Spezifikationen in der ".proto" -Datei definiert werden, was zu einer Reduzierung der Implementierungskosten sowohl auf dem Server als auch auf dem Client führt.
Darüber hinaus ermöglicht Protokollpuffer eine schnellere Kommunikation als REST. [^ 1] [^ 2]
Hello World
Während ich mir die Offizielle Kurzanleitung anschaue, werde ich zunächst versuchen, die Anwendung zu verschieben, die Hello 〇 〇 (beliebige Eingabezeichenfolge) zurückgibt.
Laden Sie den Beispielcode mit git clone
aus dem Github-Repository herunter.
$ # 2017/12/22 Neueste Version 1.8.Laden Sie 0 herunter
$ git clone -b v1.8.0 https://github.com/grpc/grpc-java
$ #Wechseln Sie in das Verzeichnis mit dem Beispielcode
$ cd grpc-java/examples
Kompilieren Sie den Server im Verzeichnis grpc-java / examples
wie folgt:
$ ./gradlew installDist
Dann lassen Sie den Server laufen.
$ ./build/install/examples/bin/hello-world-server
Schließen Sie Ihr Android-Gerät im Debug-Modus an und führen Sie Folgendes in adb aus.
adb reverse tcp:8080 tcp:50051
Öffnen Sie ein anderes Terminal als das, auf dem Sie den Server ausgeführt haben, und kompilieren Sie den Client und führen Sie ihn aus.
$ cd android/helloworld
$ ./gradlew installDebug
Bei Erfolg wird die App auf Ihrem Gerät installiert und Sie sollten einen Bildschirm wie den folgenden sehen.
Geben Sie "localhost" in Host und "8080" in Port ein (da es mit adb auf 50051 umgekehrt wurde), geben Sie das Zeichen ein, das Sie in der Nachricht entsprechend senden möchten (z. B. "world"), und die Antwort wird wie folgt zurückgegeben. Wenn es darum geht, ist die Kommunikation mit dem Server erfolgreich!
Es hat vorerst funktioniert, aber was ist der eigentliche Inhalt des Codes? Schauen wir uns nun die .proto-Datei, den Servercode und den Client-Code (Android) an.
helloworld.proto
und generierter Code//Methodendefinition
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
//Definition der Anforderungsdatenstruktur
message HelloRequest {
string name = 1;
}
//Definition der Antwortdatenstruktur
message HelloReply {
string message = 1;
}
Schreiben Sie in die Datei helloworld.proto
die API-Spezifikationen wie oben beschrieben.
Beschreiben Sie insbesondere die Methode und die Datenstruktur der zu verwendenden Daten.
Ausführliche Informationen zum Schreiben finden Sie unter Sprachhandbuch (proto3) unter Protokollpuffer. Siehe Puffer / docs / proto3? Hl = ja).
Durch das Kompilieren dieser Datei "helloworld.proto" für jede Sprache wird eine sprachspezifische gRPC-Schnittstelle generiert.
In Bezug auf die Serverseite ist es in dem Artikel Ich habe gRPC jetzt ausprobiert geschrieben, daher werde ich es hier weglassen.
helloworld.proto
Der aus helloworld.proto
generierte Code wird mit gradlew
erstellt und an der folgenden Stelle im Verzeichnis app / build / generate
abgelegt:
Der als Beispiel implementierte Code sieht wie folgt aus. (Teilweise weggelassen)
Übrigens, da OnClickListener nicht implementiert ist, habe ich mich umgesehen, ohne zu wissen, wie man die sendMessage-Methode aufruft, aber es scheint, dass sie von der Layout-XML aufgerufen wird.
HelloworldActivity.java
public class HelloworldActivity extends AppCompatActivity {
...
public void sendMessage(View view) {
new GrpcTask().execute();
}
private class GrpcTask extends AsyncTask<Void, Void, String> {
private String mHost;
private String mMessage;
private int mPort;
private ManagedChannel mChannel;
@Override
protected void onPreExecute() {
mHost = mHostEdit.getText().toString();
mMessage = mMessageEdit.getText().toString();
String portStr = mPortEdit.getText().toString();
mPort = TextUtils.isEmpty(portStr) ? 0 : Integer.valueOf(portStr);
mResultText.setText("");
}
@Override
protected String doInBackground(Void... nothing) {
try {
//Kanal erstellen
mChannel = ManagedChannelBuilder.forAddress(mHost, mPort)
.usePlaintext(true)
.build();
//Stub erstellen
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(mChannel);
//Anforderung erstellen und Wert angeben
HelloRequest message = HelloRequest.newBuilder().setName(mMessage).build();
//Führen Sie die sayHello-Methode aus und erhalten Sie eine Antwort
HelloReply reply = stub.sayHello(message);
return reply.getMessage();
} catch (Exception e) {
...
}
}
@Override
protected void onPostExecute(String result) {
try {
mChannel.shutdown().awaitTermination(1, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
mResultText.setText(result);
}
}
}
Da die Kommunikation als asynchrone Verarbeitung implementiert werden muss, erstellen wir eine GrpcTask-Klasse, die AsyncTask erbt.
Ein Blick in die doInBackground-Methode, die asynchrone Verarbeitung ausführt,
Sie können sehen, dass es möglich ist, den Prozess der Kommunikation und Rückgabe von Antworten zu realisieren, indem Sie die Anforderung als Argument für die sayHello-Methode angeben, genauso wie Sie die Methode der Klasse aufrufen. ..
Als ich diesmal gRPC zum ersten Mal berührte, hatte ich das Gefühl, dass es viel einfacher als REST implementiert werden könnte. Ich war sehr dankbar, dass ich den Kommunikationsteil intuitiv in Form einer Methode schreiben konnte.
In Zukunft möchte ich mein Verständnis vertiefen, während ich es im Projekt umsetze.
Recommended Posts