最简最速搭建grpc分布式服务的Mac系统开发环境

news2025/1/19 20:35:27

文章目录

  • 环境详情
  • 基本原理
    • 什么是 Protobuf
  • 工具安装
  • 环境搭建
    • 编写服务类的实现
    • 启动服务
  • 客户端测试

环境详情

  • golang 1.18

  • macOS Big Sur

  • protobuf 3

基本原理

整个RPC过程就是:

  1. 客户端 发送 数据(以字节流的方式)
  2. 服务端接收,并解析。 根据约定知道要知道执行什么。然后把结果返回客户端

RPC就是把——

  1. 上述过程封装下,使其操作更加优化
  2. 使用一些大家都认可的协议 使其规范化

那么——GRPC框架中采用了protobuf作为这个过程中消息传递的数据结构。

什么是 Protobuf

Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源。Protobuf可以用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。开发者可以通过Protobuf附带的工具生成代码并实现将结构化数据序列化的功能。



本教程将在接下来的内容中描述 .proto 文件的语法以及如何通过 .proto 文件生成数据访问类和 grpc 服务类,并以此为基础搭建简易的 grpc 服务端开发环境。

工具安装

新建工程,选择 go modules,配置 GOPROXY 等操作不再赘述;

  1. 下载grpc依赖

go get -u google.golang.org/grpc@v1.51.0

  1. brew 安装 protocol

brew install protobuf

安装后可以执行命令protoc,作为protocol编译器使用,能够通过中间文件 .proto 转译成各种语言的grpc文件

brew install protoc-gen-go

转译中间文件成go文件的插件

brew install protoc-gen-go-grpc

转译中间文件成go-grpc文件的插件。

注意:如果安装失败那可能是依赖安装失败,直接brew intall 安装依赖即可。

至此,工具和依赖安装完毕,接下来将构建工程。

环境搭建

工程 go-rpc-server 结构:

.

├── client.go ——用于编写客户端测试

├── go.mod

├── go.sum

├── main.go ——服务端的启动

├── pbfiles ——该目录用于放置原始proto文件

│ └── Prod.proto

├── services ——该目录用于放置转译出的go文件

首先新建 .proto 文件,该示例中演示用于展示商品库存的 API,因此取名为 Prod.proto ;

编辑有如下内容 :

syntax="proto3";
option go_package ="go-rpc-server/services"; //相对路径 和protoc的flag go_out拼接
//package services; //该选项配置后 客户端请求需要多加上services.的路径
message  ProdRequest {
  int32 prod_id =1;   //传入的商品ID
}
message ProdResponse{
  int32 prod_stock=1;//商品库存
}
//这里的内容其实可以独立配置一个.proto文件,因为 rpc 服务类的文件会独立于数据访问类
service ProdService {
  rpc GetProdStock (ProdRequest) returns (ProdResponse);
}

文档参考 Protocol Buffer Basics: Go


随后通过protoc生成——
1.数据访问类

protoc --go_out=./…/ pbfiles/Prod.proto

2.rpc服务类

protoc --go-grpc_out=./…/ pbfiles/Prod.proto

若报错

file

只需要在proto文件中加入
option go_package =“go-rpc-server/services”;
指定中间文件生成go文件的路径即可。

编写服务类的实现

值得一提的是从某个版本开始,服务类的实现接口发生了以下变化:

type ProdServiceServer interface {
	GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error)
	mustEmbedUnimplementedProdServiceServer() //这里是新增的
}

并且在生成的 grpc 服务类中有——

type UnimplementedProdServiceServer struct {
}

func (UnimplementedProdServiceServer) GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetProdStock not implemented")
}
func (UnimplementedProdServiceServer) mustEmbedUnimplementedProdServiceServer() {}

实现了上述接口;官方推荐我们在实现服务类时,嵌套该结构体。



因此有以下实现:

type ProdService struct {
	UnimplementedProdServiceServer
}

func (ps *ProdService) GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error) {
	return &ProdResponse{ProdStock: 233}, nil
}

接口返回了我们的 mock 数据;

启动服务

编写 main 函数,通过 net 包进行监听, 执行 go run main.go

func main() {
	rpcServer := grpc.NewServer()
	services.RegisterProdServiceServer(rpcServer, new(services.ProdService))

	lis, _ := net.Listen("tcp", ":8087")

	rpcServer.Serve(lis)
}

至此,我们的 grpc 服务端环境搭建完毕。

客户端测试

多的不说,直接上客户端代码:

func main() {
	cli, _ := grpc.DialContext(context.Background(),
		"localhost:8087",
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	)
	req := &services.ProdRequest{}
	rsp := &services.ProdResponse{}
	err := cli.Invoke(context.Background(),
		"/ProdService/GetProdStock", req, rsp)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(rsp.ProdStock)
}

执行go run client.go,于是有:

file



搞定!

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 大型线上商城项目实战教程试学(文末视频版)

视频链接在文末 在学习一门技术的时候,相信很多开发者会在开源网站上寻找对应技术栈的开源项目,通过阅读源码,学习项目作者的开发思路、解决问题的方法,这一过程,对大多人来说没那么容易,要么一开始不知从…

共享模型之管程(八)

1.线程的活跃性 1>.定义: 线程内的有限代码因为某种原因一直无法执行完毕(/执行不完); 1.1.线程活跃性的现象-死锁 1>.有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁; 2>.案例 ①.t1线程已经获得A对象锁,接下来想获取B对象的锁; ②.t2线…

Python和MySQL对比(4):用Pandas 实现MySQL的行列转换语法效果

文章目录一、前言二、语法对比数据表concat(多列合并为一列)group_concat(多行合并为一行)一列拆分为多列一行拆分为多行多行转为多列多列转为多行三、小结一、前言 环境: windows11 64位 Python3.9 MySQL8 pandas1.4.…

【Linux】make/Makefile的简单使用

人生的态度是,抱最大的希望,尽最大的努力,做最坏的打算。 – 柏拉图 《理想国》 目录一.Linux项目自动化构建工具-make/Makefile1.为什么需要使用make/Makefile2.简单理解make和Makefile3.如何编写Makefile文件3.1生成可执行程序&#xff1a…

智算中心掀落地热潮,加速AI普惠化

11日,国家信息中心与浪潮信息联合发布的《智能计算中心创新发展指南》显示,目前全国有超过30个城市正在建设或提出建设智算中心,“十四五”期间,对智算中心的投资可带动人工智能核心产业增长约2.9-3.4倍。 《科创板日报》记者注意…

python+人脸识别+opencv实现真实人脸驱动的阿凡达(中)

目录一、前言二、消除图片拼接缝隙三、基于一张图片正脸转侧脸的实现1、人体头部的二维成像知识2、用特征点驱动的方法实现侧脸2.1python核心代码三、后续工作一、前言 我们在上篇名叫python人脸识别opencv实现真实人脸驱动的阿凡达(上博文里已经实现了基于三角映射…

教资报名啦 有问题欢迎评论区提问~

报考小tips: ①一次选报你所有准备报考的学科 ②看好类别,有些是“音体美专业”专属 ③审核前如果发现有漏报的科目,可以先取消再报 ④一旦审核通过,就不能更改/增加/较少报考科目 ⑤缴费成功后,不退费【如果考试前几天…

德云社、本山传媒齐聚辽宁卫视春晚,郭德纲和本山大叔会参加吗

腊月二十九,屋里走。不得不说辽宁卫视会选时间,兔年的春晚定在了农历腊月二十九这一天。备受关注的辽宁卫视春晚,准备在农历的腊月二十九晚上七点三十分,正式与广大观众见面。 辽宁卫视春晚之所以倍受期待,是因为这些年…

【MySQL】深入理解MySQL事务(上篇)

MySQL事务前言事务的ACID 特性事务提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)非正常演示2 - 证明commit了,客户端崩溃…

2021年大数据挑战赛A题智能运维中的异常检测与趋势预测求解全过程论文及程序

2021年大数据挑战赛 A题 智能运维中的异常检测与趋势预测 原题再现: 异常检测(异常诊断/发现)、异常预测、趋势预测,是智能运维中首当其冲需要解决的问题。这类问题是通过业务、系统、产品直接关联的 KPI 业务指标进行分析诊断&…

【Linux】生产者消费者

生产者消费者 生产者消费者问题概述 生产者/消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲 区,其中一个或多个线程作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个线程作为“消费者”…

优先级队列--堆的应用(堆排序与TopK问题)

堆排序:比较方式为小于建大堆 priority_queue(Iterator first, Iterator last): _con(first, last) // 1、使用vector的区间构造函数来初始化_con{// 2、建堆:从完全二叉树的最后一个非叶子结点来进行向下调整for (int i (size() - 2) / 2; i > 0; i…

2023真无线蓝牙耳机怎么选?值得入手的蓝牙耳机推荐

蓝牙耳机作为近几年备受人们欢迎的数码产品,很多人都想买到一款适合自己的蓝牙耳机。但,随着蓝牙耳机的快速发展,蓝牙耳机市场充斥着各种机型,它们有着不同的性能、价格、外观等。所以,不少人都有一个疑惑,…

玩转 MySQL Shell 沙盒实例

什么是沙盒实例? 沙盒实例仅适用于出于测试目的在本地计算机上部署和运行,可以与 InnoDB Cluster 、 InnoDB ClusterSet 和 InnoDB ReplicaSet 一起工作。 如何使用部署沙盒的 API 函数? 语法dba.deploySandboxInstance(port[, options])解…

Mybatis学习笔记(一)

什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能,大大提高开发效率 三层架构 表现层:用于展示数…

慕尼黑工业大学开源含四季的数据集:用于自动驾驶的视觉长期定位

以下内容来自[从零开始机器人SLAM知识星球] 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# #开源数据集# 4Seasons: Benchmarking Visual SLAM and Long-Term Localization for Autonomous Driving in Challenging Conditions 地址:https:/…

LeetCode[295]数据流的中位数

难度:困难题目:中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。描述:实现 MedianFinder 类:…

工信部及多地政府联合阿里健康在全国展开防疫保供专项行动

为了切实服务好百姓的购药需求,在工信部和各地政府的指导下,12月疫情政策调整以来,阿里健康已先后在全国20多个省市及地区配合药品物资精准投放工作,为各地居民重点供退热药、N95口罩等紧缺药品和物资,尽全力打好药品保…

Android系统定制开发过程快速查找定位分析代码的方法

推荐阅读 ​Android系统开发过程快速查找定位代码的方法 Android10以上系统定制Root权限(隐藏Root权限) 商务合作 2023年招聘 2023年逆向分析资料汇总 Android系统开发过程,经常需要进行文件查找、代码查找,常用find和grep查找命令 1.find命令 根据文…

短短六年时间冲到二奢品类第一,妃鱼如何做到的?

随着消费需求不断增长,二手奢侈品市场近五年来快速向规模化、平台化发展,妃鱼、红布林、胖虎等二奢电商品牌迅速崛起,成为风头劲胜的网红。国泰君安研究报告显示,中国闲置高端消费品零售市场规模已从2016年162亿元增长至2020年的5…