golang使用grpc

(1) 安装protoc,这是通用的,所有语言都需要

​# 下载网址:

https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip

解压后将将protoc的bin目录添加到环境变量中  如果不会添加环境变量请百度

运行 protoc --version 查看是否已经添加到环境变量

 

(2)go install google.golang.org/protobuf/cmd/protoc-gen-go@latest  我好像没有用到

 解释:因为protoc没有内置go生成器,想实现.proto->.go的转换的话还需要安装protobuf的golang编译器插件protoc-gen-go,用于生成go文件

 安装后会在GOBIN目录下生成可执行文件,执行protoc命令会自动调用protobuf的编译器插件protoc-gen-go插件

(3) 新建golang项目 我使用的是goland  go版本用1.21  刚开始用1.16会运行不了

在项目新建文件夹 grpc_proto   在此文件夹下编写一个 hello.proto

syntax = "proto3"; // 指定proto版本
package hello_grpc;     // 指定默认包名
 
// 指定golang包名
option go_package = "/hello_grpc";
 
//定义rpc服务
service HelloService {
  // 定义函数
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
 
// HelloRequest 请求内容
message HelloRequest {
  string name = 1;
  string message = 2;
}
 
// HelloResponse 响应内容
message HelloResponse{
  string name = 1;
  string message = 2;
}

(4) 在grpc_proto 文件夹下运行 protoc -I . --go_out=plugins=grpc:. .\hello.proto  会在此文件夹下生成一个 

hello_grpc 文件夹  hello.grpc文件夹下会有 hello.pb.go 
(5)编写客户端和服务端代码 到项目根目录下 go mod tidy 拉取依赖包
编写server.go
package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    "google.golang.org/grpc/grpclog"
    "grpc/grpc_proto/hello_grpc"
    "net"
)

// HelloServer 得有一个结构体,需要实现这个服务的全部方法,叫什么名字不重要
type HelloServer struct {
}

func (HelloServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (*hello_grpc.HelloResponse, error) {
    fmt.Println("入参:", request.Name, request.Message)
    return &hello_grpc.HelloResponse{
        Name:    "server",
        Message: "hello " + request.Name,
    }, nil
}

func main() {
    // 监听端口
    listen, err := net.Listen("tcp", ":8080")
    if err != nil {
        grpclog.Fatalf("Failed to listen: %v", err)
    }

    // 创建一个gRPC服务器实例。
    s := grpc.NewServer()
    server := HelloServer{}
    // 将server结构体注册为gRPC服务。
    hello_grpc.RegisterHelloServiceServer(s, &server)
    fmt.Println("grpc server running :8080")
    // 开始处理客户端请求。
    err = s.Serve(listen)
}

编写client.go

package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    "grpc/grpc_proto/hello_grpc"
    "log"
)

func main() {
    addr := ":8080"
    // 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。
    // 此处使用不安全的证书来实现 SSL/TLS 连接
    conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
        log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))
    }
    defer conn.Close()
    // 初始化客户端
    client := hello_grpc.NewHelloServiceClient(conn)
    result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{
        Name:    "client",
        Message: "hello",
    })
    fmt.Println(result, err)
}

分别运行 go run server.go        go run client.go

 

 成功  

posted @ 2024-06-24 10:30  fly_fly_fly#  阅读(3)  评论(0编辑  收藏  举报