GRPC Learning six: GRPC Gateway Integrated Swagger, Java language programming and data structure Advanced Edition

Harmonios Learning 2021-11-25 18:29:04
grpc learning grpc gateway integrated

  1. glogEst un outil de journalisation commun:

go get -u github.com/golang/glog

 CompilationprotoDocumentation

  • Entrée dans le Répertoire$GOPATH/src/swaggerdemo,Nouveauswaggerdemo.proto,Il se lit comme suit:,Il y a quelques points à noter qui seront expliqués plus tard:

// Type de protocole

syntax = “proto3”;

// Nom du paquet

package swaggerdemo;

import “google/api/annotations.proto”;

import “protoc-gen-swagger/options/annotations.proto”;

// DéfinitionswaggerContenu

option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {

info: {

title: “grpc gateway helloworld sample”;

version: “1.0”;

};

schemes: HTTP;

};

// Nom du Service défini

service Greeter {

// Approche spécifique du service à distance

rpc SayHello (HelloRequest) returns (HelloReply) {

option (google.api.http) = {

post: “/helloworld”

body: “*”

};

}

}

// SayHelloParamètres entrants de la méthode,Un seul champ de chaîne

message HelloRequest {

string name = 1;

}

// SayHelloValeur de retour de la méthode,Un seul champ de chaîne

message HelloReply {

string message = 1;

}

  • Documentationswaggerdemo.protoEt  《gRPC-GatewaySur le terrain》Dans un articleproto La plupart des documents sont cohérents , La différence réside dans l'augmentation swaggerConfiguration de, Cette configuration permet swagger Configurer les appels distants pour http, Sans ces configurations ,swagger L'appel distant par défaut est httpsDe,De cet articlegRPC-GatewayCe qui est offert esthttpServices, Donc ajoutez ces configurations ,Au - dessus deswaggerdemo.protoDans le contenu de, Les configurations spécifiques sont les suivantes: :
  1. AvecimportImportation de mots clésprotoc-gen-swagger/options/annotations.proto

  2. Le paragraphe suivant est swaggerConfiguré pour,L'accent est mis sur:schemes,Il n'y a queHTTP:

《Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Notes d'apprentissage pour le développement de l'arrière - plan+La dernière vidéo d'architecture+Document d'information sur le code source du projet en direct》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 Partage open source du contenu complet

option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {

info: {

title: “grpc gateway helloworld sample”;

version: “1.0”;

};

schemes: HTTP;

};

  • Et il fautswaggerdemo.protoMentionné dansprotoc-gen-swagger/options/annotations.proto Documents en place ,Pour utilisationswaggerdemo.proto On peut le trouver quand annotations.protoDocumentation,Exécuter la commande suivante:

cd $GOPATH/src

cp -r ./github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger ./

  • Dans l'ordre ci - dessus protoc-gen-swaggerDossiers, Est téléchargé dans les opérations précédentes ;

 GénérergRPC、gRPC-GatewayCe qu'il fautgoCode source

  • GénérergRPC、gRPC-GatewayCe qu'il fautgoCode source, C'est déjà fait. ,Ici.swaggerdemo.protoEncore une fois,Entrée avancée dans le catalogue$GOPATH/src/swaggerdemo

  • Exécuter la commande suivante,GénérergRPC Source requise :

protoc -I. \

-I$GOPATH/src \

-I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \

–go_out=plugins=grpc:. \

swaggerdemo.proto

  • Exécuter la commande suivante,GénérergRPC-Gateway Source requise :

protoc -I. \

-I$GOPATH/src \

-I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \

–grpc-gateway_out=logtostderr=true:. \

swaggerdemo.proto

 GénérerswaggerCe qu'il fautjsonDocumentation

  • Toujours dans le catalogue $GOPATH/src/swaggerdemo,Exécuter la commande suivante,GénérerswaggerBesoinsjson:

protoc -I. \

-I$GOPATH/src \

-I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \

–swagger_out=logtostderr=true:. \

swaggerdemo.proto

  • En ce moment$GOPATH/src/swaggerdemo Ajouter les trois fichiers suivants dans le Répertoire :
  1. swaggerdemo.pb.go:gRPCCe qu'il fautgoDocumentation

  2. swaggerdemo.pb.gw.go:gRPC-GatewayCe qu'il fautgoDocumentation

  3. swaggerdemo.swagger.json:swagger-uiÀ utiliserjsonDocumentation, Selon ce document ,swagger La page affichée sera gRPC-Gateway Définition des services et des paramètres exposés , La demande peut être faite sur la page

 Générerswagger-uiDegoDocumentation

  • Pour offrir un service swaggerDewebPage,Il fautswagger-ui Le code source de goDocumentation,Les étapes sont les suivantes:
  1. Les commandes suivantes vont passer de GithubTéléchargerswagger-uiSource de, Ce document aurait dû provenir de swaggerTéléchargement officiel, Mais j'ai essayé ici plusieurs fois et j'ai découvert , Téléchargé zip Une condition dans laquelle le conteneur du paquet est corrompu et ne peut pas être décompressé , Alors j'ai mis ce fichier dans le mien. GithubAllez., L'opération suivante vient de moi aussi. GithubTélécharger, Mais en fait, ce fichier et swagger Il n'y a pas de différence officielle ;

  2. Entrée dans le Répertoire$GOPATH/src/swaggerdemo,Exécuter la commande suivante pour téléchargerswagger-uiCode source, Et les placer à l'endroit indiqué :

wget  https://raw.githubusercontent.com/zq2599/blog_download_files/master/files/swagger-ui.zip -O swagger-ui.zip \

&& unzip swagger-ui.zip \

&& mkdir -p $GOPATH/src/swaggerdemo/third_party/ \

&& mv ./swagger-ui-3.38.0/dist $GOPATH/src/swaggerdemo/third_party/ \

&& mv $GOPATH/src/swaggerdemo/third_party/dist $GOPATH/src/swaggerdemo/third_party/swagger-ui \

&& rm -f ./swagger-ui.zip \

&& rm -rf ./swagger-ui-3.38.0

  1. Exécuter la commande suivante pour créer un nouveau dossier , Ce dossier est utilisé pour stocker les swagger-uiDegoCode source:

mkdir -p $GOPATH/src/swaggerdemo/pkg/ui/data/swagger

  1. Exécuter la commande suivante,Oui.swagger-ui Source convertie en datafile.goDocumentation:

cd $GOPATH/src/swaggerdemo/

go-bindata --nocompress -pkg swagger -o pkg/ui/data/swagger/datafile.go third_party/swagger-ui/…

  1. C'est le moment$GOPATH/src/swaggerdemo/pkg/ui/data/swagger Fichier généré sous le répertoire datafile.go
  • Tous les documents et documents sont prêts ,Commencez le codage;

 CompilationgRPC Code du serveur pour

  • Selonswaggerdemo.proto Configuration pour créer un nouveau gRPCServices,Les étapes sont les suivantes:
  1. Nouveau dossier$GOPATH/src/swaggerdemo/server;

  2. NouveauserverAjouter un nouveau fichier sous le dossierserver.go,Il se lit comme suit:, C'est juste un gRPC C'est juste un service :

package main

import (

“context”

“log”

“net”

“google.golang.org/grpc”

pb “swaggerdemo”

)

const (

port = “:50051”

)

// Définir la structure,Inscription à l'appelapiComme paramètre d'entrée,

// L'expérience de la structureSayHelloMéthodes,C'est un code d'entreprise.

// De cette façon, le Code d'affaires est exécuté lors d'un appel à distance

type server struct {

// pb.goAuto - generated in,C'est une structure vide.

pb.UnimplementedGreeterServer

}

// Le Code d'entreprise est écrit ici,Appel à distance du clientSayHelloHeure,

// Le Code ici sera exécuté

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {

// Imprimer les paramètres de la demande

log.Printf(“Received: %v”, in.GetName())

// Structure instantanéeHelloReply,Comme valeur de retour

return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil

}

func main() {

// Protocoles et ports à écouter

lis, err := net.Listen(“tcp”, port)

if err != nil {

log.Fatalf(“failed to listen: %v”, err)

}

// InstanciationgRPC serverStructure

s := grpc.NewServer()

// Inscription au service

pb.RegisterGreeterServer(s, &server{})

log.Println(“Commence à écouter.,En attente d'un appel à distance…”)

if err := s.Serve(lis); err != nil {

log.Fatalf(“failed to serve: %v”, err)

}

}

  • C'est tout ce qui précède.gRPCCode du Service, Comme dans les articles précédents ,Je ne reviendrai pas sur;

 CompilationgRPC-GatewayCode côté serveur

  • Commencez à écriregRPC-GatewayCode du serveur, C'est le but de cet article. , En plus de fournir le même gRPC-GatewayServices,Sont également disponiblesswaggerDejsonServices de documentation,EtswaggerDeuiServices;

  • Nouveau dossier$GOPATH/src/swaggerdemo/gateway;

  • NouveaugatewayAjouter un nouveau fichier sous le dossiergateway.go,Il se lit comme suit:,Il y a quelques points à noter qui seront expliqués plus tard:

package main

import (

“github.com/elazarl/go-bindata-assetfs”

“log”

“net/http”

“path”

“strings”

“github.com/golang/glog”

“github.com/grpc-ecosystem/grpc-gateway/runtime”

“golang.org/x/net/context”

“google.golang.org/grpc”

swagger “swaggerdemo/pkg/ui/data/swagger”

gw “swaggerdemo”

)

func run() error {

ctx := context.Background()

ctx, cancel := context.WithCancel(ctx)

defer cancel()

gwmux, err := newGateway(ctx)

if err != nil {

panic(err)

}

mux := http.NewServeMux()

mux.Handle(“/”, gwmux)

mux.HandleFunc(“/swagger/”, serveSwaggerFile)

serveSwaggerUI(mux)

log.Println(“grpc-gateway listen on localhost:9090”)

return http.ListenAndServe(“:9090”, mux)

}

func newGateway(ctx context.Context) (http.Handler, error) {

opts := []grpc.DialOption{grpc.WithInsecure()}

gwmux := runtime.NewServeMux()

if err := gw.RegisterGreeterHandlerFromEndpoint(ctx, gwmux, “:50051”, opts); err != nil {

return nil, err

}

return gwmux, nil

}

func serveSwaggerFile(w http.ResponseWriter, r *http.Request) {

log.Println(“start serveSwaggerFile”)

if !strings.HasSuffix(r.URL.Path, “swagger.json”) {

log.Printf(“Not Found: %s”, r.URL.Path)

http.NotFound(w, r)

return

}

p := strings.TrimPrefix(r.URL.Path, “/swagger/”)

p = path.Join(“…/”, p)

log.Printf(“Serving swagger-file: %s”, p)

http.ServeFile(w, r, p)

}

func serveSwaggerUI(mux *http.ServeMux) {

fileServer := http.FileServer(&assetfs.AssetFS{

Asset: swagger.Asset,

AssetDir: swagger.AssetDir,

Prefix: “third_party/swagger-ui”,

})

prefix := “/swagger-ui/”

mux.Handle(prefix, http.StripPrefix(prefix, fileServer))

}

func main() {

defer glog.Flush()

if err := run(); err != nil {

glog.Fatal(err)

}

}

  • Pour çagateway.goDocumentation, Voici quelques points clés :
  1. De l'extérieurRESTfulDemande transmise àserver.goLa fonction de,Encapsulé dansnewGatewayDans la méthode;

  2. DemandeURL Si elle contient /swagger,C'est bon.serveSwaggerFileTraitement méthodologique, La logique ici est de mettre le fichier $GOPATH/src/swaggerdemo/swaggerdemo.swagger.jsonRetour au demandeur;

  3. FocusserveSwaggerUIMéthodes, Après traitement par cette méthode ,Si demandéURLContient/swagger-ui, Sera livré à la génération précédente datafile.goTraitement, C'est ouvert swagger-uiPage de;

  • Jusqu'ici., Développement terminé , On peut commencer à vérifier ;

 Validation

  1. Entrée dans le Répertoire$GOPATH/src/swaggerdemo/server,Mise en œuvrego run server.goDémarragegRPCServices;

  2. Entrée dans le Répertoire$GOPATH/src/swaggerdemo/gateway,Mise en œuvrego run gateway.goDémarragegRPC-GatewayServices;

  3. Assurez - vous que le pare - feu de la machine sur laquelle le service réside est éteint ;

  4. Le serveur de mon côté IPL'adresse esthttp://192.168.133.204/, Donc le navigateur accède à : http://192.168.133.204:9090/swagger/swaggerdemo.swagger.json ,Vous pouvez voirswagger.jsonLe contenu de,Comme le montre la figure ci - dessous::

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Java

  1. Accès àswagger-uiPage,L'adresse est: http://192.168.133.204:9090/swagger-ui/ ,Comme le montre la figure ci - dessous:,Visibleswagger-uiFonctionnement normal:

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Java_02

  1. En ce momentswagger-ui La page ne montre pas gRPC-Gateway Contenu de l'interface pour ,Il fauthttp://192.168.133.204:9090/swagger/swaggerdemo.swagger.json Remplissez la case rouge ci - dessous 1Moyenne,Cliquez à nouveau sur la case rouge2Bouton pour,Peut être affiché normalement,Boîte rouge3C'estgRPC-Gateway Services exposés à l'extérieur :

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Développement de l'arrière - plan_03

Résumé Final

ActiveMQ+Kafka+RabbitMQNotes d'étudePDF

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Interview_04

  • RabbitMQGuide pratique

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Interview_05

  • ManuscritRocketMQNotes

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Java_06

  • Manuscrit“KafkaNotes”

gRPCApprendre six:gRPC-GatewayIntégrationswagger,java Programmation linguistique et structure des données _Java_07

À propos de Distributed,Limitation du courant+Cache+Cache,Ces trois technologies(Contient:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)Attendez un peu!.Ces entretiens sont bons.,Et des notes manuscrites et des notes d'étudePDF,Sont des trésors essentiels pour percer la technologie distribuée.Chacun des thèmes ci - dessus est présenté dans chaque sous - catégorie,Et le petit rédacteur en chef l'a arrangéPDFC'est bon.

Cet article a été publié par CODINGProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication+Code source du projet opérationnel】Inclus

版权声明
本文为[Harmonios Learning]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125182532036f.html

  1. Java经典面试题详解,突围金九银十面试季(附详细答案,mysql集群架构部署方案
  2. java整理,java高级特性编程及实战第一章
  3. java教程——反射,mongodb下载教程
  4. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day12,zookeeper原理作用
  5. Java后端互联网500道中高级面试题(含答案),linux钩子技术
  6. java8 Stream API及常用方法,java初级程序员面试
  7. java-集合-Map(双列)——迪迦重制版,2021Java开发社招面试解答之性能优化
  8. Flink处理函数实战之二:ProcessFunction类,java线程面试题目
  9. flex 布局详解,【Java面试题
  10. Linux basic command learning
  11. Why did docker lose to kubernetes? Docker employee readme!
  12. MySQL安装
  13. Elastic Search Aggregate Learning five: Problem Analysis of Uncertainty of sequencing results, Alibaba Java Performance Tuning Practical
  14. Installing, configuring, starting and accessing rabbitmq under Linux
  15. Oracle SQL injection summary
  16. Installation MySQL
  17. L'exposition à la photo d'essai sur la route i7 du nouveau vaisseau amiral de BMW Pure Electric a également été comparée à celle de Xiaopeng p7.
  18. spring JTA 关于异常处理的时机问题
  19. Le problème du temps de traitement des exceptions dans la JTA printanière
  20. Flink Handling Function Real War II: processfunction class, Java thread interview subject
  21. Oracle SQL injection summary
  22. [Java data structure] you must master the classic example of linked list interview (with super detailed illustration and code)
  23. Do you really know MySQL order by
  24. Record a java reference passing problem
  25. spring JTA 關於异常處理的時機問題
  26. Java - Set - Map (double file) - dija Rewriting, 2021 Java Developer's Performance Optimization
  27. Android入门教程 | OkHttp + Retrofit 取消请求的方法
  28. Java 8 Stream API and common methods, Java Junior Program interview
  29. Github 疯传!史上最强!BAT 大佬,2021年最新Java大厂面试笔试题分享
  30. git(3)Git 分支,zookeeper下载教程
  31. Java Backend Internet 500 questions d'entrevue moyennes et avancées (y compris les réponses), technologie de crochet Linux
  32. Entretien d'entretien d'usine Java post sprint de 100 jours - accumulation de jours et de mois, trois questions par jour [jour 12, fonction de principe de Zookeeper
  33. Tutoriel Java - reflection, tutoriel de téléchargement mongodb
  34. How to analyze several common key and hot issues in redis from multiple dimensions
  35. GIT (3) GIT Branch, Zookeeper Download tutoriel
  36. Tutoriel de démarrage Android | okhttp + Retrofit comment annuler une demande
  37. Design pattern [3.3] - Interpretation of cglib dynamic agent source code
  38. Share the actual operation of private collection project nodejs backend + Vue + Mysql to build a management system
  39. Springboot has 44 application initiators
  40. GitHub上霸榜久居不下的《Java面试突击宝典》,java图形用户界面设计基础
  41. GitHub上访问下载破百万的神仙文档《Java面试神技》看完我呆了,java面试问项目中遇到的问题
  42. GitHub上标星75k 超牛的《Java面试突击版,java高级工程师技能
  43. GitHub上标星2,java项目开发实训教程
  44. Docker development environment Preview
  45. JavaScript高級深入淺出:掌握 this 指向
  46. JavaScript Advanced Insight and outside: Mastering this direction
  47. Vue de l'application pratique de Javascript, drop drag Event
  48. docker 安装部署 Jenkins 2.322
  49. kafka安装
  50. 近九万字图文详解RabbitMQ
  51. Engaged in Java for one and a half years, how to break through yourself
  52. 输出9*9乘法表----java
  53. 判断一个数是不是素数-------java
  54. java项目,记录页面修改值,内部打“官司”用
  55. Docker installation Deployment Jenkins 2.322
  56. Comment porter un pantalon en hiver? Les petits hommes, les jambes épaisses et la largeur de l'entrejambe peuvent être vus. 3 techniques pour éviter la foudre
  57. MySQL下载和安装教程
  58. In depth analysis of rocketmq source code - message storage module
  59. Spring transaction management
  60. mysql恢复ibd数据,为何频频报错?