위 사진은 분해된 SONY 카메라로, 작동할 때 각자의 역할을 수행하며, 잘하는 일만 합니다. 오늘날의 세계화된 세계에서 대부분의 우수한 제품은 더 나은 서비스와 기술을 추구하면서 한 지점에서 발전하고 있습니다.
사실 소프트웨어 기술도 마찬가지고, 세계화의 축소판에 가깝습니다.
Microservices 시간이 흐르고 기술이 계속 발전하면서 업계에서는 다음과 같은 특징을 조용히 형성해 왔습니다.
특정 마이크로서비스는 HTTP 등 전체 아키텍처에 걸쳐 통신 프로토콜을 통해 서로 정보를 전송합니다.
마이크로서비스는 독립적으로 배포될 수 있습니다.
마이크로서비스는 비즈니스와 관련된 특정 기능을 구성합니다.
마이크로서비스는 서비스를 구현하는 언어, 데이터베이스, 하드웨어 및 소프트웨어 환경에만 국한되지 않습니다.
서비스는 세분화되어 있고 메시지를 지원하며 상황에 따라 다르며 자동화된 프로세스를 통해 구축 및 출시됩니다.
위 요약에서 마이크로서비스 간의 정보 상호작용은 전체 MSA(Microservice Architecture)의 기초입니다. 통신 protocol의 품질은 이를 기반으로 서비스가 구축되는지 여부를 결정합니다. 간단하고 간단합니다. 효율적이고 안정적이며 확장 가능하며 유지 관리가 쉽습니다. 제품의 궁극적인 구현은 사용자 경험입니다. 특히 결제, 광고 입찰 등과 같이 빠른 응답이 필요한 서비스의 경우 더욱 그렇습니다. 그리고 Protocol Buffers(일반적으로 Protobuf라고도 함)가 그중 최고입니다.
이유는 다음 글을 참고하시기 바라며 여기서는 자세히 다루지 않겠습니다.
Protobuf로 JSON 성능 향상 LINK
먼저 아주 간단한 예를 살펴보겠습니다. 로그인 요청을 정의해야 한다고 가정하겠습니다. , 이 로그인 요청에는 사용자 이름
用户名
、密码
、重试次数
。我们可以将这个请求定义在一个后缀为.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++ 中的两种注释风格
斜线加星号 /* ... */
双斜线 //
到 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) } }
위 내용은 微服务间的通信--Protobuf의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!