Appearance
Golang 语言
RPC
服务器端注册
go
package main
import (
"fmt"
"net"
"net/rpc"
)
type Pople struct {
name string
age int
}
func (this *Pople) HelloWorld(name string, resp *string) error {
*resp = "hello" + name
return nil
}
func main() {
err := rpc.RegisterName("hello", new(Pople))
if err != nil {
fmt.Println(err)
return
}
listener, err := net.Listen("tcp", "127.0.0.1:8000")
defer listener.Close()
if err != nil {
fmt.Println(err)
return
}
conn, err := listener.Accept()
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
rpc.ServeConn(conn)
}
客户端
go
package main
import (
"fmt"
"net/rpc"
)
func main() {
conn, err := rpc.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
var reply string
err = conn.Call("hello.HelloWorld", "libai", &reply)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("1:", reply)
}
gRPC
什么是gRPC
gRPC 是Google公司开发的一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 官方网站 - 英文
在 gRPC
里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。
与许多 RPC
系统类似,gRPC
也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。
在服务端实现这个接口,并运行一个 gRPC
服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
protocol buffers
gRPC
默认使用 protocol buffers
,这是 Google
开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON
)。正如你将在下方例子里所看到的,你用 proto files
创建 gRPC
服务,用 protocol buffers
消息类型来定义方法参数和返回类型。你可以在 Protocol Buffers 文档找到更多关于 Protocol Buffers
的资料。
安装
Mac osx 安装方法:
sh
$ brew install protobuf
// 更新到最新的版本
$ brew upgrade protobuf
编译protobuf
文件
golang编译方法:
sh
$ protoc --go_out=./ *.proto
安装protobuf go plugin
sh
$ brew install protoc-gen-go
or
$ go get -u github.com/golang/protobuf/protoc-gen-go
安装 gRPC plugin
sh
$ brew install protoc-gen-go-grpc
带有RPC的proto文件
protobuf
syntax = "proto3";
option go_package="./;myproto";
package pb;
enum Week {
Monday = 0;
turestday = 1;
}
message Student {
int32 age = 1;
string name = 2;
People p =3;
repeated int32 score = 4;
Week w = 5;
oneof data {
string teacher = 6;
string class = 7;
}
}
message People {
int32 weight = 1;
}
// add server
service bj38 {
rpc Say(People) returns (Student);
}
编译带有RPC的proto文件
sh
$ protoc --go-grpc_out=./ *.proto
安装gRPC
sh
$ go get -u -v google.golang.org/grpc