.netcore微服务之gRPCJoni是只狗

RPC基本理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个RPC服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。

gRPC是由谷歌开发的一种语言中立、平台中立、开源的RPC的高性能远程过程调用(RPC)框架。

说的白话一点,可以这么理解:现在有两台服务器A和B。部署在A服务器上的应用,想调用部署在B服务器上的另一个应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来达到调用的效果。

现在,我们在A服务的一个本地方法中封装调用B的逻辑,然后只需要在本地使用这个方法,就达到了调用B的效果。

gRPC消息使用Protobuf(一种高效的二进制消息格式)进行序列化。Protobuf在服务器和客户端上可以非常快速地序列化。Protobuf序列化产生的有效负载较小,这在移动应用等带宽有限的方案中很重要。

gRPC专为HTTP/2(HTTP的主要版本)而设计,与HTTP1.x相比,HTTP/2具有巨大性能优势:

HTTP/2不是gRPC独占的。许多请求类型(包括具有JSON的HTTPAPI)都可以使用HTTP/2,并受益于其性能改进。

具有JSON的HTTPAPI没有正式规范。开发人员为URL、HTTP谓词和响应代码的最佳格式争论不休。

HTTP/2为长期实时通信流提供基础。gRPC为通过HTTP/2进行流式传输提供一流支持。

gRPC服务支持所有流式传输组合:

一元RPC:客户端向服务器发送单个请求并返回单个响应,就像普通的函数调用一样,也就是最常见的客户端请求、服务端响应实现方式

服务器流式RPC:客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息。gRPC保证单个RPC调用中的消息排序。

客户端流式RPC:其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。一旦客户端完成写入消息,它等待服务器读取它们并返回其响应。gRPC再次保证单个RPC调用中的消息排序。

双向流式RPC:其中双方使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照他们喜欢的任何顺序进行读写:例如,服务器可以在写入响应之前等待接收所有客户端消息,或者它可以交替读取消息然后写入消息,或其他一些读取和写入的组合。保留每个流中消息的顺序。

当前无法通过浏览器直接调用gRPC服务。gRPC大量使用HTTP/2功能,且没有浏览器在Web请求中提供支持gRPC客户端所需的控制级别。例如,浏览器不允许调用方要求使用HTTP/2,也不提供对HTTP/2基础框架的访问。

ASP.NETCore上的gRPC提供两种兼容浏览器的解决方案:

HTTPAPI请求以文本形式发送,并且可进行人工读取和创建。

默认情况下,gRPC消息使用Protobuf进行编码。尽管Protobuf可以高效地发送和接收,但其二进制格式非人工可读取。Protobuf要求在.proto文件中指定消息接口描述来正确地反序列化。需要使用其他工具来分析网络上的Protobuf有效负载以及手动撰写请求。服务器反射和gRPC命令行工具等功能可帮助使用二进制Protobuf消息。此外,Protobuf消息支持与JSON之间的转换。内置的JSON转换提供在调试时将Protobuf消息与人工可读取格式互相转换的高效方法。

在以下方案中,建议使用其他框架取代gRPC:

1.创建服务端

在“创建新项目”对话框中,搜索gRPC。选择“ASP.NETCoregRPC服务”,新建名为GrpcGreeter的gRPC服务项目

GrpcGreeter项目文件:

解读一下greet.proto的文件syntax="proto3";//protobuf有2个版本,默认版本是proto2,如果需要proto3,则需要在非空非注释第一行使用syntax="proto3"标明版本。

GreeterService类中的代码就是服务的具体实现,我们的业务就写在这里

//配置服务端builder.Services.AddGrpc(options=>{options.EnableDetailedErrors=true;options.MaxReceiveMessageSize=2*1024*1024;//2MB//默认Null,消息大小不限制options.MaxSendMessageSize=5*1024*1024;//5MB//默认Null,消息大小不限制});//单个服务配置会覆盖全局选项//builder.Services.AddGrpc().AddServiceOptions(options=>//{//options.MaxReceiveMessageSize=2*1024*1024;//2MB//options.MaxSendMessageSize=5*1024*1024;//5MB//});对实现类GreeterService也添加了注入,如果自己新增了实现类也需要在这里注入

app.MapGrpcService();

2.创建客户端

2.1我这里创建了一个.netcorewebapi的项目作为客户端,取名为GrpcClient。

2.2引入nuget包

Install-PackageGrpc.Net.ClientInstall-PackageGoogle.ProtobufInstall-PackageGrpc.Tools2.3创建Protos文件夹

2.4从gRPC服务端将Protos\greet.proto文件复制到gRPC客户端项目中的Protos文件夹。

2.5将客户端greet.proto文件中的命名空间更新为项目的命名空间,其他东西都不改变:

optioncsharp_namespace="GrpcClient";效果:

syntax="proto3";optioncsharp_namespace="GrpcClient";packagegreet;//Thegreetingservicedefinition.serviceGreeter{//SendsagreetingrpcSayHello(HelloRequest)returns(HelloReply);rpcSendMessage(SendMessageRequest)returns(SendMessageReply);}//Therequestmessagecontainingtheuser'sname.messageHelloRequest{stringname=1;}//Theresponsemessagecontainingthegreetings.messageHelloReply{stringmessage=1;}messageSendMessageRequest{stringmessage=1;}messageSendMessageReply{stringmessage=1;}

2.6编辑GrpcGreeterClient.csproj项目文件,添加具有引用greet.proto文件的元素的项组:

3.上面环境大部分都是自动生成的,这里看一下正题,客户端如何调用,测试一下调用一下服务端的SendMessage方法很简单

1.引入nuget包

Install-PackageMicrosoft.AspNetCore.Authentication.JwtBearer2.创建简易JWT帮助类

publicstaticclassJwtTicketHelper{publicstaticJwtSecurityTokenHandlerJwtTokenHandler=newJwtSecurityTokenHandler();publicstaticSymmetricSecurityKeySecurityKey=newSymmetricSecurityKey(Guid.NewGuid().ToByteArray());publicstaticstringCreateToken(stringname){if(string.IsNullOrEmpty(name)){thrownewInvalidOperationException("Nameisnotspecified.");}varclaims=new[]{newClaim(ClaimTypes.Name,name)};//这里可以自定义写入其他想要的claimvarcredentials=newSigningCredentials(SecurityKey,SecurityAlgorithms.HmacSha256);vartoken=newJwtSecurityToken("ExampleServer","ExampleClients",claims,expires:DateTime.Now.AddSeconds(60),signingCredentials:credentials);returnJwtTokenHandler.WriteToken(token);}}3.Program.cs配置:

app.MapGet("/generateJwtToken",context=>{returncontext.Response.WriteAsync(JwtTicketHelper.CreateToken(context.Request.Query["name"]));});注意:当然获取token这里也可以通过grpc的方式获取,下面两种方式都演示了

4.在Protos文件夹中创建新的proto文件演示,这里命名为ticketer.proto

注意:1.右键=》新建文件=》可以添加后缀为proto的“协议缓冲区文件”,但是一直提示“必须指定语言”的错误我就放弃了2.不要复制现有的greet.proto来创建文件,直接导致(GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos)生成不了相应的文件,直接报错,这个坑了我好久。不知道是不是bug会不会修复3.我这里是手动创建了一个文本文件,然后修改其后缀为proto

syntax="proto3";optioncsharp_namespace="GrpcTicketServer";import"google/protobuf/empty.proto";packageTicketer;serviceTicketer{rpcTestEmpty(google.protobuf.Empty)returns(google.protobuf.Empty);rpcSendMessage(Ticketer_SendMessageRequest)returns(Ticketer_SMessageReply);rpcGetToken(TokenRequest)returns(TokenReply);}messageTokenRequest{stringname=1;}messageTokenReply{stringtoken=1;}messageTicketer_SendMessageRequest{stringmessage=1;}messageTicketer_SMessageReply{stringmessage=1;}ticketer.proto5.在Services文件夹中创建实现类TicketerService。

[HttpGet("ticketer_sendmessage")]publicasyncTaskTicketer_SendMessage(){varchannel=awaitGrpcCommon.GetGrpcInstance();varclient=newTicketer.TicketerClient(channel);varreply=awaitclient.SendMessageAsync(newTicketer_SendMessageRequest{Message="我是GrpcClient"});returnOk(reply.Message);}效果:

侦听器是一个gRPC概念,允许应用与传入或传出的gRPC调用进行交互。它们提供了一种方法来扩充请求处理管道,侦听器针对通道或服务进行配置,并针对每个gRPC调用自动执行。由于侦听器对用户的应用程序逻辑是透明的,因此它们是适用于常见情况(例如日志记录、监视、身份验证和验证)的极佳解决方案。

Interceptor方法为客户端重写以下项:

publicclassServerLoggerInterceptor:Interceptor{privatereadonlyILogger_logger;publicServerLoggerInterceptor(ILoggerlogger){_logger=logger;}publicoverrideasyncTaskUnaryServerHandler(TRequestrequest,ServerCallContextcontext,UnaryServerMethodcontinuation){_logger.LogInformation($"Startingreceivingcall.Type:{MethodType.Unary}."+$"Method:{context.Method}.");try{returnawaitcontinuation(request,context);}catch(Exceptionex){_logger.LogError(ex,$"Errorthrownby{context.Method}.");throw;}}}builder.Services.AddGrpc(options=>{options.EnableDetailedErrors=true;options.MaxReceiveMessageSize=2*1024*1024;//2MB//默认Null,消息大小不限制options.MaxSendMessageSize=5*1024*1024;//5MB//默认Null,消息大小不限制options.Interceptors.Add();//将ServerLoggerInterceptor添加到服务选项的Interceptors集合中,为所有服务配置它。});

THE END
1.CS1.6比赛身法技巧大全反恐精英1.6论坛五.键盘狗跳(躲爆头、压脚步声)……一、移动的训练 在CS中,一共有4个方向键盘把握着移动的方向,...https://www.doyo.cn/game/luntan/viewthread/96664
2.doinb大骂白云队cs,狗,怪英雄联盟丨LPLdoinb大骂白云队cs,狗,怪不得你们拿不了冠军 灵念ing 11-22 23:54 关注 大b和白云队约10点训练赛,然后9点50多大b在窥imp直播,听到白云队在那开玩笑,说搞个剧本,随便打打之类的,然后白云队在10点02全部进组,但是大b彻底爆了,喷了一路,几乎什么都说了,看完以后觉得很难评。https://m.hupu.com/bbs/629065869.html
3.2月份财运最佳的三大生肖新的一个月份到来,每个人的财运也会发生一定的变化。那么在2月4日立春过后,哪些生肖的财运最佳呢?其中有你吗? 1、属狗人 属狗人有望得到职场上较为可观的效益奖金,以及来自家庭长辈的物质资助。虽然属狗人拿得有些勉强和严肃,但这并不妨碍他能得到家人最实际的帮助和关爱。托吉星在属狗人好运宫位的福,爱好...http://big5.xinhuanet.com/gate/big5/www.cs.com.cn/tzjj/tjdh/201601/t20160125_4892086.html
4.过安全狗的aspx一句话webshell过安全狗的aspx一句话webshell 纯CS模式,经典免杀 安全狗 aspx webshell 一句话2013-02-08 上传大小:544KB 所需:50积分/C币 aspxwebshell_foodahp_11_vuewebshell_ vue项目开发 上传者:weixin_42665725时间:2021-10-01 田靖宇-day181 引入文件包含函数将文件包含进来漏洞成因:在包含文件时,为了灵活包含文件,将被...https://www.iteye.com/resource/impcevil-5059119
5.宇达为Y212机器狗(AAEWY212机器狗)报价图片参数评测参考价格: ¥68价格纠错>> 降价通知|产品对比|数码摄像头排行榜 产品类型:高清摄像头 传感器类型:CMOS 适用机型:台式机 驱动类型:无驱版 产品定位:网吧版 功能特点:抗干扰控线,可拍照 查看详细参数>> 产品简介:宇达为Y212机器狗,可拍照,抗干扰控线 https://product.yesky.com/product/672/672704/
1.ExportThe audio content generated by Export-CsOnlineAudioFile is always in WAV format (PCM 16 bit and mono) irrespective on which format the audio was imported as. Therefore, ensure that the file extension used to store the content is WAV.You are responsible for independently clearing and securing ...https://docs.microsoft.com/zh-cn/powershell/module/skype/export-csonlineaudiofile?view=skype-ps
2.skinsdog狗网好用吗?skinsdog狗网官网地址skinsdog狗网是一个提供CSGO饰品皮肤开箱的在线平台,用户注册登录后可获得免费额度。该网站允许用户直接取回所开箱子获取的皮肤。对于喜欢收集CSGO皮肤的玩家来说,这是一个尝试获取稀有饰品的途径。 摘要由CSDN通过智能技术生成 skinsdog 狗网CSGO饰品皮肤开箱网站可直接取回 ...https://blog.csdn.net/c753951c/article/details/109365780
3.KLF宠物多功能三和一饮水喂食器狗狗饮食饮水用品CS0067CS0069狗 宠物链圈、绳带 产品详情 品牌/型号:外贸/CS0067-CS0069 规格:橄榄绿、宝石蓝、洋红 材质:pp树脂 适用对象:狗 成套自动喂食:是 货号:CS0067-CS0069 箱装数量:20 供应商信息 公司地址浙江省金华市义乌市中国小商品城国际商贸城四区市场34947号商位统一社会信用代码92330782MA2A824B42 ...http://china.makepolo.com/product-detail/100189457055.html
4.TGA2016:“游戏奥斯卡”获奖榜单出炉守望成赢家《神秘海域4:盗贼末路》-顽皮狗/索尼互娱 年度最佳游戏工作室/公司 获奖工作室/公司:暴雪《守望先锋》...获奖选手:Coldzera – [Marcelo David] SK Gaming《CS:GO》 提名选手: Faker – [Lee Sang-Hyeok]https://mip.ali213.net/news/html/264961.html
5.知道狗cs的电话怎么搞?上岸交流区拉黑啊 或者白名单 你去找他不变成狗咬狗了 https://bbs.51credit.com/vipVideo/thread-7744847-1-1.html
6.渗透测试[hvv利器]cs4.4修改去特征狗狗版(美化ui,去除特征,自带...一年一度的hvv又要开始了,还在因为不会修改cs特征而被蓝队识别cs并且标记吗?还在因为监听器配置文件泄露而导致蓝队用cs上线器上线一堆假cs吗?还在担心有人利用cs服务端爆破工具爆破cs服务器吗? 现在这些问题都已解决,直接给大家提供修改后的版本~~ ps:内置key了,不需要再用csagent进行破解。已去除暗桩[aru_3]...https://cloud.tencent.com/developer/article/2099328
7.锐龙75700G和锐龙55600G怎么样锐龙75700G和锐龙55600G详细评测下面我们单独测试这2款处理器在《CS:GO》、《绝地求生》、《LOL》中的帧率表现。 8、CS:GO 这是锐龙5 5600G的成绩,在1080P最高画质下能跑出92FPS。 锐龙7 5700G表现稍后,帧率为94FPS。 9、《绝地求生》 《绝地求生》其实是一款非常吃显卡性能的游戏,这对于APU而言,还是稍微有点难度,我们只测试中画质下的...https://www.jb51.net/hardware/cpu/784566_all.html
8.细胞分裂相关蛋白CSTF64抗体品牌:邦景进口国产细胞分裂相关蛋白CSTF64抗体 价格电议 起批量≥1 盒 最小起订1盒 供货总量48盒 发货地址上海市闵行区 建议售价¥电询/盒 更新日期2024年11月22日 产品规格0.2ml/200μg 即时洽谈立即询价查看联系方式 收藏产品发送留言 VIP6年 上海邦景实业有限公司 ...https://china.guidechem.com/trade/pdetail21774110.html
9.python人狗兽python人狗大cs 引子假设有一个项目:人狗大战,需要创建2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗,狗可以咬人,怎么描述这种不同的角色和他们的功能呢?根据之前所学,用下面代码实现#!/usr/bin/envpython# -*- coding:utf-8 -*- # Author:Ljohn # Description:面向对象引子:人...https://blog.51cto.com/topic/pythonrengoushou.html