使用Golang搭建gRPC服务提供给.NetCore调用
文章目录
- gRPC概述
- RPC
- gRPC又是什么呢
- 安装
- Golang IDE(Goland)
- Protocol Buffer
- 下载Protocal Buffer
- 配置Protocal Buffer编译器环境变量
- protoc-gen-go
- 下载protoc-gen-go
- 定义Protocal Buffer
- 添加gRPC服务
- Golang服务端实现
- Golang客户端实现
- .NetCore调用Golang搭建的gRPC服务
- 参考
gRPC概述
RPC
说到gRPC就不得不提RPC,所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,简单点来说就是我A机器上写的函数可以在B机器上通过RPC协议直接调用。
它与http不同的是:
- RPC是基于TCP实现的,RESTFUL是基于HTTP来实现的。
- 从传输速度上来看,因为HTTP封装的数据量更多所以数据传输量更大,所以RPC的传输速度是比RESTFUL更快的。
为什么内部(约定情况下的服务与服务)使用rpc,而外部(to customer)使用http
- 因为HTTP协议是各个框架都普遍支持的。在toC情况下,因为不知道情况来源的框架、数据形势是什么样的,所以在网关可以使用Restful利用http来接受。而在微服务内部的各模块之间因为各协议方案是公司内部自己定的,所以知道各种数据方式,可以使用TCP传输以使各模块之间的数据传输更快。所以可以网关和外界的数据传输使用RESTFUL,微服务内部的各模块之间使用RPC。
gRPC又是什么呢
gRPC
是一个高性能、开源的通用RPC
框架,最初是由谷歌创建的,十多年来谷歌一直使用一个称为Stubby
的通用RPC
基础设施来连接在其数据中心内和跨数据中心运行的大量微服务。2015年3月,Google
决定构建下一个版本的Stubby
并使其开源。结果就是 gRPC
,它现在被谷歌以外的许多组织用于支持从微服务到“最后一英里”计算(移动、网络和物联网)的用例。
gRPC官方文档:https://www.grpc.io/docs/what-is-grpc/
在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您可以更轻松地创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以通过参数和返回类型远程调用的方法。在服务器端,服务器实现了这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中简称为客户端),它提供与服务器相同的方法。
安装
Golang IDE(Goland)
Goland详细步骤安装:https://blog.csdn.net/u014374975/article/details/120387180
Golang语法详解请:https://blog.csdn.net/u014374975/article/details/120463448
Protocol Buffer
可以通过Go、C++、C#、Java、Python等语言轻松的创建gRPC服务,同时也意味着它可以跨语言进行远程过程调用,那么就需要一门中间语言(IDL)来约束和定义远程过程调用之间通讯的接口约束。Google官方推荐并且使用人数最多的就是Protocol Buffer
,它具有稍微简化的语法,一些有用的新功能,并支持更多语言。Proto3 目前可用于 Java、C++、Dart、Python、Objective-C、C#等
Protocol Buffer官方文档:https://developers.google.com/protocol-buffers
下载Protocal Buffer
在GitHub的protocolbuffers项目下,下载ProtocalBuffer编译器
配置Protocal Buffer编译器环境变量
将下载好的Protocal Buffer压缩包解压,并将运行目录配置到环境变量
环境变量添加完毕后,打开cmd
窗口执行protoc --version
,出现版本号,表示配置成功
protoc-gen-go
protoc-gen-go是protobuf编译插件系列中的Go版本,protoc-gen-go可以将Protocol Buffer写的接口定义转换封装为Golang代码
在下载protoc-gen-go之前,我们先设置下Golang代理地址
# 七牛云
go env -w GOPROXY=https://goproxy.cn,direct
下载protoc-gen-go
go get -u github.com/golang/protobuf/protoc-gen-go
如果GOPATH的bin目录下有这个文件即表示下载成功
定义Protocal Buffer
打开IDE,在GOPATH的src目录下创建一个pbfiles
文件夹,并在文件夹中添加一个product.proto
文件,用于描述接口定义
syntax = "proto3";
package pbfiles;option go_package = "../services";message Product{int32 id = 1;string name = 2;int32 count = 3;string description = 4;
}service pdService{rpc GetProduct(Product) returns(Product);
}
添加完成后,通过protoc
编译该文件为Golang代码
protoc --go_out=plugins=grpc:./ *.proto
此时我们发现,protoc会在src目录下自动创建一个services
目录,并将上面写的proto
文件自动编译为product.pb.go
由于编译出的Golang代码使用了google.golang.org
等包,所以我们添加一个mod
文件,拉取缺少的模块。
进入src目录执行go mod init gRPCdemo
命令
创建完毕后输入命令go mod tidy
,此时上面生成的product.pb.go
代码就不会缺少引用和标红了
添加gRPC服务
Golang服务端实现
在src目录下创建grpc-server.go
文件,并输入代码:
package mainimport ("context""fmt""gRPCdemo/services""google.golang.org/grpc""net"
)type productRequest struct {}func (this *productRequest) GetProduct(context context.Context, request *services.Product) (*services.Product, error) {var product services.Productswitch request.Id {case 1:product.Id = 1product.Name = "苹果"product.Description = "小苹果"case 2:product.Id = 1product.Name = "西瓜"product.Description = "大西瓜"default:product.Id = 3product.Name = "香蕉"product.Description = "香蕉"}return &product, nil
}func main() {grpcService := grpc.NewServer()services.RegisterPdServiceServer(grpcService, new(productRequest))listen, err := net.Listen("tcp", ":5000")if err != nil {fmt.Println("listen err:", err)return}grpcService.Serve(listen)
}
在代码目录下打开终端输入go run grpc-server.go
运行程序,开始监听
Golang客户端实现
在src目录下创建grpc-client.go
文件,并输入代码:
package mainimport ("context""fmt""gRPCdemo/services""google.golang.org/grpc"
)func main() {grpcCnn, err := grpc.Dial(":5000", grpc.WithInsecure())if err != nil {fmt.Println("grpc.dial err:", err)return}grpcClient := services.NewPdServiceClient(grpcCnn)var request services.Productrequest.Id = 1res, err := grpcClient.GetProduct(context.TODO(), &request)if err != nil {fmt.Println("GetProduct err:", err)return}fmt.Println(res)
}
在代码目录下打开终端输入go run grpc-client.go
运行程序
此时可以看到,已成功访问gRPC服务
.NetCore调用Golang搭建的gRPC服务
- 打开vs创建控制台项目
grpcClient
- 右键项目
管理Nuget程序包
,添加如下包
- Grpc.Net.Client,其中包含 .NET Core 客户端。
- Google.Protobuf 包含适用于 C# 的 Protobuf 消息
- Grpc.Tools 包含适用于 Protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为 PrivateAssets=“All”。
- 在 gRPC 客户端项目中创建
Protos
文件夹 - 将刚刚在Golang项目中创建的proto(pbfiles/product.proto)文复制到当前.NetCore客户端项目的Protos中。
- 将
product.proto
文件中的命名空间更新为.NetCore项目的命名空间:
syntax = "proto3";
package pbfiles;option csharp_namespace = "grpcClient";message Product{int32 id = 1;string name = 2;int32 count = 3;string description = 4;
}service pdService{rpc GetProduct(Product) returns(Product);
}
- 编辑
grpcClient.csproj
项目文件 - 添加具有引用
greet.proto
文件的<Protobuf>
元素的项组:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Google.Protobuf" Version="3.18.0" /><PackageReference Include="Grpc.Net.Client" Version="2.39.0" /><PackageReference Include="Grpc.Tools" Version="2.41.0"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference><!--添加Protobuf元素组--><Protobuf Include="Protos\product.proto" GrpcServices="Client" /></ItemGroup></Project>
- 构建客户端项目,以在
grpcClient
命名空间中创建类型。GrpcGreeter
类型是由生成进程自动生成的。 - 使用以下代码更新
grpcClient
客户端的 Program.cs 文件:
using Grpc.Net.Client;
using System;namespace grpcClient
{class Program{static void Main(string[] args){// 只有 .NET Core 3.x 需要 System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport 开关。 .NET 5 中不需要任何额外配置,也没有这项要求。AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);using var channel = GrpcChannel.ForAddress("http://localhost:5000");var client = new pdService.pdServiceClient(channel);var reply = client.GetProduct(new Product { Id = 1 });Console.WriteLine(reply);Console.ReadKey();}}
}
启动程序后,.NetCore完美访问Golang搭建的gRPC服务
参考
gRPC官方文档:https://www.grpc.io/docs/what-is-grpc/
Protocol Buffer官方文档:https://developers.google.com/protocol-buffers
MSDN:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-5.0&tabs=visual-studio
使用Golang搭建gRPC服务提供给.NetCore调用相关推荐
- 使用Golang搭建gRPC服务提供给.NetCore客户端调用
gRPC概述 RPC 说到gRPC就不得不提RPC,所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,简单点来说就是我A机器 ...
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- Qt C++属性类型提供给 QML调用(五)
前言 前面已经介绍了四种从 QML 调用 C++的属性的方法,今天介绍最后一种,从 QML 调用 C++中的函数以及连接 C++中的信号. 调用 C++函数 任何继承于 QObject 类的 C++类 ...
- 深入浅出 gRPC 01:gRPC 服务端创建和调用原理
目录 1. RPC 入门 1.1 RPC 框架原理 1.2 业界主流的 RPC 框架 1.3 gRPC 简介 1.3.1 gRPC 概览 1.3.2 gRPC 特点 2. gRPC 服务端创建 2.1 ...
- golang搭建微服务遇到的问题(不断更新)
一直希望使用golang来搭建微服务.在学习 参考教程 过程中遇到不少坑.现记录在案,方便他人查阅. 一. go get -u google.golang.org/grpc 无法下载,timeout问 ...
- 用Golang构建gRPC服务
本教程提供了Go使用gRPC的基础教程 在教程中你将会学到如何: 在.proto文件中定义一个服务. 使用protocol buffer编译器生成客户端和服务端代码. 使用gRPC的Go API为你的 ...
- 使用Golang搭建web服务
如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了. 我们先看个例子:http.go package mainimport (&qu ...
- grpc(3):使用 golang 开发 grpc 服务端和client
1,关于grpc-go golang 能够能够做grpc的服务端和client. 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://g ...
- php brotobuf,用Golang构建gRPC服务
根据官方文档要求需要提供一下环境支持 go环境已经搭建成功了,上一篇文章安装了protoc编辑器,现在只需要安装所需插件即可. 1.安装grpc所需要的插件:protoc-gen-go.protoc- ...
最新文章
- go微服务框架go-micro深度学习(一) 整体架构介绍
- [转]Windows与VC命名规则
- ZooKeeper 的典型应用场景
- 深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战
- SQL根据细粒度为天的查询
- 评估报告有效期过期了怎么办_托福成绩过期了怎么办?
- 能量采集(HYSBZ-2005)
- ARM汇编指令格式及规则
- Farey Sequence(欧拉函数板子题)
- 【JY】反应谱的详解与介绍
- 百度网盘客户端使用的一些小窍门
- Kiwi browser 手机谷歌浏览器如何同步谷歌扩展插件
- es 按条件查询数据总条数
- Boxy SVG 3.24 特别版 Mac 强大的矢量图编辑软件
- 网络视频会议软件哪个好?欢迎大家补位!
- 东京喰种语录(节选)
- Android 修改开机画面
- vue createElement后删除这个元素 the node to be removed is not a child of this node
- 投影仪对焦应用镜头马达驱动芯片
- 【GIS小案例】点聚合效果的实现
热门文章
- [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)
- 感谢上帝又赐给我一个好妈妈
- ai前世识别_AI人脸识别前世今生app下载
- python3 readlines的参数,带有readlines()方法的Python3 UnicodeDecodeError
- 如何判断二维平面中,两条线段是否相交
- 计算兰伯特投影数据到其他空间参考的地理范围
- 绝缘栅双极晶体管IGBT
- java sortedmap_Java SortedMap接口
- 阿里云服务器镜像系统怎么选择?超详细教程
- java multiset_java代码(5) ---guava之Multiset