Heim > Artikel > Backend-Entwicklung > 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
Schauen wir uns zunächst ein sehr einfaches Beispiel an, vorausgesetzt, wir müssen eine Anmeldeanforderung definieren , diese Anmeldeanforderung muss Benutzername
用户名
、密码
、重试次数
。我们可以将这个请求定义在一个后缀为.proto
、Passwort
、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; }
Die erste Zeile definiert die aktuell verwendete Syntaxversion und die neueste Version ist proto3. Sie können auch proto2
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.
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 | intuint32 | ||
uint64 | Verwendet Codierung mit variabler Länge | Verwendet 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.int | uint32 | |
fixed64 | Immer acht Bytes. Effizienter als uint64, wenn die Werte häufig größer als 256 sind int | int32 | sfixed64 | |
Immer acht Bytes. | long | int64 | bool | |
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++ 中的两种注释风格
斜线加星号 /* ... */
双斜线 //
到 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) } }
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!