Skip to content

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