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目录下有这个文件即表示下载成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TCBYJOO-1633354844949)(FDAE29AC35E14B0E87E0DBE7A84CAAF1)]

定义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 main

import (
"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.Product
switch request.Id {
case 1:
product.Id = 1
product.Name = "苹果"
product.Description = "小苹果"
case 2:
product.Id = 1
product.Name = "西瓜"
product.Description = "大西瓜"
default:
product.Id = 3
product.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 main

import (
"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.Product
request.Id = 1 res, 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服务

  1. 打开vs创建控制台项目grpcClient
  2. 右键项目管理Nuget程序包,添加如下包

    • Grpc.Net.Client,其中包含 .NET Core 客户端。
    • Google.Protobuf 包含适用于 C# 的 Protobuf 消息
    • Grpc.Tools 包含适用于 Protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为 PrivateAssets="All"。
  3. 在 gRPC 客户端项目中创建Protos文件夹
  4. 将刚刚在Golang项目中创建的proto(pbfiles/product.proto)文复制到当前.NetCore客户端项目的Protos中。
  5. 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);
}
  1. 编辑grpcClient.csproj项目文件
  2. 添加具有引用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>
  1. 构建客户端项目,以在grpcClient命名空间中创建类型。GrpcGreeter类型是由生成进程自动生成的。
  2. 使用以下代码更新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客户端调用的更多相关文章

  1. 技术实践:教你用Python搭建gRPC服务

    摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...

  2. window下golang使用gRPC入门案例&net core客户端

    gRPC是google开源高性能分布式RPC框架,支持http/2 双向数据流传输及Protobuff,可以在任何环境下运行. 它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡,跟踪 ...

  3. Spring Cloud 服务端注册与客户端调用

    Spring Cloud 服务端注册与客户端调用 上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务 ...

  4. 使用Golang搭建web服务

    如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了. 我们先看个例子:http.go package main import ( & ...

  5. grpc(3):使用 golang 开发 grpc 服务端和client

    1,关于grpc-go golang 能够能够做grpc的服务端和client. 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://g ...

  6. 十分钟学会Golang开发gRPC服务

    gRPC是Google发起的一个开源RPC框架,使用HTTP/2传输协议,使用Protocol Buffers编码协议,相比RESTful框架的程序性能提高不少,而且当前流行的编程语言基本都已经支持. ...

  7. 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)

    V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...

  8. 【Zabbix】在CentOS 7上搭建Zabbix服务,收集Windows客户端计数器性能数据(含过程中遇到的问题解决方法)

    1.环境 1.1.关闭防火墙 命令:systemctl stop firewalld 或者 systemctl stop firewalld.service (备注:相应的,若要开启防火墙,将对应的& ...

  9. webservice发布服务:CXF及客户端调用

    2.CXF:(与spring整合) CXF相对来说操作没有AXIS繁琐 1.导入spring的jar包和cxf的jar包 2.在spring的核心配置文件中配置发布的接口类 <?xml vers ...

随机推荐

  1. docker ubuntu中文乱码

    docker ubuntu18.04 使用cat查看中文正常,使用vim查看中文乱码. 解决此问题需要修改"/etc/profile"文件. 1.修改前查看本地使用的语言环境: l ...

  2. 深入浅出Mybatis系列(九)---缓存

    MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存. 1.默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启. 2.二级缓存需要手动开启和配置,他是基于namesp ...

  3. C# 委托讲解

    首先,委托的使用场景:A的某些功能,只有在B需要触发时触发,委托就是用来做中间通讯的渠道. 假设:现在有个大佬A,A有个小弟B,B在受到羞辱时就会通过电话Delegate通知A自己被羞辱了,A在这时就 ...

  4. ArcGIS地形分析--TIN及DEM的生成,TIN的显示

    DEM是对地形地貌的一种离散的数字表达,是对地面特性进行空间描述的一种数字方法.途径,它的应用可遍及整个地学领域.通过对本次实习的学习,我们应加深对TIN建立过程的原理.方法的认识:熟练掌握ArcGI ...

  5. Mac Ideal 常用快捷键

    智能提示 ⌘ -> command ⇧ -> shift ⌥ -> option -> 上箭头 -> 下箭头 ⌃ -> Control mac的option键  = ...

  6. SpringCloud分布式配置中心Config

    统一管理所有配置. 1.微服务下的分布式配置中心 简介:讲解什么是配置中心及使用前后的好处 什么是配置中心: 一句话:统一管理配置, 快速切换各个环境的配置 相关产品: 百度的disconf 地址:h ...

  7. Mybatis一对一、一对多、多对多查询。+MYSQL

    场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...

  8. 挂载redhat镜像创建本地yum源

    上传镜像文件到/mnt文件夹下,或者上传到其他文件夹下 挂载镜像路径/mnt/cdrom 在mnt文件夹下创建cdrom文件夹 创建命令:mkdir  cdrom 挂载镜像命令:mount rhel- ...

  9. vue 监听父子组件传参,对象数据变化

    watch:{ 组件传参的字段 :{ handler (newV, oldV){ 这里打印 newV, oldV 就可以看到数据变化了 } , immediate: true, // 重点 deep: ...

  10. .NET 5 支持 Azure Functions OpenAPI 扩展啦

    今年5月,在 Build大会上,Azure FunctionsOpenAPI的功能支持(预览版)正式宣布. 当时,它最高支持 v3 运行时--.NET Core 3.1 版本. 最近,它发布了 .NE ...