Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Komunikasi antara perkhidmatan mikro--Protobuf

Komunikasi antara perkhidmatan mikro--Protobuf

Go语言进阶学习
Go语言进阶学习ke hadapan
2023-07-24 15:26:10679semak imbas

1. Gambaran keseluruhan

Komunikasi antara perkhidmatan mikro--Protobuf

Gambar di atas ialah kamera SONY yang dibongkarkan komponen di dalam menjalankan tugas mereka sendiri apabila bekerja, dan hanya melakukan apa yang mereka lakukan. Mereka boleh datang dari pengeluar yang berbeza atau malah negara Dalam dunia global hari ini, kebanyakan produk cemerlang berkembang pada satu titik, mencari perkhidmatan dan teknologi yang lebih baik.

Malah, ia adalah sama untuk teknologi perisian, dan ia lebih seperti mikrokosmos globalisasi.

Microservices Tidak ada definisi yang tetap dan tunggal Dengan peredaran masa dan evolusi teknologi yang berterusan, industri secara senyap-senyap telah membentuk beberapa konsensus termasuk perkara berikut.

  • Perkhidmatan mikro khusus memindahkan maklumat antara satu sama lain melalui protokol komunikasi di seluruh seni bina, seperti HTTP.

  • Perkhidmatan mikro boleh digunakan secara bebas.

  • Perkhidmatan mikro menganjurkan fungsi khusus di sekitar perniagaan.

  • Perkhidmatan mikro tidak terhad kepada bahasa, pangkalan data, perkakasan dan persekitaran perisian untuk melaksanakan perkhidmatan.

  • Perkhidmatan adalah berbutir kecil, pemesejan sokongan, terikat konteks, dan dibina serta dikeluarkan melalui proses automatik.

Daripada ringkasan di atas, interaksi maklumat antara perkhidmatan mikro adalah asas kepada keseluruhan MSA (Seni Bina Perkhidmatan Mikro yang diwujudkan berdasarkan perkhidmatan itu). adalah mudah dan ringkas. Cekap, stabil, berskala dan mudah diselenggara. Penjelmaan muktamad dalam produk ialah pengalaman pengguna, terutamanya untuk perkhidmatan yang memerlukan respons pantas, seperti pembayaran, pembidaan pengiklanan, dsb. Dan Protocol Buffers (biasanya dikenali sebagai Protobuf) adalah yang terbaik daripada mereka.

Mengenai sebabnya, kita boleh rujuk artikel berikut dan tidak akan terperinci di sini. . , permintaan log masuk ini perlu mempunyai Nama Pengguna

Kata Laluan
、Bilangan percubaan semula. Kami boleh mentakrifkan permintaan ini dalam akhiran . proto fail. Kandungan maklumat adalah seperti berikut:

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

Versi protokol

Baris pertama mentakrifkan versi sintaks yang sedang digunakan, dan versi terkini ialah

proto3. Anda juga boleh menggunakan 用户名密码重试次数。我们可以将这个请求定义在一个后缀为.protoproto2

Jenis medan protokol

LoginRequest Isi mesej mentakrifkan tiga parameter khusus, setiap parameter mempunyai jenis dan nama tertentu. Setiap medan boleh ditakrifkan sebagai .proto Type dalam jadual berikut – dan jenis yang akhirnya digunakan dalam bahasa tertentu (Java + Go) juga boleh didapati dalam jadual.

.
Menggunakan pengekodan panjang berubah-ubah. Nilai int yang ditandatangani. Ini lebih cekap mengekod nombor negatif daripada int32 biasa.intint32sint64int32sint64bait

注释

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)
}
}
double float64 apung
float float32
int32 Menggunakan pengekodan panjang berubah-ubah. Tidak cekap untuk pengekodan nombor negatif – jika medan anda mungkin mempunyai nilai negatif, gunakan sint32 sebaliknya. Tidak cekap untuk mengekod nombor negatif – jika medan anda mungkin mempunyai nilai negatif, gunakan sint64 sebaliknya. long int64
uint32 int uint32
uint64 Menggunakan pengekodan panjang ubah. long uint64
menggunakan pembolehubah-panjang Nilai int yang ditandatangani. Ini lebih cekap mengekod nombor negatif daripada int64 biasa. long🎜🎜🎜🎜int64🎜🎜🎜🎜🎜🎜ditetapkan32🎜🎜🎜🎜 empat bytes. Lebih cekap daripada uint32 jika nilai selalunya lebih besar daripada 228.🎜 int uint32
fixed64 Sentiasa lapan bait. Lebih cekap daripada uint64 jika nilai selalunya lebih besar daripada 256. long uint64
sfixed32 int
int32 sfixed64 Sentiasa lapan bait. long
int64
🎜🎜🎜🎜🎜🎜🎜🎜
boolean bool
rentetan Sesuatu rentetan mesti sentiasa mengandungi UTF-8 yang dikodkan atau 7-bit ASCII🜎, dan tidak boleh lebih panjang daripada teks 7-bit.🜎 Rentetan rentetan
Boleh mengandungi sebarang jujukan bait sewenang-wenangnya tidak lebih daripada 232. ByteString

Atas ialah kandungan terperinci Komunikasi antara perkhidmatan mikro--Protobuf. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Go语言进阶学习. Jika ada pelanggaran, sila hubungi admin@php.cn Padam