go grpc

Posted 努力升级中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go grpc相关的知识,希望对你有一定的参考价值。

相关定义

  • .proto文件中定义一个服务。

  • 使用protocol buffer编译器生成客户端和服务端代码。

  • 使用gRPC的Go API为你的服务写一个客户端和服务器。

安装grpc包

go get google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go

设置环境变量

export PATH=$(go env GOPATH)/bin:$PATH

Server

目录结构

grpc-server/
├── go.mod
├── go.sum
├── grpc-server.iml
├── proto
│   ├── demo.pb.go
│   └── demo.proto
├── server.go
└── service
    └── get_data.go

定义proto文件

syntax = "proto3";

package proto;
option go_package = ".;proto";

service Demo {
  rpc GetData(DemoReq) returns (DemoRsp){}
}

message DemoReq {
  string a = 1// 请求参数a
}

message DemoRsp{
  string rel = 1// 返回参数值
}

生成pb.go文件

protoc --go_out=plugins=grpc,paths=source_relative:. *.proto

demo.pb.go文件生成

server.go

package main

import (
    "fmt"
    "google.golang.org/grpc"
    "grpc-server/proto"
    "grpc-server/service"
    "log"
    "net"
)

const grpcPort = 6655

func main() {
    l, err := net.Listen("tcp", fmt.Sprintf(":%d", grpcPort))
    if err != nil {
        log.Fatal(err)
    }

    g := grpc.NewServer()

    //注册server,使用service.go文件中的Demo方法
    proto.RegisterDemoServer(g, &service.Demo{})

    if err = g.Serve(l); err != nil {
        log.Fatal(err)
    }
}

service.go

package service

import (
    "context"
    "grpc-server/proto"
)

type Demo struct {
}

// 方法实现,直接把请求参数返回
func (c Demo) GetData(ctx context.Context, msg *proto.DemoReq) (*proto.DemoRsp, error) {
    params := msg.A
    return &proto.DemoRsp{
        Rel: params,
    }, nil
}

client

目录结构

grpc-client/
├── client.go
├── go.mod
├── go.sum
└── proto
    ├── demo.pb.go
    └── demo.proto

文件拷贝

Server服务生成的demo.pb.go文件拷贝到Client目录中。

client.go

package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    "grpc-client/proto"
)

const (
    grpcAddr = "127.0.0.1:6655"
)

func main()  {
    c, err := grpc.Dial(grpcAddr, grpc.WithInsecure())
    if err != nil {
        panic(c)
    }

    // 发送grpc请求  请求参数为123
    rsp, err := proto.NewDemoClient(c).
        GetData(context.Background(), &proto.DemoReq{
            A: "123",
    })

    // 打印返回的值
    fmt.Println(rsp)
}

代码地址

https://github.com/iarno/grpc-demo.git


以上是关于go grpc的主要内容,如果未能解决你的问题,请参考以下文章

grpc-go客户端源码分析

gRPC-go服务端实现简析

Go 中的 gRPC 入门详解

[go]grpc远程接口调用实现

go grpc

go-chassis 为 grpc-go 带来高级云原生特性