教育、医疗、养老、住房,新的四座大山。
一、基础
IPC、LPC、RPC
- 进程间通信IPC(Inter-Process Communication),是指不同进程之间传递、交换数据的一些方法和技术。
- 通信技术主要包括管道、信号、消息队列、共享内存、信号量、socket
- 这些进程可以运行在同一计算机上或通过网络连接的不同计算机上
- IPC通信目的
- 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
- 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
- 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
- 有两种类型的进程间通信方式,即LPC和RPC。
- 本地过程调用LPC(Local Procedure Call)
- 远程过程调用RPC(Remote Procedure Call)
- 进程间通信IPC(Inter-Process Communication),是指不同进程之间传递、交换数据的一些方法和技术。
RPC与HTTP
- RPC是一种思想,或者说是一种设计,主要用于解决不同服务之间的调用问题,一般实现RPC会包含传输协议和序列化协议两个部分。
- HTTP是一种超文本传输协议,主要用于规范通信双方的通信格式。
- RPC的实现可以基于HTTP,也可以基于TCP或UDP等,主要看应用场景和不同的RPC框架底层选择。
gRPC,谷歌出品,RPC框架的一种,是一个高性能、开源、多语言支持、通用RPC框架。它是一个高性能、通用的开源RPC框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发,支持众多的开发语言。
protobuf,谷歌出品,一个语言无关平台无关、效率极高、二进制的数据序列化工具,在rpc或tcp通信等很多场景都可以使用。
- 语法规则
- 特性
二、实战
1 | GOPATH="/Users/liuyulong/go" |
MacOS + Golang as server and client
安装protoc,protobuf文件的编译器(或者叫解释器、翻译器),用于将
.proto
文件编译为指定语言的类库- 源码安装,省略
- brew安装
- brew install protobuf
- 安装完成后查看版本
protoc --version
,博主当前用的版本是libprotoc 3.13.0
,想要安装别的版本可以brew search protobuf
- 安装完成后查看版本
- brew install protobuf
安装插件
- go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
- go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
修改Path
export PATH="$PATH:$(go env GOPATH)/bin"
创建项目目录
mkdir grpc
创建项目文件夹
cd grpc && mkdir client pb service
编写
.proto
文件cd bp && vim my.proto
1 | syntax = "proto3"; |
编译
.proto
文件protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./my.proto
,会自动生成my_grpc.pb.go
和my.pb.go
- 报错:
--go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC
- 解决
- 方案一:使用
go-grpc_out=
代替--go_out
- 方案二:重新安装
- 报错
package google.golang.org/protobuf/types/descriptorpb: unrecognized import path "google.golang.org/protobuf/types/descriptorpb": https fetch: Get "https://google.golang.org/protobuf/types/descriptorpb?go-get=1": dial tcp 142.251.43.17:443: i/o timeout
- 解决
- go env -w GO111MODULE=on
- go env -w GOPROXY=https://goproxy.cn,direct
- 报错
- 方案一:使用
- 报错:
编写server端代码
cd service && vim server.go
1 | package main |
- 编写client端代码
cd client && vim client.go
1 | package main |
使用go mod下载相关依赖
- cd grpc
- go mod init grpc
- go mod tidy
开始测试
- go run service/server.go
- go run client/client.go liusir
MacOS + Go as server + PHP as client
- 目录规划
- cd /Users/liuyulong/go/src
- mkdir grpc-go-php
- cd grpc-go-php
- Go环境准备,省略
- PHP环境准备
- PHP安装gRPC扩展
- PHP安装protobuf扩展
- 编写proto文件
- protoc –go-grpc_out=../services Prod.proto
- 编写server.go
- 编写client.php
MacOS + Go as server(net/rpc/jsonrpc) + PHP as client
- server.go
1 | package main |
- client.php
1 | <?php |
- go run server.go
- php client.php