Bienvenue à monGitHub

https://github.com/zq2599/blog_demos

Contenu:Tous les articles originaux et les sources d'appui,ParticipationJava、Docker、Kubernetes、DevOPSAttendez.;

《javaÉditiongRPCSur le terrain》Série complète de liens

  1. AvecprotoGénérer le Code
  2. Publication et invocation des services
  3. Flux côté Service
  4. Flux client
  5. Flux bidirectionnel
  6. Le client obtient dynamiquement l'adresse du serveur
  7. Basé sureurekaRésultats de l'enregistrement pour

À propos degRPC Quatre types définis

Cet article est《javaÉditiongRPCSur le terrain》Le troisième titre de la série, Ce que nous avons vu plus haut, c'est que c'est simple. RPCDemandes et réponses, Cette simple façon de répondre à une demande est simplement gRPC Un des quatre types définis ,Voici《gRPC Version chinoise des documents officiels》 Pour ces quatre gRPC Description du type :

  1. Simple. RPC: Le client utilise le talon (stub) Envoyer la demande au serveur et attendre que la réponse revienne , Comme les appels de fonctions habituels ;
  2. Streaming côté serveur RPC: Le client envoie la requête au serveur , Obtenez un flux pour lire la séquence de message retournée . Le client lit le flux retourné , Jusqu'à ce qu'il n'y ait plus de nouvelles ;( C'est - à - dire le contenu de cet article )
  3. Streaming client RPC: Le client écrit une séquence de messages et l'envoie au serveur , Aussi en utilisant Stream .Une fois Le client termine l'écriture du message , Il attend que le serveur finisse de lire la réponse qui lui est retournée ;
  4. Flux bidirectionnel RPC: Est que les deux parties utilisent le flux lecture - écriture pour envoyer une séquence de messages . Les deux flux fonctionnent indépendamment , Donc le client et le serveur Peut lire et écrire dans n'importe quel ordre que vous préférez :Par exemple,, Le serveur peut attendre de recevoir tous les messages du client avant d'écrire une réponse , Ou alternativement Lire et écrire des messages pour , Ou une autre combinaison de lecture et d'écriture . L'ordre des messages dans chaque flux est réservé ;

Aperçu du présent article

Cet article est un type de flux côté service gRPC Service en direct ,Inclure ce qui suit::

  1. Développer ungRPCServices, Le type est le flux côté serveur ;
  2. Développer un client , Appelez la publication précédente gRPCServices;
  3. Validation;
  • Pas grand - chose à dire, Commencez par le Code ;

Téléchargement du code source

  • Le code source complet de cet article est disponible àGitHubTélécharger à,Les adresses et les liens sont indiqués dans le tableau ci - dessous(https://github.com/zq2599/blog_demos):
Nom Liens Remarques
Page d'accueil du projet https://github.com/zq2599/blog_demos Le projetGitHubPage d'accueil sur
gitAdresse de l'entrepôt(https) https://github.com/zq2599/blog_demos.git Adresse de l'entrepôt du code source du projet,httpsAccord
gitAdresse de l'entrepôt(ssh) git@github.com:zq2599/blog_demos.git Adresse de l'entrepôt du code source du projet,sshAccord
  • C'estgitIl y a plus d'un dossier dans le projet,《javaÉditiongRPCSur le terrain》Le code source de la série estgrpc-tutorialsSous le dossier,Comme le montre la boîte rouge ci - dessous:

  • grpc-tutorialsIl y a plusieurs répertoires sous le dossier, Le Code du serveur correspondant à cet article est server-stream-server-sideSous la table des matières, Le code client est server-stream-client-sideSous la table des matières,Comme le montre la figure ci - dessous::

Développer ungRPCServices, Le type est le flux côté serveur

  • La première chose à développer estgRPCServeur, Voici sept choses à faire :

  • Ouvre.grpc-libModule,Insrc/main/protoNouveau fichier dans le Répertoiremall.proto, Il y en a un à l'intérieur gRPCMéthodesListOrders Et son entrée dans l'objet de retour ,Il se lit comme suit:, Notez que la valeur de retour est par mot - clé streamModification, Indique que le type d'interface est un flux côté serveur :
syntax = "proto3";
option java_multiple_files = true;
// GénérerjavaCodepackage
option java_package = "com.bolingcavalry.grpctutorials.lib";
// Nom de la classe
option java_outer_classname = "MallProto"; // gRPCServices, Il s'agit d'un service de recherche de commandes pour un centre commercial en ligne
service OrderQuery {
// Streaming côté serveur: Interface de liste de commandes , La participation est l'information de l'acheteur , Retour à la liste des commandes (Avecstream Modifier la valeur de retour )
rpc ListOrders (Buyer) returns (stream Order) {}
} // AcheteurID
message Buyer {
int32 buyerId = 1;
} // Structure des données renvoyant les résultats
message Order {
// OrdreID
int32 orderId = 1;
// Produits de baseID
int32 productId = 2;
// Heure de la transaction
int64 orderTime = 3;
// Commentaires de l'acheteur
string buyerRemark = 4;
}
  • Double - cliquez sur la case rouge ci - dessous generateProto,SelonprotoGénérerjavaCode:

  • Nouvelle générationjavaLe Code est indiqué dans la boîte rouge ci - dessous.:

  • Dans le projet parentgrpc-turtorialsNouveau nom ci - dessousserver-stream-server-sideModule,Lebuild.gradleIl se lit comme suit::
// UtiliserspringbootPlug - in
plugins {
id 'org.springframework.boot'
} dependencies {
implementation 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter'
// En tant quegRPCFournisseur de services,Besoin d'utiliser cette bibliothèque
implementation 'net.devh:grpc-server-spring-boot-starter'
// Un projet qui dépend de la génération automatique du code source
implementation project(':grpc-lib')
}
  • Nouveau profilapplication.yml:
spring:
application:
name: server-stream-server-side
# gRPCConfiguration relative,Il suffit de configurer le numéro de port de service
grpc:
server:
port: 9899
  • Classe de démarrage:
package com.bolingcavalry.grpctutorials;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class ServerStreamServerSideApplication {
public static void main(String[] args) {
SpringApplication.run(ServerStreamServerSideApplication.class, args);
}
}
  • Ensuite, le plus important gRPCServices,Les codes sont les suivants:,VisibleresponseObserver.onNext La méthode a été appelée plusieurs fois , Pour continuer à exporter des données vers le client ,EnfinresponseObserver.onCompleted Sortie finale :
package com.bolingcavalry.grpctutorials;
import com.bolingcavalry.grpctutorials.lib.Buyer;
import com.bolingcavalry.grpctutorials.lib.Order;
import com.bolingcavalry.grpctutorials.lib.OrderQueryGrpc;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;
import java.util.ArrayList;
import java.util.List; @GrpcService
public class GrpcServerService extends OrderQueryGrpc.OrderQueryImplBase { /**
* mock Un lot de données
* @return
*/
private static List<Order> mockOrders(){
List<Order> list = new ArrayList<>();
Order.Builder builder = Order.newBuilder(); for (int i = 0; i < 10; i++) {
list.add(builder
.setOrderId(i)
.setProductId(1000+i)
.setOrderTime(System.currentTimeMillis()/1000)
.setBuyerRemark(("remark-" + i))
.build());
} return list;
} @Override
public void listOrders(Buyer request, StreamObserver<Order> responseObserver) {
// Sortie continue vers client
for (Order order : mockOrders()) {
responseObserver.onNext(order);
}
// Sortie finale
responseObserver.onCompleted();
}
}
  • Jusqu'ici., Développement du serveur terminé , Développons un autre springboot Application en tant que client , Voir comment appeler à distance listOrdersInterface,Je l'ai.responseObserver.onNext Données de sortie de la méthode ;

Développer un client , Appelez la publication précédente gRPCServices

  • La fonction de base du module client est de fournir webInterface, Le serveur sera appelé à l'intérieur listOrdersInterface, Renvoie les données obtenues au Front End ,Comme le montre la figure ci - dessous::

  • Dans le projet parentgrpc-turtorialsNouveau nom ci - dessousserver-stream-client-sideModule,Lebuild.gradleIl se lit comme suit::
plugins {
id 'org.springframework.boot'
} dependencies {
implementation 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'net.devh:grpc-client-spring-boot-starter'
implementation project(':grpc-lib')
}
  • Appliquer les informations de configuration application.ymlIl se lit comme suit:, Visible est le port et gRPC Configuration de l'adresse du serveur :
server:
port: 8081
spring:
application:
name: server-stream-client-side grpc:
client:
# gRPCNom configuré,GrpcClientLes notes seront utilisées
server-stream-server-side:
# gRPCAdresse du serveur
address: 'static://127.0.0.1:9899'
enableKeepAlive: true
keepAliveWithoutCalls: true
negotiationType: plaintext
  • Côté serveurlistOrdersInterface retournéeOrder Il y a beaucoup de gRPCContenu pertinent, Ne convient pas comme web Valeur de retour de l'interface , Alors définissez un DispOrderClasse commeweb Valeur de retour de l'interface :
package com.bolingcavalry.grpctutorials;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable; @Data
@AllArgsConstructor
public class DispOrder {
private int orderId;
private int productId;
private String orderTime;
private String buyerRemark;
}
  • Une classe de démarrage banale :
package com.bolingcavalry.grpctutorials;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class ServerStreamClientSideApplication { public static void main(String[] args) {
SpringApplication.run(ServerStreamClientSideApplication.class, args);
}
}
  • Voilà le point.,GrpcClientService.java, Il montre comment appeler à distance gRPCServiceslistOrdersInterface, .Voir l'interface pour le type de flux côté serveur , Le client passe par stub L'appel aura IteratorValeur de retour du type, La prochaine chose à faire est de traverser Iterator:
package com.bolingcavalry.grpctutorials;
import com.bolingcavalry.grpctutorials.lib.Buyer;
import com.bolingcavalry.grpctutorials.lib.Order;
import com.bolingcavalry.grpctutorials.lib.OrderQueryGrpc;
import io.grpc.StatusRuntimeException;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; @Service
@Slf4j
public class GrpcClientService { @GrpcClient("server-stream-server-side")
private OrderQueryGrpc.OrderQueryBlockingStub orderQueryBlockingStub; public List<DispOrder> listOrders(final String name) {
// gRPCParamètres de demande pour
Buyer buyer = Buyer.newBuilder().setBuyerId(101).build(); // gRPCRéponse de
Iterator<Order> orderIterator; // Valeur de retour de la méthode courante
List<DispOrder> orders = new ArrayList<>(); // Adoptionstub Lancer distant gRPCDemande
try {
orderIterator = orderQueryBlockingStub.listOrders(buyer);
} catch (final StatusRuntimeException e) {
log.error("error grpc invoke", e);
return new ArrayList<>();
} DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); log.info("start put order to list");
while (orderIterator.hasNext()) {
Order order = orderIterator.next(); orders.add(new DispOrder(order.getOrderId(),
order.getProductId(),
// UtiliserDateTimeFormatterConvertir l'horodatage en chaîne
dtf.format(LocalDateTime.ofEpochSecond(order.getOrderTime(), 0, ZoneOffset.of("+8"))),
order.getBuyerRemark()));
log.info("");
} log.info("end put order to list"); return orders;
}
}
  • Pour finir controllerCatégorie, Fournir un webInterface,Ça va appelerGrpcClientServiceMéthode:
package com.bolingcavalry.grpctutorials;
import com.bolingcavalry.grpctutorials.lib.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; @RestController
public class GrpcClientController { @Autowired
private GrpcClientService grpcClientService; @RequestMapping("/")
public List<DispOrder> printMessage(@RequestParam(defaultValue = "will") String name) {
return grpcClientService.listOrders(name);
}
}
  • Jusqu'ici.,Codage terminé,Début de la validation

Validation

  1. Démarrageserver-stream-server-side, Une fois lancé avec succès, il écoute 9989Port:

  1. Démarrageserver-stream-client-side, Plus d'accès dans le navigateur :http://localhost:8081/?name=Tom ,Les résultats sont les suivants(firefoxFormatage automatiquejsonDonnées), Visible a réussi à obtenir gRPC Données distantes de :

Jusqu'ici., Type de flux côté serveur gRPC Le développement et l'utilisation de l'interface sont terminés , Dans les chapitres suivants, vous continuerez à apprendre les deux autres types de ;

Tu n'es pas seule.,Xinchen original tout au long du chemin

  1. JavaSérie
  2. SpringSérie
  3. DockerSérie
  4. kubernetesSérie
  5. Base de données+Série Middleware
  6. DevOpsSérie

Bienvenue au public:Programmeur xinchen

Recherche Wechat「Programmeur xinchen」,Je suis xinchen.,J'ai hâte de voyager avec vousJavaLe monde...

https://github.com/zq2599/blog_demos

javaÉditiongRPCCombat 3: Plus d'articles sur le service Stream

  1. Go gRPCTutoriels-Streaming côté serveurRPC(Trois)

    Préface L'article précédent a introduit le modèle simple RPC, Lorsque les données sont volumineuses ou doivent être transmises en continu , On devrait utiliser le streaming RPC, Il nous permet de transmettre des données tout en traitant . Cet article présente d'abord le streaming côté serveur RPC. Streaming côté serveurRPC: Le client envoie la requête au serveur , Prends un ...

  2. Java RéalisationRedisClient,Serveur

    Java RéalisationRedisClient,Serveur 1.JavaRéalisationRedisPublier un abonnement 1.1Exemple 2.[Redis]JavaRéalisationredisAbonnement aux messages/Publication(PubSub) 3.javaRéalisation redisAbonnement à la publication pour ...

  3. JAVAAdoptionhttp Accès à d'autres serveurs API

    Le projet doit réaliser une telle fonctionnalité , L'utilisateur clique sur le bouton ,AdoptionaxiosPour visiterpythonDeAPI(Algorithmes,java Pas facile à faire ) Obtenez un résultat stocké dans la base de données et retourné à la page . MaispythonPas ici.tomcatÇa marche., Alors, non ...

  4. JavaProgrammation réseau(TCPAccord- Interaction serveur - client )

    Client: package WebProgramingDemo; import java.io.IOException; import java.io.InputStream; import java. ...

  5. javaRéalisationxml-rpcClient et serveur

    Code client: package test_xmlrpc.test; import java.net.URL;import java.util.ArrayList;import java.util.Lis ...

  6. javaClasse d'outils(Un.)ServeurjavaRéaliser à partir de Baidu selon l'adresseAPIObtenir la latitude et la longitude

    ServeurjavaRéaliser à partir de Baidu selon l'adresseAPIObtenir la latitude et la longitude Code: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...

  7. JavaAdoptionURL Deweb Le serveur obtient des données

    1.Java AdoptionHttpURLConnection PostMode de présentationjson, Et de retour du serveur jsonDonnées package Demo.Test; import java.io.ByteArrayOut ...

  8. AvecJavaRéalisationHTTP Multipart Le serveur et le client de

    Aujourd'hui, une brève introduction sur la façon d'utiliser JavaSoutienHTTP MultipartDerequestEtresponse. Le Code de l'ensemble du projet peut être trouvé à https://github.com/mcai4gl2/multiTélécharger. Ici ...

  9. java Principe du client et du serveur de programmation réseau et utilisation de URLAnalyseHTTPAccord

    Clients et serveurs communs Client: Navigateur:IE Serveur: Serveur:webServeur(Tomcat),Serveur de stockage,Serveur de base de données. (Note::On va utiliserTomactServeur,Inwebapps Vous trouverez ci - dessous un répertoire créé par vous - même myweb ...

  10. JavaPoint de connaissance avancé5: La pierre angulaire de la haute concurrence côté serveur - NIOAvecReactorMode etAIOAvecProactorMode

    Un..Contexte Pour améliorer le traitement simultané du serveur , Il y a généralement deux grandes directions à penser . 1. Niveau de l'architecture du système .Comme l'équilibrage de la charge.Cache Multi - niveaux. Déploiement modulaire, etc . 2. Niveau d'optimisation à un seul noeud . .Comme réparer les performances au niveau du Code Bug.JVMRéglage des paramètres.IOOptimisation, etc ...

Recommandation aléatoire

  1. intel vt-x Comment faire avec désactivé

    1. Regardez d'abord votre bios Y a - t - il cette option dans l'option , Si ce n'est pas le cas, mettez à jour , Pas encore après la mise à jour ,Non pris en charge 2.Trouverintel Virtualization Technology Changer l'état enEnabled   Et trouver int ...

  2. Huang cong:Mysql Conseils de sauvegarde pour la restauration de la base de données MySQL server has gone away La solution à( Les données du fichier de sauvegarde sont trop grandes )

    Utilisermysql Lors de la restauration de la base de données , Parce que certaines données sont énormes , Une telle erreur peut se produire :The MySQL Server returned this Error:MySQL Error Nr. MySQL server ...

  3. Android(java)Notes d'étude65:Cycle de vie du fil

    1. Nous apprenons l'essence du thread est d'apprendre à démarrer et à terminer le thread . Voici un diagramme du cycle de vie du fil , N'oubliez pas : Nouveau statut:Lorsque le programme est utilisénew Mot - clé après avoir créé un thread , Le thread est dans un nouvel état . Pour le moment et d'autres Java Même objet , C'est seulement ...

  4. Elasticsearch .Net Client NEST Exemple de requête Multi - critères

    Elasticsearch .Net Client NEST Exemple de requête Multi - critères /// <summary> /// Exemple de recherche multi - critères /// </summary> public c ...

  5. message [Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property

    springmvc Chaîne de réception ,BackgroundDateChamp type. Échec de la rotation forcée du temps Valeur numérique:18Année12Mois31Jour 15:43:21 Solutions, Annoter le champ temps @DateTimeFormat(pattern = " ...

  6. Ambertools15Installation(Détails)

    Ce blog est dédié à Ambertools15Méthode d'installation de,Bien queAmbertools16 La version est déjà sortie , Mais il n'y a aucune différence dans la façon dont ils sont installés . Préférence relative Ambertools15 Principalement en termes de capacité (230M ...

  7. Tourne.:InstallationChromeÇa n'a pas marché., Le Code d'affichage est “0xa0430721”La solution

    De:https://www.douban.com/note/475994923/ Step1: Open your Application Data Folder. For Windows XP: ...

  8. InVisual Studio 2012Utilisé dansXNA 4.0

    XNA 4.0 La valeur par défaut est d'installer le modèle de projet à VS2010Dans, Ne peut pas être installé automatiquement sur VS2012, Il faut donc faire quelque chose pour que VS2012Peut également être utilisé dansXNA 4.0Modèle. 1.TéléchargerXNA 4.0 Télécharger l'adresse:http:// ...

  9. maven3Commandes courantes、javaConstruction du projet、webConstruction du projet

    ------------------------------maven3Commandes courantes--------------------------- 1.Commandes courantes 1)Créer unProject mvn archety ...

  10. kafka Installation de Clusters et utilisation simple

    À propos dekafka Quel est le principe ,Voirkafka Présentation des documents officiels :http://kafka.apache.org/documentation/#introduction , Les élèves qui ont un mauvais anglais peuvent regarder ici http: ...