>  기사  >  백엔드 개발  >  微服务间的通信--Protobuf

微服务间的通信--Protobuf

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-24 15:26:10735검색

1. 개요

微服务间的通信--Protobuf

위 사진은 분해된 SONY 카메라로, 작동할 때 각자의 역할을 수행하며, 잘하는 일만 합니다. 오늘날의 세계화된 세계에서 대부분의 우수한 제품은 더 나은 서비스와 기술을 추구하면서 한 지점에서 발전하고 있습니다.

사실 소프트웨어 기술도 마찬가지고, 세계화의 축소판에 가깝습니다.

Microservices 시간이 흐르고 기술이 계속 발전하면서 업계에서는 다음과 같은 특징을 조용히 형성해 왔습니다.

  • 특정 마이크로서비스는 HTTP 등 전체 아키텍처에 걸쳐 통신 프로토콜을 통해 서로 정보를 전송합니다.

  • 마이크로서비스는 독립적으로 배포될 수 있습니다.

  • 마이크로서비스는 비즈니스와 관련된 특정 기능을 구성합니다.

  • 마이크로서비스는 서비스를 구현하는 언어, 데이터베이스, 하드웨어 및 소프트웨어 환경에만 국한되지 않습니다.

  • 서비스는 세분화되어 있고 메시지를 지원하며 상황에 따라 다르며 자동화된 프로세스를 통해 구축 및 출시됩니다.

위 요약에서 마이크로서비스 간의 정보 상호작용은 전체 MSA(Microservice Architecture)의 기초입니다. 통신 protocol의 품질은 이를 기반으로 서비스가 구축되는지 여부를 결정합니다. 간단하고 간단합니다. 효율적이고 안정적이며 확장 가능하며 유지 관리가 쉽습니다. 제품의 궁극적인 구현은 사용자 경험입니다. 특히 결제, 광고 입찰 등과 같이 빠른 응답이 필요한 서비스의 경우 더욱 그렇습니다. 그리고 Protocol Buffers(일반적으로 Protobuf라고도 함)가 그중 최고입니다.

이유는 다음 글을 참고하시기 바라며 여기서는 자세히 다루지 않겠습니다.

Protobuf로 JSON 성능 향상 LINK

2. 빠른 사용

2.1 통신 프로토콜 정의

먼저 아주 간단한 예를 살펴보겠습니다. 로그인 요청을 정의해야 한다고 가정하겠습니다. , 이 로그인 요청에는 사용자 이름用户名密码重试次数。我们可以将这个请求定义在一个后缀为.proto비밀번호、재시도 횟수. .proto 파일. 정보 내용은 다음과 같습니다.

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

프로토콜 버전

첫 번째 줄은 현재 사용되는 구문 버전을 정의하며, 최신 버전은 proto3입니다. proto2

🎜🎜을 사용할 수도 있습니다.

프로토콜 필드 유형

LoginRequest 메시지 본문은 세 가지 특정 매개변수를 정의하며, 각 매개변수에는 특정 유형과 이름이 있습니다. 각 필드는 다음 표에서 .proto Type으로 정의할 수 있으며, 특정 언어(Java + Go)에서 최종적으로 사용되는 유형도 표에서 확인할 수 있습니다.

.proto Type Notes Java Type Go Type
double
더블 float64
float
float float32
int32 가변 길이 인코딩을 사용합니다. 음수 인코딩에는 비효율적입니다. 필드에 음수 값이 있을 가능성이 있으면 대신 sint32를 사용하세요. int int32
int64 가변 길이 인코딩을 사용합니다. 음수 인코딩에 대한 비효율-필드가 음수 값을 가질 가능성이있는 경우 SINT64를 대신 사용하십시오. int uint32
uint64 가변 길이 인코딩을 사용합니다. long uint64
sint32 가변 길이 인코딩을 사용합니다. 부호 있는 int 값. 이는 일반 int32보다 음수를 더 효율적으로 인코딩합니다. int int32
sint64 가변 길이 인코딩을 사용합니다. 부호 있는 int 값. 이는 일반 int64보다 음수를 더 효율적으로 인코딩합니다. long int64
fixed32 항상 4바이트입니다. 값이 종종 228보다 큰 경우 uint32보다 효율적입니다. int uint32
fixed64 항상 8바이트입니다. 값이 종종 256보다 큰 경우 uint64보다 효율적입니다. long uint64
sfixed32 항상 4바이트입니다. int int32
sfixed64 항상 8바이트입니다. long int64
bool
boolean bool
string 문자열은 항상 UTF-8 인코딩 또는 7비트 ASCII 텍스트를 포함해야 하며 232보다 길 수 없습니다. String string
bytes 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)
}
}

위 내용은 微服务间的通信--Protobuf의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
이전 기사:다음 기사: