Maison >développement back-end >Golang >Communication entre microservices--Protobuf

Communication entre microservices--Protobuf

Go语言进阶学习
Go语言进阶学习avant
2023-07-24 15:26:10736parcourir

1. Présentation

Communication entre microservices--Protobuf

L'image ci-dessus est un appareil photo SONY démonté. Les composants à l'intérieur remplissent leurs propres tâches lorsqu'ils fonctionnent et ne font que ce pour quoi ils sont bons. Ils peuvent provenir de différents fabricants, voire de pays. Dans le monde globalisé d'aujourd'hui, la plupart des excellents produits évoluent en un seul point, à la recherche de meilleurs services et technologies.

En fait, c'est la même chose pour la technologie logicielle, et cela ressemble plus à un microcosme de la mondialisation.

Microservices Il n'y a pas de définition fixe et unique Avec le passage du temps et l'évolution continue de la technologie, l'industrie a tranquillement formé un certain consensus. Les caractéristiques qui peuvent être résumées incluent les points suivants.

  • Des microservices spécifiques se transfèrent des informations entre eux via des protocoles de communication dans toute l'architecture, tels que HTTP.

  • Les microservices peuvent être déployés indépendamment.

  • Les microservices organisent des fonctions spécifiques autour de l'entreprise.

  • Les microservices ne se limitent pas aux langages, aux bases de données, aux environnements matériels et logiciels pour mettre en œuvre les services.

  • Les services sont petits, prennent en charge la messagerie, sont liés au contexte et sont construits et publiés via des processus automatisés.

D'après le résumé ci-dessus, l'interaction des informations entre les microservices est le fondement de l'ensemble du MSA (Architecture des microservices). La qualité du protocole de communication détermine si le service est établi sur cette base. est simple et efficace, stable, évolutif et facile à entretenir. L'incarnation ultime du produit est l'expérience utilisateur, en particulier pour les services qui nécessitent une réponse rapide, tels que le paiement, les enchères publicitaires, etc. Et Protocol Buffers (communément appelé Protobuf) est le meilleur d'entre eux.

Quant à pourquoi, nous pouvons nous référer à l'article suivant et n'entrerons pas dans les détails ici.

Battre les performances JSON avec Protobuf LIEN

2 Utilisation rapide

2.1 Définir un protocole de communication

Examinons d'abord un exemple très simple, en supposant que nous devons définir une demande de connexion. , cette demande de connexion doit avoir Nom d'utilisateur用户名密码重试次数。我们可以将这个请求定义在一个后缀为.protoMot de passe fichier. Le contenu des informations est le suivant :

/* LoginRequest represents a login request
* user_name: user name 
* password: password 
* retry_time: retry times, can not over 3 times */

syntax = "proto3";  // proto3 syntax
option go_package = "pb/request";

message LoginRequest {
 string user_name = 1;
 string password = 2;
 int32 retry_times = 3;
}
Version du protocole

La première ligne définit la version de la syntaxe actuellement utilisée, et la dernière version est proto3. Vous pouvez également utiliser proto2

🎜

Type de champ de protocole

LoginRequest Le corps du message définit trois paramètres spécifiques, chaque paramètre a un type et un nom spécifiques. Chaque champ peut être défini comme un .proto Type dans le tableau suivant – et les types finalement utilisés dans le langage spécifique (Java + Go) peuvent également être trouvés dans le tableau.

intuint32Utilise un codage de longueur variable. Valeur entière signée. Ceux-ci codent plus efficacement les nombres négatifs que les int32 classiques. Valeur entière signée. Ceux-ci codent plus efficacement les nombres négatifs que les int64 classiques. Plus efficace que uint32 si les valeurs sont souvent supérieures à 228.sfixed64bool
.proto Type Notes Java Type Go Type
double
double float64
flotteur
float float32
int32 Utilise un encodage de longueur variable. Inefficace pour coder des nombres négatifs – si votre champ est susceptible d'avoir des valeurs négatives, utilisez plutôt sint32. Inefficace pour coder des nombres négatifs – si votre champ est susceptible d'avoir des valeurs négatives, utilisez plutôt sint64.
uint64 Utilise un encodage de longueur variable. int uint32
fixed64 Toujours huit octets. Plus efficace que uint64 si les valeurs sont souvent supérieures à 256. int int32
Toujours huit octets. long int64
boolean bool
string Une chaîne doit toujours contenir du texte codé en UTF-8 ou ASCII 7 bits et ne peut pas dépasser 232. Chaîne string
bytes Peut contenir toute séquence arbitraire d'octets ne dépassant pas 232. ByteString []byte

注释

Protobuf 支持 C/C++ 中的两种注释风格

  1. 斜线加星号 /* ... */

  2. 双斜线  //

2.2 代码生成

Golang 代码生成

  1. 到 Protobuf 官方 Repo 下载对应平台的 protoc 工具

  2. 首先用 go命令安装生成Go代码的工具, 此工具为生成Golang代码的插件

    go install google.golang.org/protobuf/cmd/protoc-gen-go
  3. 生成最终的代码

    SRC_DIR: 源目录

    DST_DIR: 生成的代码目录

    protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/request.proto

    最终生成 request.pb.go文件,该文件不用修改,后期有任何更新可以重新生成。

  4. 将上述代码保存到 request.proto 文件中

Golang 代码使用

生成的代码可以直接在项目中使用

func main() {
 // 创建请求
loginRequest := request.LoginRequest{
UserName: "Gavin.Yang",
Password: "92d273941d98a8e1c1bb13ac163f0d4e40c5aa70",
RetryTimes: 0}

 // 序列化
out, err := proto.Marshal(&loginRequest)
if err == nil{
fmt.Println(out)
}
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer