풀어 주다: 2023-07-24 15:26:10
앞으로
719명이 탐색했습니다.

1. 개요

위 사진은 분해된 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 TypeNotesJava TypeGo Type
double
더블float64
float
floatfloat32
int32가변 길이 인코딩을 사용합니다. 음수 인코딩에는 비효율적입니다. 필드에 음수 값이 있을 가능성이 있으면 대신 sint32를 사용하세요.intint32
int64가변 길이 인코딩을 사용합니다. 음수 인코딩에 대한 비효율-필드가 음수 값을 가질 가능성이있는 경우 SINT64를 대신 사용하십시오. intuint32
uint64가변 길이 인코딩을 사용합니다.longuint64
sint32 가변 길이 인코딩을 사용합니다. 부호 있는 int 값. 이는 일반 int32보다 음수를 더 효율적으로 인코딩합니다.intint32
sint64가변 길이 인코딩을 사용합니다. 부호 있는 int 값. 이는 일반 int64보다 음수를 더 효율적으로 인코딩합니다.longint64
fixed32항상 4바이트입니다. 값이 종종 228보다 큰 경우 uint32보다 효율적입니다.intuint32
fixed64항상 8바이트입니다. 값이 종종 256보다 큰 경우 uint64보다 효율적입니다.longuint64
sfixed32항상 4바이트입니다.int int32
sfixed64항상 8바이트입니다.longint64
bool
booleanbool
string문자열은 항상 UTF-8 인코딩 또는 7비트 ASCII 텍스트를 포함해야 하며 232보다 길 수 없습니다.String string
bytes232보다 길지 않은 임의의 바이트 시퀀스를 포함할 수 있습니다.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)
}
}
로그인 후 복사

위 내용은 의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Go语言进阶学习
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿