Heim  >  Artikel  >  Backend-Entwicklung  >  Kommunikation zwischen Microservices – Protobuf

Kommunikation zwischen Microservices – Protobuf

Go语言进阶学习
Go语言进阶学习nach vorne
2023-07-24 15:26:10680Durchsuche

1. Übersicht

Kommunikation zwischen Microservices – Protobuf

Das Bild oben zeigt eine zerlegte SONY-Kamera, wenn sie funktioniert, und zwar nur das, was sie gut kann. Sie können von verschiedenen Herstellern oder sogar Ländern stammen. In der heutigen globalisierten Welt entwickeln sich die meisten hervorragenden Produkte an einem einzigen Punkt weiter, auf der Suche nach besseren Dienstleistungen und Technologien.

Tatsächlich gilt das Gleiche auch für die Softwaretechnologie, und sie gleicht eher einem Mikrokosmos der Globalisierung.

Microservices Es gibt keine feste und einheitliche Definition. Im Laufe der Zeit und der kontinuierlichen Weiterentwicklung der Technologie hat sich in der Branche im Stillen ein gewisser Konsens gebildet. Die folgenden Punkte können zusammengefasst werden.

  • Spezifische Microservices übertragen Informationen untereinander über Kommunikationsprotokolle in der gesamten Architektur, wie z. B. HTTP.

  • Microservices können unabhängig voneinander bereitgestellt werden.

  • Microservices organisieren spezifische Funktionen rund um das Unternehmen.

  • Microservices sind nicht auf Sprachen, Datenbanken, Hardware- und Softwareumgebungen zur Implementierung von Diensten beschränkt.

  • Dienste sind kleingranular, unterstützen Messaging, sind kontextgebunden und werden durch automatisierte Prozesse erstellt und freigegeben.

Aus der obigen Zusammenfassung ist die Informationsinteraktion zwischen Microservices die Grundlage der gesamten MSA (Microservice-Architektur). Die Qualität des Kommunikationsprotokolls bestimmt, ob der Dienst darauf basiert ist einfach und unkompliziert. Die ultimative Verkörperung im Produkt ist das Benutzererlebnis, insbesondere bei Diensten, die eine schnelle Reaktion erfordern, wie z. B. Zahlungen, Werbeausschreibungen usw. Und Protocol Buffers (allgemein bekannt als Protobuf) ist das Beste davon. Was den Grund dafür betrifft, können wir auf den folgenden Artikel verweisen und werden hier nicht näher darauf eingehen.

Übertreffen der JSON-Leistung mit Protobuf LINK

2. Schnelle Verwendung

2.1 Kommunikationsprotokoll definieren

Schauen wir uns zunächst ein sehr einfaches Beispiel an, vorausgesetzt, wir müssen eine Anmeldeanforderung definieren , diese Anmeldeanforderung muss Benutzername用户名密码重试次数。我们可以将这个请求定义在一个后缀为.protoPasswort、Anzahl der Wiederholungsversuche. Wir können diese Anfrage in einem Suffix von . proto Datei. Der Inhalt der Informationen lautet wie folgt:

/* 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;
}

Protokollversion

Die erste Zeile definiert die aktuell verwendete Syntaxversion und die neueste Version ist proto3. Sie können auch proto2

🎜🎜 verwenden

Protokollfeldtyp

LoginRequest Der Nachrichtentext definiert drei spezifische Parameter, jeder Parameter hat einen bestimmten Typ und Namen. Jedes Feld kann in der folgenden Tabelle als .proto-Typ definiert werden – und die letztendlich in der jeweiligen Sprache (Java + Go) verwendeten Typen sind ebenfalls in der Tabelle zu finden.

... intuint32Verwendet Codierung mit variabler Länge. Int-Wert mit Vorzeichen. Diese kodieren negative Zahlen effizienter als normale int32-Werte. Int-Wert mit Vorzeichen. Diese kodieren negative Zahlen effizienter als normale int64-Werte. Effizienter als uint32, wenn die Werte häufig größer als 228 sind.sfixed64bool
double float64 float
float float32
int32 Verwendet Codierung mit variabler Länge. Ineffizient zum Kodieren negativer Zahlen – wenn Ihr Feld wahrscheinlich negative Werte hat, verwenden Sie stattdessen sint32. Ineffizient zum Kodieren negativer Zahlen – wenn Ihr Feld wahrscheinlich negative Werte hat, verwenden Sie stattdessen sint64
uint64 Verwendet Codierung mit variabler Länge int uint32
fixed64 Immer acht Bytes. Effizienter als uint64, wenn die Werte häufig größer als 256 sind int int32
Immer acht Bytes. long int64
boolean bool
string Eine Zeichenfolge muss immer UTF-8-codierten oder 7-Bit-ASCII-Text enthalten und darf nicht länger als 232 sein. String string
bytes Kann eine beliebige Folge von Bytes enthalten, die nicht länger als 232 ist. 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)
}
}

Das obige ist der detaillierte Inhalt vonKommunikation zwischen Microservices – Protobuf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Go语言进阶学习. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen