一、文件结构
server端和client端分布在两个不同的集群里,可以通过下发mq消息,或者grpc连接传递消息,这里介绍通过grpc建立连接,第一步是创建proto文件,要传递的方法和变量都在这里定义
sendData/
├── data.proto
└── log
二、创建data.proto文件
注意,如果server端和client端不在同一集群,两边都要创建proto文件
syntax = "proto3"; //指定protobuf的版本
package sendData; //声明一个包名,一般与文件目录名相同
// service里定义建立连接的方法sayHello
service Connect {
rpc sayHello (HelloRequest) returns (HelloReply) {}
}
// 定义传递结构体
message HelloRequest {
string name = 1;
int age = 2;
Data data = 3; //传递的数据的顺序从上到下排列,类型也可以是结构体
}
message Data {
string phone = 1;
}
message HelloReply {
string message = 1; // message在data.pb.go里会变成Message
}
运行:protoc --go_out=plugins=grpc:. data.proto
运行完毕后目录结构
sendData/
├── data.proto
├── data.pb.go
└── log
三、创建client.go
package main
import (
"log"
"os"
pb "amber/sendData"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const (
address = "localhost:50001"
)
func main() {
//client端主动发起grpc连接,dial对方
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("dial to server with error : %v", err)
}
defer conn.Close() //一定不忘忘记关闭连接
c := pb.NewConnectClient(conn)
if c== nil {
log.Fatalf("connect to server with error : %v", err)
}
//生成的pb.go里的结构体可以被外部引用
data:= &pb.Data{Phone:"130-4472-0078"}
resp, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "amber",Data:data})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
//打印HelloReply里message的内容
log.Println(resp.Message)
}
四、创建server.go
package main
import (
"log"
"net"
pb "amber/sendData"
"google.golang.org/grpc"
"golang.org/x/net/context"
)
const (
PORT = ":50001"
)
type server struct {} //定义空结构体,关联server服务
// 重写SayHello方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Println("request: ", in.Name)
return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", PORT) //port与client发起dial的一致
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterConnectServer(s, &server{}) //注册服务到grpc的sever端,RegisterConnectServer是proto里service生成
log.Println("rpc服务已经开启")
s.Serve(lis) //建立连接,开始服务
}