【gRPC】 在.Net core中使用gRPC

最近在学习.net core的微服务体系架构。微服务之间的通信常常通过gRPC进行同步通信,但是需要注意的是,大多数微服务之间的通信是通过事件总线进行异步通信。在微软介绍.net微服务体系架构的项目eShop中,微服务之间进行同步通信的场景很多,大多数都是HTTP/REST,目前只有自定义聚合器与微服务之间通信是使用的gRPC。整套微服务架构体系,其实除了客户端与网关(BFF)之间,使用HTTP/REST,均可使用gRPC(只要网关支持HTTP/REST与gRPC的转换)

  • BFF转发外部请求

  • 微服务之间

  • 自定义聚合器与微服务

1.gRPC是什么?

A high-performance, open-source universal RPC framework。

gRPC是一个高性能的通信协议,它基于HTTP/2protocol buffers。它是微服务之间进行同步通信的主要选择。与之相对的,就是其他协议,如AMQP的异步通信队列或者发布/订阅模式。

RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样.

与HTTP/JSON相比,gRPC的优势:

  • 高性能:协议缓冲区是一种二进制的高性能序列化机制。根据语言的不同,实现协议缓冲区的速度比JSON序列化快8倍,而消息的大小可能比JSON序列化小60%-80%。

  • 支持数据流,说白了,还是快

  • 约定显示,与语言无关:使用proto文件定义服务端与客户端之间的约定

2.在.net core中使用gRPC

在.NET Core 3.0众多更新中,其中有一个重要的更新就是对gRPC的原生支持。从.NET Core3.0开始,无论是开发工具还是框架中,都与gRPC进行了深度的集成,这让使用gRPC的体验如丝般顺滑。

真的有这么丝滑吗?

2.1 工具

工具集成-丝滑享受,主要体现在msbuild,开发者可以直接使用宇宙第一IDE:Vistual Studio或者.NET Core SDK命令dotnet build,通过.proto文件去生成需要的gRPC服务端和客户端代码。这里有两个必要条件:

安装工具包

Google.Protobuf,Grpc.Tools

Install-Package Google.Protobuf -Version 3.12.2
Install-Package Grpc.Tools -Version 2.29.0

.proto的引用

proto文件必须在.csproj中引用。在中使用标签。

<ItemGroup><Protobuf Include="Protos\greet.proto" GrpcServices="Client" /><Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

其中GrpcServices属性:指明生成的代码是客户端还是服务端,或者Both(这是默认值)。当编译代码时(无论是通过运行Visual StudioBuild还是dotnet build),所有代码都将生成并放在obj文件夹中。这是微软故意这样做的,因为这些代码不应该出现在源代码控制存储库中,他们都是生成的,只要.proto文件在,他们都能随时生成。

2.2 实际使用的技巧-亲测有用

参考晓晨博客

主要目标

  • 让客户端和服务端共用一个Protos文件夹,避免重复

  • 使用MSBuild变量在csproj中添加Protobuf标签,避免繁琐修改csproj

服务端

 <ItemGroup><Protobuf Include="..\Protos\*.proto" GrpcServices="Server" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /></ItemGroup>

客户端

  <ItemGroup><Protobuf Include="..\Protos\*.proto" GrpcServices="Client" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /></ItemGroup>
  • Include:加通配符的路径,去指定proto文件的路径

3.创建服务端

3.1 安装包

创建gRPC服务端,需要包Grpc.AspNetCore

Install-Package Grpc.AspNetCore -Version 2.29.0

很幸运,VS2019已经为我们准备好服务端的模板。我们可以创建一个gRPC服务端项目。这个模板已经引入了Grpc.AspNetCore包。你可以在模板中搜到的。

3.2 引入proto文件

<ItemGroup><Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

当然这,模板已经为我们生成了。并且生成了GreeterService.cs

3.3 加入gRPC管道

  • gRPC添加到终结点路由中

app.UseEndpoints(endpoints =>{endpoints.MapGrpcService<GreeterService>();endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");});});

ASP.NET Core 中间件和功能共享路由管道,因此可以将应用配置为提供其他请求处理程序。其他请求处理程序与已配置的 gRPC 服务并行工作。

  • 注册服务

 public void ConfigureServices(IServiceCollection services){services.AddGrpc();}

当然这,模板已经为我们生成了,不要模板自己刀耕火种也是可以的。

4.创建客户端

4.1 安装包

创建gRPC客户端,需要包Google.Protobuf,Grpc.Tools,Grpc.Net.Client

Install-Package Google.Protobuf -Version 3.12.2
Install-Package Grpc.Tools -Version 2.29.0
Install-Package Grpc.Net.Client -Version 2.29.0

4.2 引入与服务端相同的proto文件

  <ItemGroup><Protobuf Include="Protos\greet.proto" GrpcServices="Client" /></ItemGroup>

4.3 编码

static async Task Main(string[] args)
{Console.WriteLine("Hello gRPC!");AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);var channel = GrpcChannel.ForAddress("https://localhost:5001");var greeterClient = new Greeter.GreeterClient(channel);//https://docs.microsoft.com/zh-cn/aspnet/core/grpc/troubleshoot?view=aspnetcore-3.0&WT.mc_id=DT-MVP-5003133var reply = await greeterClient.SayHelloAsync(new HelloRequest{Name = "Garfield"});Console.WriteLine("Greeter 服务返回数据: " + reply.Message);Console.ReadKey();//var counterClient = new Count.CounterClient(channel);This switch must be set before creating the GrpcChannel/HttpClient.//AppContext.SetSwitch(//    "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);The port number(5000) must match the port of the gRPC server.//var channel = GrpcChannel.ForAddress("http://localhost:5000");//var client = new Greet.GreeterClient(channel);
}

5.微服务中使用

如引言所述,gRPC主要用于微服务之间同步通信。

主要运用场景,已经根据业务划分的多个微服务无法满足实际出现的业务场景,需要联合多个微服务进行业务处理。没错,这就是微服务架构体系中的自定义聚合器,实际上聚合器也是一种微服务,负责聚合多个微服务提供较粒度更小的微服务更为强大的自定义微服务。至于使用方式,依然是引入Grpc.Net.Client包,此包本来就是HttpClient基础上实现的,大可以把此当作一个gPRC的HttpClient使用。

6.配置无TLS的gRPC

6.1 服务端配置

gRPC只支持HTTP/2。通常,当客户端连接到服务端时,连接使用HTTP1.1完成,只有当服务器和客户端都支持HTTP/2时才提升为HTTP/2,这就是协议提升,实际上,同类似的, Websocket就是这样通过http操作,走协议提升。这个协议提升使用协议协商执行,通常需要使用ALPN协议实现,这个协议要求必须TLS。

这意味着,在默认情况下,您需要启用一个TLS端点,以便能够使用gRPC。

但是,这里有一个但是,在内部的微服务中,可能是没有启用TLS的,也没必要,因为大家都是自己人,取消TLS,提高效率。在这种情况下,你有两个选择:

  • 打开一个Kestrel,监听HTTP/2

  • 打开两个Kestrel,一个监听HTTP1.1,另一个监听HTTP/2

如果您的服务器除了支持gRPC客户端还必须支持HTTP1.1客户端,则需要第二个选项。下面的代码就是展示了第二种方法(Program.cs):

WebHost.CreateDefaultBuilder(args).ConfigureKestrel(options =>{options.Listen(IPAddress.Any, 5000, listenOptions =>{listenOptions.Protocols = HttpProtocols.Http1AndHttp2;});//Setup a HTTP/2 endpoint without TLS.options.Listen(IPAddress.Any, 5001, listenOptions =>{listenOptions.Protocols = HttpProtocols.Http2;});})
  • 5000:提供http web api

  • 5001:提供gRPC

6.2 在.NET Core客户端调用

但是,这还不够,我们需要告诉gRPC客户端,客户端可以直接连接到HTTP/2端点,而不需要TLS,口头或者文档说明。

在默认情况下.NET Core不允许gRPC客户端连接到非TLS(non-TLS)端点-不安全的gRPC的服务,十有八九都会报异常

Unhandled exception. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

那么怎么办,就需要如下代码:

// This switch must be set before creating the GrpcChannel/HttpClient.
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);// The port number(5000) must match the port of the gRPC server.
var channel = GrpcChannel.ForAddress("http://localhost:5000");
var client = new Greet.GreeterClient(channel);

上述设置只能在客户端开始时设置一次。

7.配置TLS的gRPC

毫无疑问,微服务场景之外的gRPC服务还是需要TLS的。

7.1 方法一:appsetting.json

{"Kestrel": {"Endpoints": {"HttpsInlineCertFile": {"Url": "https://localhost:5001","Protocols": "Http2","Certificate": {"Path": "<path to .pfx file>","Password": "<certificate password>"}}}}
}

7.2 方法二:Program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.ConfigureKestrel(options =>{options.Listen(IPAddress.Any, 5001, listenOptions =>{listenOptions.Protocols = HttpProtocols.Http2;listenOptions.UseHttps("<path to .pfx file>", "<certificate password>");});});webBuilder.UseStartup<Startup>();});

8.写在末尾

Azure App Service 和IIS目前都还不支持gRPC.  另外Http.Sys也不支持gRPC所依赖的HTTP响应。详情请看github issues

参考链接

https://grpc.io/

https://www.cnblogs.com/shanyou/p/3452938.html

https://blog.csdn.net/yangguosb/article/details/80592777

https://docs.microsoft.com/zh-cn/aspnet/core/grpc/aspnetcore?view=aspnetcore-3.1&tabs=visual-studio

https://docs.microsoft.com/zh-cn/aspnet/core/grpc/troubleshoot?view=aspnetcore-3.1

https://www.cnblogs.com/stulzq/p/11581967.html

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

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

相关文章

disconf mysql_Docker搭建disconf环境,三部曲之三:细说搭建过程

Docker下的disconf实战全文链接细说搭建过程在前两章中&#xff0c;我们利用远程或本地的镜像&#xff0c;快速体验了本地启动disconf的过程&#xff0c;本章我们一起来分析和梳理整个定制和搭建过程&#xff0c;了解这些后&#xff0c;我们就能根据自己的需要来定制本地的disc…

轻量级 Kubernetes K3s - Github热点

轻量级 Kubernetes k3sstar: 15.5kK3s是完全符合生产要求的Kubernetes发行版, 安装简单&#xff0c;可用于生产&#xff0c;整个二进制文件小于100M&#xff0c;作为单一文件打包部署&#xff0c;优势在于&#xff0c;你只需几秒钟就可以得到一个完全成熟的Kubernetes集群。htt…

java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

作者 | 张振华.Jack责编 | 郭芮出品 | CSDN 博客本文和大家一起来重温《Java数据结构》经典之作。Java数据结构要理解Java数据结构&#xff0c;必须能清楚何为数据结构&#xff1f;数据结构&#xff1a;Data_Structure&#xff0c;它是储存数据的一种结构体&#xff0c;在此结构…

IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬

前言接着IdentityServer4的授权模式继续聊&#xff0c;这篇来说说 Resource Owner Password Credentials授权模式&#xff0c;这种模式在实际应用场景中使用的并不多&#xff0c;只怪其太开放啦&#xff0c;直接在客户端上拿着用户名和密码就去授权服务器获取AccessToken&#…

Xamarin使XRPC实现接口/委托远程调用

在之前的文章中已经介绍如何使用Beetlex.XRCP组件进行接口/委托远程调用&#xff1b;由于组件BeetleX.XRPC.Clients支持.NETStandard2&#xff0c;因此Xamarin同样可以使用它来实现基于接口/委托的数据交互通讯。接下来通过Xamarin实现一个简单的移动程序&#xff0c;并通过XRP…

mysql 拷贝安装_Mysql的安装和主从复制

安装mysql服务步骤一&#xff1a;首先下载mysql的yum源配置 &#xff0c;下载mysql的yum源wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm步骤二&#xff1a;安装mysql的yum源yum -y install mysql57-community-release-el7-11.noarch.rpm步骤三&…

浅谈CLR基础知识

中午的时候&#xff0c;有一个小伙伴问我&#xff0c;CLR到底是进程还是线程&#xff0c;它和自己写的程序是怎么关联的。这一问&#xff0c;直接把我问懞了。下面我尝试用简单的语言来描述这个问题&#xff0c;有的地方无法讲的太细&#xff08;不然内容会太多&#xff09;&am…

Asp.Net Core使用Skywalking实现分布式链路追踪

介绍Skywalking 是 Apache 基金会下面的一个开源 APM 项目&#xff0c;是一套(APM)分布式追踪系统&#xff0c;提供了很多数据存储列如&#xff1a;Mysql&#xff0c;H2&#xff0c;Elasticsearch7 等。其中APM 全称是应用性能监测软件&#xff0c;主要是用来处理以及追踪分布式…

python 里什么时候缩进_python什么时候缩进

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c有很大的不同(传统的c/c使用花括号花括号{}符决定作用域的范围&#xff1b;python使用缩进空格来表示作用域的范围&#xff0c;相同缩进行的代码是处于同一范围)。每行代码中开头的空格数(whitespace)用于…

C# 9 新特性 —— 补充篇

C# 9 新特性 —— 补充篇Intro前面我们分别介绍了一些 C# 9 中的新特性&#xff0c;还有一些我觉得需要了解一下的新特性&#xff0c;写一篇作为补充。Top-Level Statements在以往的代码里&#xff0c;一个应用程序必须要有 Main 方法才能运行&#xff0c;从 C# 9 开始&#xf…

使用Popup窗口创建无限级Web页菜单(5)

代码框架在(4)里面已经全部列出来了&#xff0c;现在工作就是按流程把他们完成。本来实现一个prototype的Menu菜单类只需要最多300行代码&#xff0c;可是后来做了一些操作习惯支持和UI显示上的优化后&#xff0c;代码猛增到了1000多行。不过final版本看起来确实比土不拉叽的pr…

【gRPC】ProtoBuf 语言快速学习指南

继上篇【gRPC】 在.Net core中使用gRPC了解了gRPC的使用&#xff0c;gRPC基于HTTP/2和ProtoBuf&#xff0c;ProtoBuf就非常有必要好好了解一下了&#xff0c;那么ProtoBuf究竟是什么&#xff1f;ProtoBuf Google Protocol Buffer是一种语言无关、平台无关、可扩展的序列化结构数…

vspythonqt混合_PYQT5 vscode联合操作qtdesigner的方法

除了使用pycharm外&#xff0c;还可使用vscode来操作pyqt&#xff0c;方法如下&#xff1a;1. 在vscode中配置相关的pyqt的相关根据自己实际情况修改第一项pyqt的路径2. 创建一个文件夹&#xff0c;右键&#xff0c;最后一项可以创建一个新窗口创建的新窗口后缀为 .ui右键中有以…

TIOBE 1 月榜单:Python年度语言四连冠,C 语言再次第一

喜欢就关注我们吧&#xff01;TIOBE 公布了 2021 年 1 月的编程语言排行榜。TIOBE 本月公布了 2020 年度编程语言&#xff0c;Python 获得四连冠&#xff0c;是过去一年中最受欢迎的编程语言。Python 在 2020 年实现了 2.01&#xff05; 的正增长&#xff1b;C 紧随其后&#x…

A piecture of J2EE Core Patterns

这张图是J2EE Core Patterns里面的一幅图片,在Enterprise Solution Patterns Using Microsoft.Net里面虽然模式的概念与应用大同小异&#xff0c;但是那张表现架构模式整体的图感觉有点不直观,相比之下这幅图显得更清晰一点。 发到这里供大家参考学习&#xff1a;&#xff09…

孙丕恕离开浪潮 仪器厂历时60年成为服务器龙头企业

2020年12月31日浪潮集团有限公司董事会选举邹庆忠为公司董事长&#xff08;法定代表人&#xff09;&#xff1b;孙丕恕不再担任公司董事长&#xff1b;公司不再聘任孙丕恕为首席执行官。另外&#xff0c;经省委研究决定&#xff0c;拟任省直部门&#xff08;单位&#xff09;副…

java 数组 树_java使用顺序数组实现二叉树

顺序数组实现二叉树实现原理对于下标为index的节点其满足1.左孩子节点的下标为2index12.右孩子节点的下标为2index2代码实现package tree;public class ArrayBinaryTree {private int[] arr;public ArrayBinaryTree(int[] arr){this.arrarr;}public void preOrder(int index){i…

【Docker】Asp.net core在docker容器中的端口问题

还记得【One by one系列】一步步学习docker&#xff08;三&#xff09;——实战部署dotnetcore中遇到的问题么&#xff1f;容器内部启动始终是80端口&#xff0c;并不由命令左右。docker run --name container-name -p 81:5000 mywebapi所谓知其然就要知其所以然&#xff0c;浅…

.net 5.0 中的 JsonConsole

asp.net core 5.0 中的 JsonConsoleIntroasp.net core 5.0 中日志新增了 JsonConsole&#xff0c;还是输出日志到 Console&#xff0c;但是会应用 Json 格式的一个 Formatter 把日志格式化成 json 再输出到控制台Sample一起来看一个示例&#xff0c;以我的一个小项目为例子来演…

采用开源软件搭建WebGIS系统(6)数据格式

[本文版权由xiaotievip.sina.com所有&#xff0c;转载需得到作者同意。] 在国家基础地理信息中心下载到的数据格式是Shape file数据。Shape file数据由3个文件构成&#xff0c;*.shp&#xff0c;*.dbf和*.shx&#xff0c;分别存储空间数据、属性数据和两者间的关系。*.shp得专门…