gRPC 1 helloworld go-lang

Submitted by Lizhe on Sat, 12/26/2020 - 05:37

 

运行起来的话大概是这样

 

20201225213517

从零开始

1. 先安装 golang

sudo apt install golang

添加环境变量

export GOROOT=/usr/lib/go
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT:$GOPATH:$GOBIN

2. 安装git

sudo apt install git

3. 安装 grpc 依赖

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

4. 添加 go.mod 文件

 

module helloworld

require (
    google.golang.org/grpc v1.29.1
    google.golang.org/protobuf v1.25.0
)

go 1.13
 

5. 安装 protoc 工具

sudo apt-get install autoconf automake libtool curl make g++ unzip

git clone https://github.com/google/protobuf.git

cd protobuf

git submodule update --init --recursive

./autogen.sh

./configure

make

make check

sudo make install

sudo ldconfig

protoc --version

 

切换到项目工作目录

cd grpc_go/

创建文件/home/lizhe/works/grpc_go/pbfiles/Hi.proto

 

syntax="proto3";  //
package services;
option go_package = "../services";
message HiRequest {
  string say = 1;
}
message HiResponse {
  string responed = 1;
}
service HiService {
    rpc GetHiResponed(HiRequest) returns (HiResponse);
}

切换到 pbfiles 文件夹

cd pbfiles

protoc --go_out=plugins=grpc:. Hi.proto

会生成 /home/lizhe/works/grpc_go/services/Hi.pb.go

创建文件 /home/lizhe/works/grpc_go/services/HiService.go

 

package services

import (
    "context"
    "fmt"
)

type HiService struct {
}

func (hs HiService) GetHiResponed(ctx context.Context, request *HiRequest) (*HiResponse, error) {
    fmt.Println("Say:" + request.Say)
    return &HiResponse{Responed: "helloworld"}, nil
}
 

 

创建 server.go

 

package main

import (
    "helloworld/services"
    "net"

    "google.golang.org/grpc"
)

func main() {
    rpcServer := grpc.NewServer()                                        // 创建grpc服务
    services.RegisterHiServiceServer(rpcServer, new(services.HiService)) // 注册,new方法中的是services包中定义的结构体HiService
    lis, _ := net.Listen("tcp", ":8081")                                 // 开启一个监听端口
    rpcServer.Serve(lis)                                                 // 启动服务
}
 

 

创建 client.go

 

package main

import (
    "context"
    "fmt"
    "helloworld/services"
    "log"

    "google.golang.org/grpc"
)

func main() {

    conn, err := grpc.Dial(":8081", grpc.WithInsecure())
    if err != nil {
        log.Println(err)
    }
    defer conn.Close()
    client := services.NewHiServiceClient(conn)
    resp, err := client.GetHiResponed(context.Background(), &services.HiRequest{Say: "Hello"})
    if err != nil {
        log.Println(err)
    }
    fmt.Println(resp.Responed)

}