前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go server和client通过grpc建立连接

go server和client通过grpc建立连接

原创
作者头像
IT工作者
发布2022-08-06 17:18:50
9710
发布2022-08-06 17:18:50
举报
文章被收录于专栏:程序技术知识程序技术知识

一、文件结构

server端和client端分布在两个不同的集群里,可以通过下发mq消息,或者grpc连接传递消息,这里介绍通过grpc建立连接,第一步是创建proto文件,要传递的方法和变量都在这里定义

sendData/

├── data.proto

└── log

二、创建data.proto文件

注意,如果server端和client端不在同一集群,两边都要创建proto文件

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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) //建立连接,开始服务
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档