gRPC框架

1、gRPC 与 Protobuf 介绍

  • 微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间
    的通信就是个大问题
  • gRPC 可以实现微服务, 将大的项目拆分为多个小且独立的业务模块, 也就是服务,
    各服务间使用高效的protobuf 协议进行RPC 调用, gRPC 默认使用protocol buffers,
    这是 google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格
    式如JSON)
  • 可以用 proto files 创建 gRPC 服务,用 message 类型来定义方法参数和返回类型

参考文章:gRPC教程

2、Mac下安装Protobuf和gRPC

参考文章:https://cloud.tencent.com/developer/article/2163004

brew命令安装

1. 安装的是 gRPC 的核心库
brew install grpc2. 安装的是protocol编译器
brew install protobuf3. 各个语言的代码生成工具,对于 Golang 来说,称为 protoc-gen-go
brew install protoc-gen-go
brew install protoc-gen-go-grpc

查看安装是否成功

apple@appledeMacBook-Pro ~ % protoc --version
libprotoc 25.1
apple@appledeMacBook-Pro ~ % protoc-gen-go --version
protoc-gen-go v1.31.0
apple@appledeMacBook-Pro ~ % protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.3.0

如果查不到指令,检查一下环境变量

export GOPATH="/Users/apple/go"
export PATH=$PATH:$GOPATH/bin

3、Demo1

3.1 目录结构

实现服务端和客户端的数据传输

├── client
│   └── client.go
├── go.mod
├── go.sum
├── proto
│   └──  user.proto
└── server└── server.go

3.2 user.proto编写

// 编译指令:protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/user.proto// 版本号
syntax = "proto3";// 生成文件所在的目录
option go_package="/proto";// 制定生成 user.pb.go 的包名
package proto;// 定义message服务端响应的数据格式,相当于结构体,
message UserInfoResponse {// 定义字段,相当于结构体的属性int32 id = 1;string name = 2;int32 age = 3;// 字段修饰符,repeated表示可以重复出现,就是可变数组,类似于切片类型repeated string hobbies = 4;
}// 定义message客户端请求的数据格式,相当于结构体,
message UserInfoRequest {// 定义字段,相当于结构体的属性string name = 1;
}// 定义一个service服务,相当于接口
service UserInfoService {// 定义一个rpc方法,相当于接口方法// 定义请求参数为UserInfoRequest,返回值为UserInfoResponserpc GetUserInfo(UserInfoRequest) returns (UserInfoResponse);
}

执行编译指令

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/user.proto

这是一个使用 Protocol Buffers(protobuf)和 Go gRPC 插件生成代码的示例命令。该命令根据 proto/user.proto 文件生成对应的 Go 代码。

这个命令的参数含义如下:

--go_out=.:指定生成的 Go 代码输出目录为当前目录。
--go_opt=paths=source_relative:设置生成的 Go 代码中的导入路径为相对于源文件的相对路径。
--go-grpc_out=.:指定生成的 Go gRPC 代码输出目录为当前目录。
--go-grpc_opt=paths=source_relative:设置生成的 Go gRPC 代码中的导入路径为相对于源文件的相对路径。
proto/user.proto:指定要生成代码的 protobuf 文件路径。

最后会在proto目录下生成user.pb.go和user_grpc.pb.go

  • user.pb.go:这个文件包含了用户自定义的消息类型的定义,它描述了在通信过程中需要传输的数据结构,比如用户信息、请求参数等。
  • user_grpc.pb.go:这个文件包含了用户自定义的服务接口的定义,它描述了可以远程调用的方法和参数,以及返回值等。

3.3 server服务端

package mainimport ("context""fmt"pb "main/proto""net""google.golang.org/grpc"
)// 定义服务端实现约定的接口
type UserInfoService struct {pb.UnimplementedUserInfoServiceServer
}// 实现服务端需要实现的接口
func (s *UserInfoService) GetUserInfo(ctx context.Context, req *pb.UserInfoRequest) (resp *pb.UserInfoResponse, err error) {// 服务端接收参数name,再进行业务操作name := req.Nameif name == "zs" {resp = &pb.UserInfoResponse{Id:      1,Name:    name,Age:     18,Hobbies: []string{"swimming", "running"},}}err = nilreturn
}func main() {// 1. 监听addr := "127.0.0.1:8080"lis, err := net.Listen("tcp", addr)if err != nil {fmt.Println("监听异常, err = ", err)return}fmt.Println("开始监听:", addr)// 2. 实例化gRPCs := grpc.NewServer()// 3. 在gRPC上注册微服务,第二个参数要接口类型的变量pb.RegisterUserInfoServiceServer(s, &UserInfoService{})// 4. 启动gRPC服务端s.Serve(lis)
}

3.4 client客户端

package mainimport ("context""fmt"pb "main/proto""google.golang.org/grpc"//"google.golang.org/grpc/credentials/insecure"
)func main() {// 1. 创建与gRPC服务器的连接addr := "127.0.0.1:8080"conn, err := grpc.Dial(addr, grpc.WithInsecure())if err != nil {fmt.Println("连接异常, err = ", err)return}defer conn.Close()// 2. 实例化gRPC客户端client := pb.NewUserInfoServiceClient(conn)// 3. 组装参数req := new(pb.UserInfoRequest)req.Name = "zs"// 4. 调用接口resp, err := client.GetUserInfo(context.Background(), req)if err != nil {fmt.Println("响应异常, err = ", err)return}fmt.Println("响应结果, resp = ", resp)
}

3.5 编译

先执行服务端,再执行客户端
在这里插入图片描述

4、Demo2

4.1 目录结构

├── client
│   └── client.go
├── go.mod
├── go.sum
├── proto
│   └── hello.proto
└── server└── server.go

4.2 hello.proto

// 编译指令:protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/hello.protosyntax = "proto3";option go_package="/proto";package Business;service Hello {rpc Say (SayRequest) returns (SayResponse);
}message SayResponse {string Message = 1;
}message SayRequest {string Name = 1;
}

4.3 server服务端

package mainimport ("context""fmt""google.golang.org/grpc""main/proto""net"
)type server struct {proto.UnimplementedHelloServer
}func (s *server) Say(ctx context.Context, req *proto.SayRequest) (*proto.SayResponse, error) {fmt.Println("request:", req.Name)return &proto.SayResponse{Message: "Hello " + req.Name}, nil
}func main() {listen, err := net.Listen("tcp", ":8001")if err != nil {fmt.Printf("failed to listen: %v", err)return}s := grpc.NewServer()proto.RegisterHelloServer(s, &server{})//reflection.Register(s)defer func() {s.Stop()listen.Close()}()fmt.Println("Serving 8001...")err = s.Serve(listen)if err != nil {fmt.Printf("failed to serve: %v", err)return}
}

4.4 client客户端

package mainimport ("bufio""context""fmt""main/proto""os""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"
)func main() {var serviceHost = "127.0.0.1:8001"conn, err := grpc.Dial(serviceHost, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)}defer conn.Close()client := proto.NewHelloClient(conn)rsp, err := client.Say(context.TODO(), &proto.SayRequest{Name: "BOSIMA",})if err != nil {fmt.Println(err)}fmt.Println(rsp)fmt.Println("按回车键退出程序...")in := bufio.NewReader(os.Stdin)_, _, _ = in.ReadLine()
}

4.5 编译

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277613.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根文件系统(一):基础

本文主要探讨210根文件系统相关知识。 根文件系统 存储设备(flash等)是分块(扇区),访问存储设备是按块号 (扇区号)来访问,文件系统(软件)对存储设备扇区进行管理,将对扇区的访问变成对目录和文件名的访问 根文件系统init进程的应用程序和其他应用程序,提供根目…

6年级学生C++零基础,学过Scratch少儿编程,学习CSP-J的年度计划表

我是一个6年级学生C零基础,只学过一些Scratch少儿编程知识,准备明年参加信息学奥赛的CSP-J比赛,请为我写个学习计划,以下是一个针对学生的情况制定的学习计划: **学习目标:** 1. 掌握C编程语言的基本语法和…

应对.mkp勒索病毒:专业咨询和恢复数据的有效方案

导言: 一种新型的恶意软件威胁——.mkp勒索病毒,以其毒瘤般的加密技术带来了巨大的数据安全风险。本文将深入介绍.mkp勒索病毒的特性、应对策略,以及如何通过强有力的预防措施将其风险降至最低。如果您正在经历勒索病毒的困境,欢…

Linux服务器开发太麻烦? 试试IntelliJ IDEA公网远程访问开发极大提升开发效率

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

3. Prism系列之模块化

Prism系列之模块化 一、前言 为了构成一个低耦合,高内聚的应用程序,我们会把程序分层,拿一个WPF程序来说,我们通过MVVM模式去将一个应用程序的分成View-ViewModel-Model,大大消除之前业务逻辑和界面元素之间存在的高耦…

C语言刷题数组------数组交换

输入一个长度为 10的整数数组 X[10],将里面的非正整数全部替换为 1,输出替换完成后的数组。 输入格式 输入包含 10个整数,每个整数占一行。输出格式 输出新数组中的所有元素,每个元素占一行。输出格式为 X[i] x,其中…

geolife笔记:比较不同轨迹相似度方法

1 问题描述 在geolife 笔记:将所有轨迹放入一个DataFrame-CSDN博客中,已经将所有的轨迹放入一个DataFrame中了,我们现在需要比较,在不同的轨迹距离度量方法下,轨迹相似度的效果。 这里采用论文笔记:Deep R…

C# WPF上位机开发(利用tcp/ip网络访问plc)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 c# wpf如果是用来开发非标上位机的,那么和plc的通信肯定是少不了的。而且,大部分plc都支持modbus协议,所以这个…

基于ssm企业人事管理系统的设计与实现论文

摘 要 进入信息时代以来,很多数据都需要配套软件协助处理,这样可以解决传统方式带来的管理困扰。比如耗时长,成本高,维护数据困难,数据易丢失等缺点。本次使用数据库工具MySQL和编程技术SSM开发的企业人事管理系统&am…

python:五种算法(CSO、WOA、GWO、DBO、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、鸡群优化算法CSO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、粒子群优化算法PSO 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary programming…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR(Optical Character Recognition)引擎,用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

一款提高嵌入式代码质量的工具

我们通常认为,在中断中,不能执行耗时的操作,否则会影响系统的稳定性,尤其对于嵌入式编程。 ​ 对于带操作系统的程序而言,可以通过操作系统的调度,将中断处理分成两个部分,耗时的操作可以放到线…