电脑网站拒绝连接怎么解决,关于网站建设的故事,wordpress 内链引用,网站要怎样建设#xff08;RPC通讯示意图#xff09;为什么突然说到gRPC呢#xff0c;其实以前就想说一说这个东西#xff0c;也想尝试使用一下#xff0c;一直没有机会#xff0c;一直看我公众号的小伙伴肯定都知道#xff0c;这几天一直在录制一个《eShopOnContainer微服务架构》系列… RPC通讯示意图为什么突然说到gRPC呢其实以前就想说一说这个东西也想尝试使用一下一直没有机会一直看我公众号的小伙伴肯定都知道这几天一直在录制一个《eShopOnContainer微服务架构》系列现在已经是8期了里边涵盖了使用ASP.NETCore开发微服务的常用的基本的知识技能具体的你可以看我的视频就行B站也同步更新。既然要说到了微服务那肯定就离不开服务间调用自然而然的就联系到了常用的一个框架——gRPC了那今天就简单的说一说这个框架也算是一个刚入门的比较简单后边我也会持续跟进讲解。 划 重 点 gRPC是什么用官网的一句话就是A high-performance, open-source universal RPC framework。要说gRPC那就先说下什么的RPC框架所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制使得应用程序之间可以进行通信而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。而gRPC就是一个由Google开源的跨语言的高性能的远程过程调用RPC框架。gRPC使客户端和服务端应用程序可以透明地进行通信并简化了连接系统的构建。它使用HTTP/2作为通信协议使用 Protocol Buffers 作为序列化协议。可能第一次看到这种通信框架比较陌生介绍的也比较官方和抽象这里说一下另一个常用的服务间通讯的方案你可能就明白了那就是RESTFul风格的API想必每个人都用过RestfulAPI吧这里就先简单说下RestfulAPI如果这个还不是很理解的话建议死记硬背。1、REST即Representational State Transfer的缩写。直接翻译的意思是表现层状态转化。2、它是一种互联网应用程序的API设计理念URL定位资源用HTTP动词(GET,POST,DELETE,PUT,DETC)描述操作比如只需要知道/api/blog你就知道了他的常见的CURD多种操作。3、简单来说就是url地址中只包含名词表示资源使用http动词表示动作进行操作资源将软件和网络这两个领域一定程度上结合起来。4、之所以灵活是因为他很少参与业务逻辑只定义资源操作。看完了RestfulAPI你应该就能明白gRPC是干什么的了吧。那两者有什么区别呢平时在前后端分离或者移动端需要后端api的场景下经常使用Restful丰富的API既然大家已经习惯并熟悉了Restful为何还用gRPC呢PS下边的内容我基本是摘抄于官网和网络文末有参考连接今天主要是介绍下如何操作代码文字讲解不是重点。为什么要使用gRPC问题既然是server/client模型那么我们直接用restful api不是也可以满足吗为什么还需要RPC呢我这里简单说明下优缺点和比较说说到底使用gRPC有什么好处。gRPC 和 Restful APIgRPC和Restful API都提供了一套通信机制用于server/client模型通信而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0而Restful api则不一定)。不过gRPC还是有些特有的优势如下1、gRPC可以通过protobuf来定义接口从而可以有更加严格的接口约束条件。2、通过protobuf可以将数据序列化为二进制编码这会大幅减少需要传输的数据量从而大幅提高性能。3、gRPC可以方便地支持流式通信.场景与好处????1、需要对接口进行严格约束的情况。比如我们提供了一个公共的服务很多人甚至公司外部的人也可以访问这个服务这时对于接口我们希望有更加严格的约束我们不希望客户端给我们传递任意的数据尤其是考虑到安全性的因素我们通常需要对接口进行更加严格的约束。这时gRPC就可以通过protobuf来提供严格的接口约束。2、对于性能有更高要求的轻量级微服务。有时我们的服务需要传递大量的数据而又不希望影响到我们的性能这个时候也可以考虑gRPC服务因为通过protobuf我们可以将数据压缩编码转化为二进制格式通常传递的数据量要小得多而且通过http2我们可以实现异步的请求从而大大提高了通信效率。同时更适应于网络受限的环境使用 Protocol Buffers二进制序列化消息该序列化始终小于等效的JSON消息对网络带宽需求比JSON小。 3、需要对接多种语言的微服务的情况。比如我们公司的项目有JAVA组有Python组或者.NETCore组别每个组当然负责各自独立的子服务部分那就需用用到不同语言之间的服务调用问题不希望出现兼容性问题。这个时候就用到了gRPC了它协定优先 API 开发默认使用协议缓冲区允许与语言无关的实现。可用于多种语言的工具以生成强类型服务器和客户端。gRPC工具支持所有流行的开发语言使gRPC成为多语言开发环境的理想选择。4、需要处理流式处理请求或响应的点对点实时服务gRPC用更小的网络带宽又支持客户端、服务器和双向流式处理调用更好的帮助处理流式请求。(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的Restful api似乎很少这么用通常的流式数据应用如视频流一般都会使用专门的协议如HLSRTMP等这些就不是我们通常web服务了而是有专门的服务器应用。也并不是十全十美的????任何开发工具或者项目框架都不是十全十美的就算是K8s、微服务或者DDD这么火热的技术也并不是无脑就上的gRPC框架也有一定的弊端或者至少是某些场景下是不适合的1、浏览器可访问的API。 浏览器不完全支持gRPC。虽然gRPC-Web可以提供浏览器支持但是它有局限性引入了服务器代理2、广播实时通信gRPC支持通过流进行实时通信但不存在向已注册连接广播消息的概念3、进程间通信进程必须承载HTTP/2才能接受传入的gRPC调用对于Windows进程间通信管道是一种更快速的方法。如何.NETCore上使用gRPC关于如何在ASP.NETCore上使用gRPC这里有两种方法第一是直接创建gRPC模板项目第二个就是在在ASP.NETCore项目上创建gRPC服务。其实这两个原理和操作流程都是差不多的我这里都说一下吧。通过模板创建gRPC服务打开VS2019版本至少16.3新建项目搜索gRPC就能看到一个选项点击下一步填写好项目名称和项目地址以后点击创建然后可以看到NetCore版本是3.1然后不勾选Docker点击创建。等待新建好项目就可以看到默认的文件是这样的其实和我们创建ASP.NETCore项目是很相似的如果说真的不一样就是依赖包和多了一个Protos的文件夹那下边我们来一一看看都是怎么作用的1、依赖包Grpc.AspNetCore是gRPC结合ASP.NETCore封装的一个类库其中很重要的是下边的两个依赖包第一个就是Protobuf第二个就是Tools从名字上应该都能大概猜出来是干啥的肯定有一个是解析protobuf文件的一个是工具包负责一些操作的。2、Protos文件夹在文章的开头我们已经说过了gRPC很重要的一点就是在请求和相应的的时候需要用到一个.proto的文件用来定义服务和提供参数已经响应的参数。默认的内容是这样的 // 语法结构使用pb3syntax proto3;// 定义命名空间一般是项目名或者解决方案名option csharp_namespace GrpcService1;// 定义服务的包package greet;// 定义具体的服务service Greeter {// 定义某一个方法API格式是rpc 方法名(请求参数对象名) returns(返回参数对象名)rpc SayHello (HelloRequest) returns (HelloReply);}// 定义请求的对象名message HelloRequest {// 有一个属性字段是namestring name 1;}// 定义返回的对象名message HelloReply {// 有一个返回的字段是messagestring message 1;}可以看到虽然是扩展名是.proto的文件但是语法结构很像一个.cs文件语法上也类似当然只不过是类似具体的意思我已经在上边注释了你看看就能明白。你可能会好奇那我定义好了这一个文件怎么来使用呢别着急分成两步咱们先说第二步定义具体服务第一步先卖个关子。3、GreeterService服务上边我们定义好了proto文件下边就需要针对这个配置设计服务了因为proto仅仅是定义了服务还没有具体的内容那很简单就直接看代码吧。 /// summary/// 根据.proto定义具体的服务/// GreeterService可以任意定义/// Greeter.GreeterBase 根据.proto文件中定义的规则来/// /summarypublic class GreeterService : Greeter.GreeterBase{// 和ASP.NETCore一样可以使用依赖注入和服务private readonly ILoggerGreeterService _logger;public GreeterService(ILoggerGreeterService logger){_logger logger;}/// summary/// 重写 设计对应的多个接口/// 一般都是异步处理/// /summary/// param namerequest/param/// param namecontext/param/// returns/returnspublic override TaskHelloReply SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloReply{Message Hello request.Name});}}我也同样的把注释都写上了其实内容都是很简单的我们都已经用了ASPNETCore这么久了肯定都一样都能看明白有两个问题肯定你会问第一、定义服务我明白但是继承的父类Greeter.GreeterBase是如何处理的呢这个就是我第二步说完.proto文件的时候卖的那个关子我们定义好了.proto文件后系统会自动给我们创建生成服务、客户端和消息表示传递的数据的C# Class但是需要一个操作右键项目编辑项目文件可以看到有一个配置 ItemGroupProtobuf IncludeProtos\greet.proto GrpcServicesServer //ItemGroup
这个是官方默认模板已经创建好的是一个Server类型的服务Include对应的文件然后项目就能自动给我们创建好了父类你可以从obj文件夹看到这个时候就可以继承了。第二、如何重写对应的方法呢很简单直接针对当前的类型altenter在智能提示里找到重写就可以看到要重写的接口了4、appsettings.json注意这里别之前不一样的地方就是定义了一个节点Kestrel: {
EndpointDefaults: {
Protocols: Http2}}
在上边我们说过gRPC 需要 HTTP/2。 适用于 ASP.NET Core 的 gRPC 验证 HttpRequest.Protocol 为 HTTP/2。Kestrel 在大多数新式操作系统上支持 HTTP/2。默认情况下Kestrel 终结点配置为支持 HTTP/1.1 和 HTTP/2 连接。5、Startup.cs其他的文件内容都类似我就不多说了我们都知道要用一个服务就需要注册这个服务那就肯定需要是Startup里 // 注册grpc服务services.AddGrpc();// 在结点路由里配置指定的服务app.UseEndpoints(endpoints {endpoints.MapGrpcServiceGreeterService();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/?linkid2086909);});});项目启动可以看到只有https安全协议的因为上边已经说过了使用gRPC必须是http/2的同样也是需要https安全协议的。到这里就没有问题了说完了系统默认模板创建的方案那现在我们不用这个方案尝试一下如果已经创建好了一个NetCore的API项目比如我的Blog.Core如何在这个基础上创建gRPC服务呢基于ASP.NETCore项目创建因为上边我们已经讲完了对应的内容和注意事项为了篇幅不罗嗦我就直接创建看看是否真的可以还是在当然解决方案创建一个netcore的api项目然后添加三个nuget包PackageReference IncludeGoogle.Protobuf Version3.11.2 /
PackageReference IncludeGrpc.AspNetCore.Server Version2.25.0 /
PackageReference IncludeGrpc.Tools Version2.25.0 PrivateAssetsAll /
接着添加helloworld.proto文件配置.csproj项目配置包含当前的.proto文件创建HelloWorldservice.cs服务类继承刚刚创建好的父类Hello.HelloBase最后注册服务配置中间件相应的操作可以看下边的视频现在我们已经定义了好了server端的服务那如何发起调用呢需要一个client客户端。如何发起调用1、创建一个netcore的控制台还是在该解决方案中添加一个控制台项目然后添加三个依赖包ItemGroupPackageReference IncludeGoogle.Protobuf Version3.13.0 /PackageReference IncludeGrpc.Net.Client Version2.32.0 /PackageReference IncludeGrpc.Tools Version2.33.1PrivateAssetsall/PrivateAssetsIncludeAssetsruntime; build; native; contentfiles; analyzers; buildtransitive/IncludeAssets/PackageReference
/ItemGroup
注意这里我们并没有添加其他的项目引用2、把Hello.proto拷贝到控制台这个很简单只需要直接把文件夹和文件直接拖动过去就行了。然后配置下.csproj文件修改下gprc的服务类型一定是clientItemGroupProtobuf IncludeProto\helloworld.proto GrpcServicesClient /
/ItemGroup
3、发起调用我这里就直接写代码了 class Program{static async System.Threading.Tasks.Task Main(string[] args){// 创建通道var channel GrpcChannel.ForAddress(https://localhost:5001);// 发起客户端调用var client new Hello.HelloClient(channel);// api请求传递参数var response await client.SayHelloAsync(new HelloRequest { Name World });Console.WriteLine(Greeting: response.Message);}}
大概意思就是这样的应该能够看懂的。运行我们的gRPC服务也就是运行core的webapi程序然后运行客户端控制台看到没有我们并没有在控制台去引用我们的gRPC服务端的代码只需要一个.proto文件就能够像调用方法一样去调用其他服务端项目的服务这就是很大的直观上的好处。当然好处还有很多的比如什么是流式如何实现服务间调用如何网关配置等等等等咱们下次再见吧。