server和client通过grpc建立连接

24 篇文章 1 订阅
一、文件结构

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) //建立连接,开始服务
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值