ASP.NET Core中Grpc通信怎么使用


今天小编给大家分享一下ASP.NETCore中Grpc通信怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Grpc中使用协议缓冲区 (protobuf) 用作接口设计语言 (IDL),它的主要内容包含:GRPC 服务的定义。客户端和服务器之间发送的消息。Grpc.Tools 这个工具,在每次编译的时候,都能将.proto文件生成为对于的cs文件。 服务端和客户端都需要添加。Grpc.AspNetCore这个包会对Grpc.Tools 进行使用。引用了这个包之后。还有注意在Server和Client,都要在对应.csproj下面,修改GrpcServices这个配置的值,如果是服务端就写Server,如果是客户端就写Client。需要添加 Grpc.AspNetCore 的引用在Startup.cs中需要配置如下信息:①ConfigureServices 中需要配置②Configure 中需要配置endpointsGrpc中的endpoints需要下面的支持:HTTP/2gRPC 要求 HTTP/2。gRPC for ASP.NET Core 验证HttpRequest为HTTP/2。在大多数现代操作系统上,Kestrel支持 HTTP/2。默认情况下,Kestrel 终结点配置为支持 HTTP/1.1 和 HTTP/2 连接。传输安全性Transport Layer Security (TLS).用于 gRPC 的 Kestrel 终结点应使用 TLS 进行保护。在开发版中,将在存在 ASP.NET Core 开发证书https://localhost:5001时,自动创建一个使用 TLS 保护的终结点。不需要配置。https前缀验证 Kestrel 终结点是否正在使用 TLS。在生产环境如果使用TLS中,必须显式配置 TLS。两种方式配置对应的TLS:此外TLS不仅仅适用于Client和Server间的安全传输,还可以用于服务协商。我在看官网的关于服务协商时候,有些发懵,因为又说了grpc 需要Http/2 、又需要TLS,但是后面又说在不配置TLS的endpoint的时候…… 那么到底是需要TLS还是不需要TLS,Grpc到底是仅仅支持HTTP2还是会兼容HTTP1?首先要明确几个概念:什么是EndPoint什么是Grpc endpoint什么是TLSTLS 和 HTTP1、HTTP2以下是我的理解:Endpoint是一个大概念,不仅仅是grpc有endpoint,以前我们用的webservice、wcf都有,他可以是HTTP1的,也可以是HTTP2的,也可以都支持。仅仅是当我们要用Grpc的时候我们需要使用HTTP2协议。TLS是一种安全协议,是在传输层上的安全协议,具体是什么样的可以不用了解,只是在.Net Core 中配置TLS,不仅仅作用于安全传输,还有作用于协议的选择,当我们的endpoint使用的是HTTP2,且不用TLS的时候,我们需要配置我们的Kestrel服务器的ListenOptions.Protocols 必须设置为HttpProtocols.Http2 ,换句话说 如果ListenOptions.Protocols= HttpProtocols.Http1AndHttp2,那么就不能使用TLS。总结一下就是:你配置你的Kestrel 为使用HTTP2协议的时候,你可以使用TLS作为安全传输,也可以不用你配置你的Kestrel 为使用兼容HTTP1协议的时候,那么你就不能用TLS那么对于GPRC来讲,他的endpoint 必须使用HTTP2协议,TLS也不是必须要配置的。①继承一下生成出来的抽象类 Greeter.GreeterBase②根据自己的需要,依赖注入一些必要的Service类③实现生成出来的Virtual方法1.发生的问题2.Status(StatusCode=Internal, Detail=”Error starting gRPC call: The SSL connection could not be established, see inner exception.”)https://docs.microsoft.com/zh-cn/aspnet/core/grpc/troubleshoot?view=aspnetcore-3.03.Grpc.Core.RpcException:“Status(StatusCode=Internal, Detail=”Bad gRPC response. Response protocol downgraded to HTTP/1.0.”)”先按照下面的做https://github.com/grpc/grpc-dotnet/issues/654如果不行的话,检查一下是否本地一直在开着抓包工具之类的代理软件,我之前一直不行,是因为本地运行着Fiddler和上面不一样,grpc client 是通过 xxx.proto 文件生成的具体的类型。里面包含了我们要调用的所有的方法。一般情况下,我们都是创建一个Channel类,然后通过Channel类在创建一个Client。如下图所示。ForAddress方法:注:gRPC的Channel维持了一个到远程服务的长连接。客户端对象可以重用相同的通道。与调用远程方法相比,创建通道是一项昂贵的操作,因此通常应该为尽可能多的调用重用单个通道。Grpc具有多种不同的方式: Unary (一元模式) Server streaming (服务器流) Client streaming (客户端流) Bi-directional streaming (双向流)从客户端发送请求到服务端开始,服务端响应请求回来结束。每一个Unary 服务都会从*.proto文件中生成两个具体的调用方法,一个异步方法,一个同步方法。例如下面的代码:从客户端发送请求到服务端开始,利用ResponseStream.MoveNext()方法读取服务端返回的数据,知道ResponseStream.MoveNext() 返回false说明读取结束。客户端流调用不需要在客户端发送请求之后开始,客户端可以选择发送带有RequestStream.WriteAsync的发送消息,当客户端完成发送消息请求流时。调用CompleteAsync来通知服务,当服务返回响应消息时,调用结束。相当于②和③的结合,也不需要等待客户端发送完请求,使用RequestStream.WriteAsync写入消息,通过ResponseStream.MoveNext()或者ResponseStream.ReadAllAsync()读取服务端返回的数据。当服务端不在返回的时候,结束请求。此外这里补充一下几种方式适用的场景(1) 简单模式(Simple RPC)这种模式最为传统,即客户端发起一次请求,服务端响应一个数据,这和大家平时熟悉的RPC没有什么大的区别,所以不再详细介绍。(2) 服务端数据流模式(Server-side streaming RPC)这种模式是客户端发起一次请求,服务端返回一段连续的数据流。典型的例子是客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端。(3) 客户端数据流模式(Client-side streaming RPC)与服务端数据流模式相反,这次是客户端源源不断的免费云主机域名向服务端发送数据流,而在发送结束后,由服务端返回一个响应。典型的例子是物联网终端向服务器报送数据。(4) 双向数据流模式(Bidirectional streaming RPC)顾名思义,这是客户端和服务端都可以向对方发送数据流,这个时候双方的数据可以同时互相发送,也就是可以实现实时交互。典型的例子是聊天机器人。①在GrpcService中引入Grpc.AspNetCore包,此包会在编译的时候,将.proto文件生成对应的服务端grpc服务代码。.net core需要自己去生成,3.0以后已经在上面的包中集成的生成的功能,只要生成代码就会调用Grpc.Tools和Google.Protobuf去产生对应的cs文件②创建一个proto文件并修改对应的服务端csproj文件,将该proto文件加入到项目中,否则不会生成服务端代码。③创建一个HelloService类,继承自生成出来的抽象类XXXBase,然后可以重写对应我们声明的方法,以便于提供客户端访问。注:xxx.xxxBase 可能在继承的时候显示不存在,那是因为没有②之后没有进行编译,编译之后就能生成了。④因为是服务端,一旦实现了所有的方法,还需要启动一个gRPC服务器,这样客户端才可以使用服务。可以采用两种方式来持久化服务,监听端口,处理请求:a.使用Grpc.Core里面的Server (适用于.net core 3.0以下版本)b.配置startup.cs中的ConfigureServices添加服务,Configure方法中配置终结点,并且配置对应的Kestrel服务器第一种方式:第二种方式:Startup.cs①添加相关的依赖包Install-Package Grpc.Net.ClientInstall-Package Google.ProtobufInstall-Package Grpc.Tools②添加之后,把服务端的proto文件一样复制一份到客户端,并在csproj下面追加如下的代码,并编译一次:③编写客户端调用的具体内容执行:这里要注意一段代码AppContext.SetSwitch(“System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport”, true),如果不使用这段代码,并且channel当中还是http的话,那么就会出现下面的异常:以上就是“ASP.NETCore中Grpc通信怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: php访问权限修饰符怎么使用

这篇文章主要介绍“php访问权限修饰符怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php访问权限修饰符怎么使用”文章能帮助大家解决问题。 PHP访问权限修饰符有三种:1、public,表示共有的,权限范围最大…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/25 08:49
下一篇 03/25 09:49

相关推荐