Essayez la communication en utilisant gRPC sur un serveur Android + Java

introduction

Dans cet article, j'ai décidé d'utiliser gRPC pour la communication entre le serveur et le client dans le projet sur lequel je travaille actuellement, et j'ai écrit que j'ai fait beaucoup de recherches tout en faisant un tutoriel pour implémenter gRPC sur Android. ..

Qu'est-ce que gRPC en premier lieu?

Qu'est-ce que gRPC? Comme mentionné dans l'aperçu, il s'agit d'un protocole de communication développé par Google. [Appel de procédure à distance](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) a été développé pour réaliser une technologie qui permet au serveur et au client de communiquer en appelant directement la méthode serveur, et vice versa. J'ai fait.

Dans l'API REST conventionnelle, les informations étaient principalement échangées avec Json, mais comme le serveur et le client implémentent séparément, le coût de mise en œuvre a augmenté.

Cependant, gRPC peut générer des implémentations de divers langages de programmation simplement en définissant les spécifications d'API dans le fichier .proto, ce qui conduit à une réduction des coûts d'implémentation sur le serveur et le client.

De plus, Protocol Buffers permet une communication plus rapide que REST. [^ 1] [^ 2]

Essayez le tutoriel immédiatement

environnement

Hello World

Tout d'abord, en regardant le Guide de démarrage rapide officiel, je vais essayer de déplacer l'application qui renvoie Hello 〇 〇 (chaîne de caractères d'entrée arbitraire).

Télécharger un échantillon

Téléchargez l'exemple de code depuis le référentiel Github avec git clone.

$ # 2017/12/22 Dernière version 1.8.Télécharger 0
$ git clone -b v1.8.0 https://github.com/grpc/grpc-java
$ #Déplacer vers le répertoire contenant l'exemple de code
$ cd grpc-java/examples

Exécutez l'application gRPC

Dans le répertoire grpc-java / examples, compilez le serveur en procédant comme suit:

$ ./gradlew installDist

Ensuite, laissez le serveur fonctionner.

$ ./build/install/examples/bin/hello-world-server

Connectez votre appareil Android en mode débogage et exécutez ce qui suit dans adb.

adb reverse tcp:8080 tcp:50051

Ouvrez un terminal différent de celui sur lequel vous avez exécuté le serveur, puis compilez et exécutez le client.

$ cd android/helloworld
$ ./gradlew installDebug

En cas de succès, l'application sera installée sur votre appareil et vous devriez voir un écran comme celui ci-dessous.

Screenshot_20171223-183811.png

Entrez localhost dans Host, 8080 dans Port (car il a été inversé en 50051 avec adb), entrez le caractère que vous souhaitez envoyer de manière appropriée dans le message (par exemple, world), et la réponse est renvoyée comme suit. Quand il s'agit, la communication avec le serveur est réussie!

Screenshot_20171223-184944.png

À propos du code

Cela a fonctionné pour le moment, mais quel est le contenu réel du code? Regardons maintenant le fichier .proto, le code serveur et le code client (Android).

helloworld.proto et code généré

//Définition de la méthode
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

//Définition de la structure des données de demande
message HelloRequest {
  string name = 1;
}

//Définition de la structure des données de réponse
message HelloReply {
  string message = 1;
}

Dans le fichier helloworld.proto, écrivez les spécifications de l'API comme décrit ci-dessus. Plus précisément, décrivez la méthode et la structure de données des données à utiliser.

Pour plus d'informations sur l'écriture, consultez le Guide linguistique (proto3) dans Protocol Buffers. Voir buffers / docs / proto3? Hl = ja).

La compilation de ce fichier helloworld.proto pour chaque langue générera une interface gRPC spécifique à la langue.

Code serveur

En ce qui concerne le côté serveur, il est écrit dans l'article J'ai essayé gRPC maintenant, donc je vais l'omettre ici.

Code client (Android)

Code généré à partir de helloworld.proto

Le code généré à partir de helloworld.proto est construit avec gradlew et placé à l'emplacement suivant dans le répertoire ʻapp / build / generated`:

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

Exemple de code d'implémentation

Le code implémenté sous forme d'exemple ressemble à ce qui suit. (Partiellement omis)

Au fait, comme OnClickListener n'est pas implémenté, je cherchais sans savoir comment appeler la méthode sendMessage, mais il semble qu'elle soit appelée à partir du layout xml.

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 {
                //Créer une chaîne
                mChannel = ManagedChannelBuilder.forAddress(mHost, mPort)
                    .usePlaintext(true)
                    .build();
                
                //Créer un stub
                GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(mChannel);

                //Créer une demande et spécifier la valeur
                HelloRequest message = HelloRequest.newBuilder().setName(mMessage).build();
                
                //Exécutez la méthode sayHello et recevez une réponse
                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);
        }
    }
}

Comme la communication doit être implémentée en tant que traitement asynchrone, nous créons une classe GrpcTask qui hérite d'AsyncTask.

En regardant à l'intérieur de la méthode doInBackground qui effectue un traitement asynchrone,

  1. Créer une chaîne
  2. Création d'un stub
  3. Créer une demande
  4. Exécuter

Vous pouvez voir qu'il est possible de réaliser le processus de communication et de retour de réponse simplement en spécifiant request comme argument de la méthode sayHello de la même manière que l'appel de la méthode de la classe. ..

À la fin

Lorsque j'ai touché gRPC pour la première fois cette fois, j'ai senti qu'il pouvait être implémenté beaucoup plus simplement que REST. J'étais très reconnaissant de pouvoir écrire intuitivement la partie communication sous forme de méthode.

Dans le futur, j'aimerais approfondir ma compréhension tout en l'implémentant dans le projet.

Informations de référence


Recommended Posts

Essayez la communication en utilisant gRPC sur un serveur Android + Java
Essayez d'utiliser Firebase Cloud Functions sur Android (Java)
Essayez la classification d'image à l'aide de TensorFlow Lite sur Android (JAVA)
Essayez la communication bidirectionnelle avec gRPC Java
Essayez d'utiliser le service sur Android Oreo
Filtre Sobel utilisant OpenCV sur Android (Java)
Essayez d'utiliser RocksDB avec Java
Essayez de gratter en utilisant Java [Note]
Utiliser la communication série sur Android
Essayez gRPC avec Java, Maven
[Java] Server Client Communication 1 (inachevée)
Essayez de lancer un serveur WebAP sur le micro à l'aide d'Helidon
Essayez Hello World en utilisant Java brut sur le conteneur Docker
OSX 10.15 (Catalina) Utilisation de Java avec β
Essayez d'implémenter Android Hilt en Java
Essayez Redmine sur le docker Mac
Essayez d'utiliser Redis avec Java (jar)
Enregistrer ArrayList à l'aide de GSON sur Android
[Java] Essayez de mettre en œuvre à l'aide de génériques
Essayez d'utiliser le traçage de méthode IBM Java
Remarques sur le traitement des threads Android (java)
Développer gRPC sur la série Windows + Java 7 + Maven 2
Essayez d'utiliser le SDK Java d'Hyperledger Iroha
[Java] Où avez-vous essayé d'utiliser java
Essayez d'utiliser le framework Java Nablarch [Application Web]
Essayez d'utiliser l'API Stream en Java
Utilisation de JupyterLab + Java avec WSL sous Windows 10
Appeler java depuis C ++ sur Android NDK
Kick ShellScript sur le serveur depuis Java
Remarques sur les opérateurs utilisant Java ~ Type chaîne ~
[Étude gratuite pour adultes] Communication acoustique avec Android
Étude de Java Essayez d'utiliser un scanner ou une carte
Essayez d'utiliser l'API au format JSON en Java
Essayez d'utiliser l'API REST de JobScheduler - implémentation Java RestClient--
Création d'applications Web Java sur Windows Server 2016
Essayez d'utiliser l'API Emotion d'Android
Essayez d'utiliser la télécommande Wii en Java
Essayez d'implémenter un serveur GraphQL en utilisant grahpql-java-tools (+ kotlin)
Créer un serveur d'applications Web (Java) sur VPS
[Android] [Java] Télécharger des images sur GCS (Google Cloud Storage) avec Stream à l'aide de Glide
Placez le projet Java à l'aide de la base de données sur le serveur créé dans VPS jusqu'à présent
Essayez d'utiliser la classe de test RestClient de JobScheduler REST-API-Java-
Essayez de créer un environnement Java 8 sur Amazon Linux2
Installez java et android-sdk sur Mac en utilisant homebrew
Essayez Azure Service Fabric (Java) sur un environnement Mac-Local
Les débutants essaient d'utiliser Android Studio Partie 2 (traitement des événements)
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Les débutants essaient d'utiliser Android Studio Partie 1 (Hello World)
Essayez une recherche similaire de recherche d'images à l'aide du SDK Java [Recherche]
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Histoire de l'automatisation des tests avec Appium [Android / java]
* Android * [HTTP communication_1] Essayez d'accéder à l'API Web [GET, POST]
Essayez d'utiliser libGDX
Essayez d'utiliser Maven