30

golang使用grpc

 5 years ago
source link: https://studygolang.com/articles/19476?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

golang使用grpc

目前正在学习后端有关概念, 了解到了grpc. 本文将简述一个简单demo的搭建.

rpc理解

我的网络通信概念还停留在比较基础的地方, 直觉来说就是发送一个get/post请求, 设定一定的参数格式, 这样对方再解析你的数据, 基于此完成通讯.

而rpc则不使用这种显式的通讯方式, 通过proto与生成grpc文件, 里面提供方法, 供client与server通过方法来进行通讯. 简单来说, 就是如果你以前要告诉server你好, 需要发送一个完整网络请求, 但是现在你只需要调用一个hello方法就可以了

环境依赖以及安装

  • golang
  • grpc
    go get -u google.golang.org/grpc
  • protoc
    go get -u github.com/golang/protobuf/protoc-gen-go
  • 环境变量配置
    export PATH=$PATH:$GOPATH/bin

项目目录结构

grpc_test/
|-- client
|   `-- client.go
|-- proto
|   |-- greeter.pb.go
|   `-- greeter.proto
`-- server
    `-- server.go

DEMO

1. 编写proto文件

syntax = "proto3";
  package proto;

  service Hello {
      rpc Hello (Request) returns (Response) {}
  }
  message Request {
      string Name = 1;
  }
  message Response {
      string Msg = 1;
  }

非常简单, 提供了request, response对象, 并且提供了hello方法.

2. 生成grpc文件

执行 protoc -I ./ ./greeter.proto --go_out=plugins=grpc:../proto/
前面的./与./greeter.proto是上面的proto文件的文件夹以及文件, 后面的../proto是输出目录, 运行成功的时候, 会生成 greeter.pb.go 文件. 有兴趣可以详细去读里面的代码.

3. 编写服务端脚本

package main
import (
    "fmt"
    "net"
    "context"
    grpc "google.golang.org/grpc"
    proto "grpc_test/proto"     // 引用刚才生成grpc代码
)

const(
    Address = "127.0.0.1:8801"   // 监听的端口
)

type Greeter struct {}
// 实现proto中定义的hello方法
func (greeter *Greeter) Hello(ctx context.Context, request *proto.Request) (*proto.Response, error){
    fmt.Println("get client info, name is: ", request.Name)
    response_msg := "Hello " + request.Name
    return &proto.Response{Msg:response_msg}, nil 
}

func main(){
    service := Greeter{}
    conn, err := net.Listen("tcp", Address)   // tcp监听端口
    if err != nil{
        fmt.Println(err)
        return
    }   
    fmt.Println("tcp listening...")
    defer conn.Close()
    server := grpc.NewServer()
    proto.RegisterHelloServer(server, &service)  // 将tcp服务于grpc进行绑定
    fmt.Println("server serve.....")
    if err := server.Serve(conn); err != nil{
        fmt.Println(err)
        return
    }   
}

4. 编写客户端脚本

package main

import (
    "context"
    "fmt"
    grpc "google.golang.org/grpc"
    proto "grpc_test/proto"    //引用grpc代码
)

const(
    Address = "127.0.0.1:8801"    // 服务监听的端口
)

func main() {
    conn, err := grpc.Dial(Address, grpc.WithInsecure())
    if err != nil{
        fmt.Println(err)
    }   
    defer conn.Close()
    client := proto.NewHelloClient(conn)    //  自动生成方法, 因为proto文件中service的名字是hello
    name := "jhonsmith"
    result, err := client.Hello(context.Background(), &proto.Request{Name:name})   // 调用grpc方法, 对服务端进行通讯
    if err != nil{
        fmt.Println(err)
    }   
    fmt.Println("I see, u see. I say ", name, "u say ", result.Msg)
}

終わり。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK