Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server

Einführung

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 überhaupt?

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]

Probieren Sie das Tutorial sofort aus

Umgebung

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.

Beispiel herunterladen

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

Führen Sie die gRPC-Anwendung aus

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.

Screenshot_20171223-183811.png

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!

Screenshot_20171223-184944.png

Über den Code

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.

Servercode

In Bezug auf die Serverseite ist es in dem Artikel Ich habe gRPC jetzt ausprobiert geschrieben, daher werde ich es hier weglassen.

Client (Android) Code

Code generiert aus helloworld.proto

Der aus helloworld.proto generierte Code wird mit gradlew erstellt und an der folgenden Stelle im Verzeichnis app / build / generate abgelegt:

generated/source/proto/debug(/grpc/io.grpc.examples.helloworld & /javalite/io.grpc.examples.helloworld)

Beispiel für einen Implementierungscode

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,

  1. Kanal erstellen
  2. Erstellen eines Stubs
  3. Anfrage erstellen
  4. Führen Sie aus

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. ..

Am Ende

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.

Referenzinformationen


Recommended Posts

Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
Versuchen Sie, Firebase Cloud-Funktionen unter Android (Java) zu verwenden.
Versuchen Sie die Bildklassifizierung mit TensorFlow Lite unter Android (JAVA).
Versuchen Sie die bidirektionale Kommunikation mit gRPC Java
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Sobel-Filter mit OpenCV unter Android (Java)
Versuchen Sie es mit RocksDB mit Java
Versuchen Sie, mit Java zu kratzen [Hinweis]
Verwenden Sie die serielle Kommunikation unter Android
Versuchen Sie gRPC mit Java, Maven
[Java] Server Client Communication 1 (unvollendet)
Versuchen Sie, mit Helidon einen WebAP-Server auf dem Mikro zu starten
Versuchen Sie Hello World mit einfachem Java im Docker-Container
OSX 10.15 (Catalina) Verwenden von Java mit β
Versuchen Sie, Android Hilt in Java zu implementieren
Probieren Sie Redmine auf dem Mac Docker aus
Versuchen Sie es mit Redis mit Java (jar)
Speichern Sie ArrayList mit GSON unter Android
[Java] Versuchen Sie, mithilfe von Generika zu implementieren
Versuchen Sie es mit der IBM Java-Methodenverfolgung
Entwickeln Sie gRPC unter Windows + Java 7 + Maven 2
Versuchen Sie es mit dem Java SDK von Hyperledger Iroha
[Java] Wo haben Sie versucht, Java zu verwenden?
Versuchen Sie es mit dem Java Framework Nablarch [Web Application]
Versuchen Sie es mit der Stream-API in Java
Verwenden von JupyterLab + Java mit WSL unter Windows 10
Rufen Sie Java von C ++ auf Android NDK auf
Kick ShellScript auf dem Server von Java
Hinweise zu Operatoren, die Java ~ String type ~ verwenden
[Kostenlose Studie für Erwachsene] Akustische Kommunikation mit Android
Java lernen Versuchen Sie es mit einem Scanner oder einer Karte
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie es mit der REST-API von JobScheduler - Java RestClient-Implementierung -
Erstellen von Java-Webanwendungen unter Windows Server 2016
Versuchen Sie es mit der Emotion API von Android
Versuchen Sie es mit der Wii-Fernbedienung in Java
Versuchen Sie, einen GraphQL-Server mit grahpql-java-tools (+ kotlin) zu implementieren.
Erstellen Sie einen Webanwendungsserver (Java) auf VPS
[Android] [Java] Laden Sie Bilder auf GCS (Google Cloud Storage) mit Stream mit Glide herunter
Platzieren Sie das Java-Projekt mithilfe der Datenbank auf dem bisher in VPS erstellten Server
Versuchen Sie es mit der RestClient Test-Klasse der REST-API-Java von JobScheduler.
Versuchen Sie, eine Java 8-Umgebung unter Amazon Linux2 zu erstellen
Installieren Sie Java und Android-SDK auf dem Mac mit Homebrew
Probieren Sie Azure Service Fabric (Java) in einer Mac-Local-Umgebung aus
Anfänger versuchen Android Studio Teil 2 (Ereignisverarbeitung)
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Anfänger versuchen Android Studio Teil 1 (Hello World)
Versuchen Sie eine ähnliche Suche in der Bildsuche mit dem Java SDK [Suche]
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Geschichte der Testautomatisierung mit Appium [Android / Java]
* Android * [HTTP-Kommunikation_1] Versuchen Sie, die Web-API [GET, POST] zu aktivieren.
Versuchen Sie es mit libGDX
Versuchen Sie es mit Maven