IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Golang环境下Protobuf和gRPC安装配置及使用 -> 正文阅读

[网络协议]Golang环境下Protobuf和gRPC安装配置及使用

Protobuf简介

ProtobufProtocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式(协议)【与JSONXML数据格式一样用于数据传输时使用】,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC调用的协议。

Protobuf3 语法

Protobuf下载安装

需要先下载protoc执行器

1、到 https://github.com/protocolbuffers/protobuf/releases 分别下载Windows和Linux环境的执行器
2、选择最新版本的protoc下载
在这里插入图片描述
3、将下载的文件解压,将包中bin目录下的protoc.exe放到GOPATH/bin下。

Protobuf下Go、GRPC插件的安装

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1

至此使用Protobuf的准备工作就做完了

Protobuf结合Grpc的使用

项目结构

├─practice
│  │  go.mod
│  │  go.sum
│  │
│  ├─client
│  │  ├─sample_client
│  │  │      client.go
│  │
│  ├─proto
│  │  │  helloworld.proto
│  │
│  └─server
│      ├─simple_server
│      │      server.go
│

1、编辑helloword.proto

syntax = "proto3";

package proto;      // 包名
option go_package = '/grpc/service';    // 指定生成的go代码所存放的路径,不用提前创建

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

2、将helloword.proto生成go代码

# 进入存放.proto路径下
cd proto
# 生成代码
protoc --go_out=. --go-grpc_out=. *.proto

# 最后一个参数为源文件

3、生成后的目录结构

├─practice
│  │  go.mod
│  │  go.sum
│  │
│  ├─client
│  │  ├─sample_client
│  │  │      client.go
│  │
│  ├─proto
│  │  │  helloworld.proto
│  │  │
│  │  └─grpc
│  │      └─service
│  │              helloworld.pb.go
│  │              helloworld_grpc.pb.go
│  │
│  └─server
│      ├─simple_server
│      │      server.go
│

4、编辑client.go

package main

import (
    "context"
    "flag"
    "google.golang.org/grpc"
    "log"
    pb "practice/proto/grpc/service"
    "time"
)

const (
    defaultName = "world"
)

var (
    addr = flag.String("addr", "localhost:50051", "the address to connect to")
    name = flag.String("name", defaultName, "Name to greet")
)

func main() {
    flag.Parse()

    // 建立连接
    conn, err := grpc.Dial(*addr, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    // 实例化client
    c := pb.NewGreeterClient(conn)

    // 调用rpc,等待同步响应
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
}

5、server.go

package main

import (
    "context"
    "flag"
    "fmt"
    "google.golang.org/grpc"
    "log"
    "net"
    pb "practice/proto/grpc/service"
)

var (
    port = flag.Int("port", 50051, "The server port")
)

// server is used to implement helloworld.GreeterServer.
type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello" + in.GetName()}, nil
}

func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error)  {
    return &pb.HelloReply{Message: "Hello Again " + in.GetName()}, nil
}

func main() {
    flag.Parse()
    // 监听端口
    lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", *port))
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    // 实例化server
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    log.Printf("server listening at %v", lis.Addr())
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

6、运行

启动服务端

go run server/simple_server/server.go
2021/11/29 19:22:27 server listening at 127.0.0.1:50051

启动客户端

go run client/sample_client/client.go --name cui
2021/11/29 19:23:25 Greeting: Hellocui
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 12:07:35  更:2022-02-26 12:09:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:30:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码