Maison >développement back-end >Golang >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
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
用户名
、密码
、重试次数
。我们可以将这个请求定义在一个后缀为.proto
、Mot 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
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.
.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. | intuint32 | ||
uint64 | Utilise un encodage de longueur variable. | Utilise 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.int | uint32 | |
fixed64 | Toujours huit octets. Plus efficace que uint64 si les valeurs sont souvent supérieures à 256. int | int32 | sfixed64 | |
Toujours huit octets. | long | int64 | bool | |
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++ 中的两种注释风格
斜线加星号 /* ... */
双斜线 //
到 Protobuf 官方 Repo 下载对应平台的 protoc
工具
首先用 go
命令安装生成Go代码的工具, 此工具为生成Golang代码的插件
go install google.golang.org/protobuf/cmd/protoc-gen-go
生成最终的代码
SRC_DIR: 源目录
DST_DIR: 生成的代码目录
protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/request.proto
最终生成 request.pb.go
文件,该文件不用修改,后期有任何更新可以重新生成。
将上述代码保存到 request.proto
文件中
生成的代码可以直接在项目中使用
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!