golang grpc demo

1.grpm 安装:

git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc

2.proto, protoc-gen-go 安装:

go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

3.protoc 安装:

git clone https://github.com/protocolbuffers/protobuf.git
cd $GOPATH/src/github.com/protocolbuffers/
./autogen.sh
./configure
make -j12
make install

4.go-genproto 安装(运行时需要的依赖,下载完移动到相应的目录里面)

git https://github.com/googleapis/go-genproto.git

5.protoc 查看版本:

[root@wangjq]# protoc --version
libprotoc 3.10.0

 6.目录结构:

[root@wangjq demo]# tree
.
├── client
│   └── main.go
├── example
│   └── data.proto
└── server
    └── main.go

3 directories, 4 files

7.data.proto 内容如下

syntax = "proto3"; //指定proto版本

package proto;

//定义请求结构
message HelloRequest{
    string name=1;
}

//定义响应结构
message HelloReply{
    string message=1;
}

//定义Hello服务
service Hello{
    //定义服务中的方法
    rpc SayHello(HelloRequest) returns (HelloReply){}
}

8.生成 data.pb.go 文件

protoc -I . --go_out=plugins=grpc:. ./data.proto 

9.服务端代码

package main

import (
    pb "demo/example"
    "fmt"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
    "net"
)

const (
    //gRPC服务地址
    Address = "127.0.0.1:50052"
)

//定义一个helloServer并实现约定的接口
type helloService struct{}

func (h helloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    resp := new(pb.HelloReply)
    resp.Message = "hello" + in.Name + "." 
    return resp, nil 
}

var HelloServer = helloService{}

func main() {
    listen, err := net.Listen("tcp", Address)
    if err != nil {
        fmt.Printf("failed to listen:%v", err)
    }

    //实现gRPC Server
    s := grpc.NewServer()
    //注册helloServer为客户端提供服务
    pb.RegisterHelloServer(s, HelloServer) //内部调用了s.RegisterServer()
    fmt.Println("Listen on" + Address)

    s.Serve(listen)
}

10.客户端代码

package main

import (
    pb "demo/example"
    "fmt"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)

const (
    Address = "127.0.0.1:50052"
)

func main() {
    //连接gRPC服务器
    conn, err := grpc.Dial(Address, grpc.WithInsecure())
    if err != nil {
        fmt.Println(err)
    }   
    defer conn.Close()

    //初始化客户端
    c := pb.NewHelloClient(conn)

    //调用方法
    reqBody := new(pb.HelloRequest)
    reqBody.Name = "gRPC"
    r, err := c.SayHello(context.Background(), reqBody)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(r.Message)
}

11.运行测试

服务端运行:
[root@wangjq demo]# go run server/main.go 
Listen on127.0.0.1:50052

客户端运行:
[root@wangjq demo]# go run client/main.go 
hellogRPC.

 

转载于:https://www.cnblogs.com/wangjq19920210/p/11572283.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值