Java version of gppc Reality Three: server side stream

Programmeur xinchen 2021-09-15 10:06:19
java version gppc reality server


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 degRPCQuatre 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 simplementgRPCUn des quatre types définis,Voici《gRPC Version chinoise des documents officiels》Pour ces quatregRPCDescription 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é servicegRPCService 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édentegRPCServices;
  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:

Insérer la description de l'image ici

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

Insérer la description de l'image ici

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

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

Insérer la description de l'image ici

  • Ouvre.grpc-libModule,Insrc/main/protoNouveau fichier dans le Répertoiremall.proto,Il y en a un à l'intérieurgRPCMéthodesListOrdersEt 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(AvecstreamModifier 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 - dessousgenerateProto,SelonprotoGénérerjavaCode:

Insérer la description de l'image ici

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

Insérer la description de l'image ici

  • 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 importantgRPCServices,Les codes sont les suivants:,VisibleresponseObserver.onNextLa méthode a été appelée plusieurs fois,Pour continuer à exporter des données vers le client,EnfinresponseObserver.onCompletedSortie 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 {
/**
* mockUn 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 versclient
for (Order order : mockOrders()) {
responseObserver.onNext(order);
}
// Sortie finale
responseObserver.onCompleted();
}
}
  • Jusqu'ici.,Développement du serveur terminé,Développons un autrespringbootApplication en tant que client,Voir comment appeler à distancelistOrdersInterface,Je l'ai.responseObserver.onNextDonnées de sortie de la méthode;

Développer un client,Appelez la publication précédentegRPCServices

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

Insérer la description de l'image ici

  • 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 configurationapplication.ymlIl se lit comme suit:,Visible est le port etgRPCConfiguration 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éeOrderIl y a beaucoup degRPCContenu pertinent,Ne convient pas commewebValeur de retour de l'interface,Alors définissez unDispOrderClasse commewebValeur 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 à distancegRPCServiceslistOrdersInterface,.Voir l'interface pour le type de flux côté serveur,Le client passe parstubL'appel auraIteratorValeur de retour du type,La prochaine chose à faire est de traverserIterator:
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<>();
// AdoptionstubLancer distantgRPCDemande
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 finircontrollerCatégorie,Fournir unwebInterface,Ç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 écoute9989Port:

Insérer la description de l'image ici

  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 à obtenirgRPCDonnées distantes de:

Insérer la description de l'image ici

Jusqu'ici.,Type de flux côté serveurgRPCLe 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

版权声明
本文为[Programmeur xinchen]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210915085853007Y.html

  1. 10天拿到字節跳動Java崗比特offer,Java知識點思維導圖
  2. 10 jours pour obtenir un Byte Jump Java post offer, Java Knowledge point Mind Map
  3. 10 jours pour obtenir l'octet Jump Java post offer, apprendre les étapes du développement Java
  4. Java version of gppc Reality Three: server side stream
  5. Linux Series: Dites - lui qu'il ne connaît pas kill du tout
  6. "Data structure and algorithm" of front end -- binary search
  7. 2020-2021京东Java面试真题解析,如何才能通过一线互联网公司面试
  8. 13 SpringBoot整合RocketMQ实现过滤消息-根据SQL表达式过滤消息
  9. 12 SpringBoot整合RocketMQ实现过滤消息-根据TAG方式过滤消息
  10. 11 SpringBoot整合RocketMQ实现事务消息
  11. 11 springboot Consolidated rocketmq Implementation transaction message
  12. 12 springboot Consolidated rocketmq Implements Filtering messages - Filtering messages according to tag method
  13. 13 springboot Consolidated rocketmq Implementation Filtering messages - Filtering messages according to SQL expressions
  14. linux系列之:告诉他,他根本不懂kill
  15. (1)java Spring Cloud+Spring boot企业快速开发架构之微服务是什么?它的优缺点有哪些?
  16. Oracle 检查 DATE 列 RANGE 分区表已有分区的最大日期时间
  17. ConcurrentHashMap--原理
  18. 2020 - 2021 JD Java interview Real question Analysis, How can interview through First - Line Internet Company
  19. Concurrenthashmap - - Principes
  20. Oracle vérifie l'heure de date maximale d'une partition existante dans la colonne date
  21. Docker Compose 实践及梳理
  22. Qu'est - ce qu'un microservice pour Java Spring Cloud + Spring Boot Enterprise Quick Development architecture?Quels sont ses avantages et ses inconvénients?
  23. Plus sign interview knowledge points in Java
  24. Pratique et organisation de la composition des dockers
  25. Linux Series: Dites - lui qu'il ne connaît pas kill du tout
  26. Convenient CSS and jQuery drop-down menu solution
  27. Linux analog packet loss rate
  28. Redis:我是如何与客户端进行通信的
  29. 15 useful cron work examples commonly used by Senior Linux system administrators
  30. 24个 JavaScript 循环遍历方法,你都知道吗?
  31. Reading notes of JavaScript advanced programming (3rd Edition) 4
  32. 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘(图文讲解)
  33. 24 méthodes de traversée de boucle Javascript, vous savez?
  34. 30 minutes pour apprendre à ouvrir le tableau de bord k8s (kubernets) dans le docker (explication graphique)
  35. Redis: comment je communique avec les clients
  36. Wsl2: Windows native Linux subsystem
  37. 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘(图文讲解)
  38. Docker Compose 实践及梳理
  39. Python高级用法总结(8)-函数式编程
  40. 261页前端面试题宝典,JavaScript变量声明提升
  41. The performance of JVM and Java applications of the same version differs by 30% on X86 and aarch64 platforms. Why?
  42. Page 261: dictionnaire des questions d'entrevue de première ligne, promotion de la Déclaration des variables JavaScript
  43. Python Advanced use Summary (8) - functional Programming
  44. Pratique et organisation de la composition des dockers
  45. 30 minutes pour apprendre à ouvrir le tableau de bord k8s (kubernets) dans le docker (explication graphique)
  46. [design pattern series] simple factory
  47. 2021Java最新大厂面试真题,阿里技术专家深入讲解
  48. Java equals and==
  49. Spring5(五)——AOP
  50. 海量列式非关系数据库HBase 原理深入
  51. java collections
  52. 海量列式非關系數據庫HBase 原理深入
  53. Base de données non relationnelle à grande échelle
  54. Printemps 5 (v) - AOP
  55. 2021 le dernier vrai problème d'entrevue d'usine de Java, expliqué en profondeur par les experts techniques d'Ali
  56. Java knowledge structure diagram and thinkinjava PDF file
  57. Do redis transactions satisfy atomicity?
  58. Java programmers must master 10 open source tools!
  59. [Cao Gong's essay] talk about the contract between Maven framework and plug-ins
  60. What books are better for learning Java