Dapr + .NET 实战(十二)服务调用之GRPC

欢迎大家参加4小时Dapr+.NET 5的实战课程

课程链接     https://ke.qq.com/course/4000292?tuin=1271860f

62726f67457ec4b233be40951883669f.png

什么是GRPC

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点是:

  • 高性能轻量级 RPC 框架。

  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。

  • 可用于多种语言的工具,以生成强类型服务器和客户端。

  • 支持客户端、服务器和双向流式处理调用。

  • 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于:

  • 效率至关重要的轻量级微服务。

  • 需要多种语言用于开发的系统。

  • 需要处理流式处理请求或响应的点对点实时服务。

Dapr中的GRPC

Dapr中的GRPC与我们通常情况下使用GRPC大致是一致的,唯一的不同是Dapr中的GRPC会固定调用接口/dapr.proto.runtime.v1.AppCallback/OnInvoke,因此我们在Dapr中使用GRPC时,proto文件中不需要再定义service节点中的rpc接口,只需要定义交互使用的序列化结构体即可。

项目实战

我们继续使用FrontEnd+BackEnd项目,首先需要将BackEnd中的监听协议切换成https,因为GRPC是基于HTTP2实现的,传输层使用TLS。

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>().UseUrls("https://*:5000");});

BackEnd

1.为BackEnd引入Nuget包

  • Dapr.AspNetCore

  • Grpc.AspNetCore

2.在BackEnd中新建Protos/greet.proto文件,定义交互的结构体

syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

注意:不需要定义service.rpc接口,因为Dapr中的GRPC固定调用接口/dapr.proto.runtime.v1.AppCallback/OnInvoke。

3.修改项目文件BackEnd.csproj

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

4.新增接口类Services/HelloService

public class HelloService : AppCallback.AppCallbackBase{public override async Task<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context){var response = new InvokeResponse();switch (request.Method){case "sayhi":var input = request.Data.Unpack<HelloRequest>();response.Data = Any.Pack(new HelloReply { Message = "ok" });break;}return response;}}

HelloService中我们只需要定义OnInvoke方法,通过request.Method来实现不同业务的代码编写。

5.为grpc注入类

services.AddGrpc();

6.为grpc新增终结点映射

endpoints.MapGrpcService<HelloService>();

FrontEnd

1.为FrontEnd引入Nuget包

  • Google.Protobuf

  • Grpc.Net.Client

  • Grpc.Tools

2.新增Protos/greet.proto文件

syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

3.修改FrontEnd.csproj文件

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

4.在DaprController中新增接口

[HttpGet("grpc")]public async Task<ActionResult> GrpcAsync(){using var daprClient = new DaprClientBuilder().Build();var result = await daprClient.InvokeMethodGrpcAsync<HelloRequest, HelloReply>("backend", "sayhi", new HelloRequest { Name = "aaa" });return Ok(result);}

测试

1.运行BackEnd

dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend  --app-protocol grpc  dotnet  .\BackEnd\bin\Debug\net5.0\BackEnd.dll --app-ssl

我们通过--app-protocol grpc指明了使用grpc,通过--app-ssl指明了开启tls

2.运行FrontEnd

dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll

3.调用FrontEnd的dapr/grpc接口进行测试,调用成功!!

73e4752c64100136c793ce090c84b306.png

相关文章:

  • Dapr实战(一) 基础概念与环境搭建

  • Dapr + .NET Core实战(二) 服务调用

  • Dapr + .NET Core实战(三)状态管理

  • Dapr + .NET 实战(四)发布和订阅

  • Dapr + .NET 实战(五)Actor

  • Dapr + .NET 实战(六)绑定

  • Dapr + .NET 实战(七)Secrets

  • Dapr + .NET 实战(八)服务监测

  • Dapr + .NET 实战(九)本地调试

  • Dapr + .NET 实战(十-终篇)K8S运行Dapr

  • Dapr + .NET实战(十一)单机Dapr集群负载均衡

  • 为什么 Dapr 如此令人兴奋

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

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

相关文章

SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集

SCVMM 2012 R2运维管理九之&#xff1a;添加非信任的Hyper-v主机和群集之前的博文中我们为各位朋友介绍了如何向SCVMM中添加受信任的Hyper-v的主机和群集&#xff0c;相信大家也都已经有了一个比较深刻的理解&#xff0c;那么今天的博文中就来和大家聊聊:如何添加非受信任的Hyp…

走访近20家代工厂后:近千块的大牌T恤,成本只要几十块

▲ 点击查看“很多人都知道大牌有溢价但是不知道大牌溢价逼近900%打个比方一件1000块的T恤&#xff0c;T恤成本如果是100那么剩下的900&#xff0c;算是买了个大牌logo”这是我们上个月去到的一家中国代工厂工厂内部人员向我们透露的他说&#xff0c;其实无论是纪梵希、爱马仕、…

python execute_command err_Python management.execute_from_command_line方法代碼示例

本文整理匯總了Python中django.core.management.execute_from_command_line方法的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Python management.execute_from_command_line方法的具體用法&#xff1f;Python management.execute_from_command_line怎麽用&#xff1f;…

linux脚本多线程,Shell多线程操作及线程数控制实例

前言在业务开发过程中&#xff0c;经常会在后台写一些shell脚本处理数据&#xff0c;但估计很多人不知道shell脚本也可以支持多线程&#xff0c;而且非常简单。本篇文章主要就是介绍shell实现多进程以及进程数量控制。需求为了更好的说明问题&#xff0c;我们结合例子讲解&…

Node.js Undocumented(2)

写这种系列blog&#xff0c;是为了监督自己&#xff0c;不然我估计我不会有动力写完。这一节&#xff0c;我将介绍下Buffer这个module。js本身对文本友好&#xff0c;但是处理二进制数据就不是特别方便&#xff0c;因此node.js提供了Buffer模块来帮助你处理二进制数据&#xff…

注册asp.net 4.0 到iis

如果没有按照正常的先装iis后装.net的顺序&#xff0c;可以使用此命令重新注册一下&#xff1a; 32位的Windows&#xff1a;---------------------------------------------------------------------------1. 运行->cmd 2. cd C:\Windows\Microsoft.NET\Framework\v4.0.30…

公开征集 | 每个人都可以成为 COSCon'21 主论坛的开源明星

“ 点击蓝字 / 关注我们 ”| 作者&#xff1a;COSCon21 组委会| 编辑&#xff1a;钱奕| 设计&#xff1a;朱亿钦| 责编&#xff1a;沈于蓝在开源的世界里&#xff0c;我们常常说 Community &#xff1e; Code&#xff08;社区重于代码&#xff09;&#xff0c;Community 一词在…

python怎么处理异常然后继续_Python异常处理-返回行,继续

通常,在try块内触发异常后,您永远都无法将执行返回到特定的代码段,因为该异常可能在很深的某个地方发生,并受其他线程的其他副作用影响的许多其他状态.尽管您的程序可能不是这种情况,但是鉴于没有通用的解决方案允许在Python中进行此操作,因此使用异常处理基本上不可能实现您想…

linux 编写脚本示范,Linux-scripts-简单脚本和脚本的执行

9.Scripts9.1什么是 Shell scriptsshell script 是利用 shell 的功能所写的一个『程序 (program)』&#xff0c;这个程序是使用纯文本文件&#xff0c;将一些 shell 的语法与指令(含外部指令)写在里面&#xff0c;搭配正规表示法、管线命令与数据流重导向等功能&#xff0c;以达…

SQL server 2000 和2005中怎么让ldf文档变小

SQL server 2005 打开数据库-- 新建查询--输入以下两条命令&#xff1a; Dump transaction databasename with no_log backup log databasename with no log --然后选择数据库--收缩--文件-- 选择日志--选择收缩方式里到xxMB,然后就可以了。 en:chose database--shrink-- file-…

MyEclipse JAVA提示信息配置

1.内容提示 1.1 Windows>Preferences>Java>Editor>Content Assists 找到”auto activation triggers for Java“ 输入框&#xff0c;初始为’.&#xff0c;改为‘.abc. 1.2 Export Preferences配置文件取名为’1.epf,编辑‘1.epf’,找到‘.abc,改为’.abcdefghijk…

被质疑“在开源社区执行微软意愿”,.NET 基金会前董事为其提交的 PR 道歉并辞职...

编译&#xff5c;燕珊.NET基金会最近“不太平”。上周五&#xff0c;.NET 基金会执行董事 Claire Novotny 在其成员反对她对其中一个项目的干预后&#xff0c;为自身的行为道歉并宣布辞去职务。巧合的是一个多月前&#xff0c;董事会成员 Rodney Littles II 因与基金会的目标方…

hadoop扩充磁盘操作记录

记录cloudera扩充磁盘1、4台主机&#xff0c;每台主机增加一块2TB的硬盘2、首先简单说明步骤A、分区&#xff0c;挂载&#xff08;挂载目录&#xff08;名称&#xff0c;路径&#xff09;要一致&#xff09;B、在挂载的分区内&#xff0c;建立对应的文件夹&#xff0c;并授权C、…

linux命令clock,简单了解Linux系统中clock命令的使用方法

clock 命令&#xff1a;设置或者显示硬件时间的近似值必要参数--adjust 自动调整硬件时钟时间--debug 运行时&#xff0c;输出详细的处理过程--directisa 不通过设备文件/etc/rtc&#xff0c;直接对硬件时钟进行存取--getepoch 输出硬件时钟的数值到标准输出--hctosys 时钟同步…

单身两年以上是什么体验?

1 单身两年以上是什么体验&#xff1f;2 这群熊孩子&#xff0c;不当演员可惜了。。3 我要出去&#xff01;我要见园长&#xff01;我为幼儿园立过功&#xff01;我为幼儿园卖过萌&#xff01;4 当心&#xff01;陷阱&#xff01;&#xff01;5 一位主人抓拍下了自家的柴犬宝宝…

wince导航_宁可用手机导航,也不用汽车导航?

很多车主朋友在开车的时候&#xff0c;比较青睐的是手机导航而不是汽车导航。笔者我也是一个车主&#xff0c;我在开车的时候也是比较青睐手机导航而不是汽车导航&#xff0c;我认为主要是有以下几个原因&#xff1a;车载导航的准确性没有手机导航的高。很多车载导航的地图是在…

Hibernate 逆向工程生成POJO类和映射文件

Guestbook.java 代码&#xff1a; package com.b510.examplex; import java.util.Date; public class Guestbook implements java.io.Serializable { private static final long serialVersionUID -7004492417383895995L; private Integer id; private String name; private S…

功能导航设计器

本程序使用C#编写&#xff1b;此模块作用为让程序功能使用人员直观的知道程序功能模块的先后顺序和操作的先后顺序&#xff1b;原理为客户端通过设计器设置程序的功能流程&#xff1b;并保存的文件服务器上&#xff1b;在使用人员程序中可以直观的调出程序模块的图示&#xff1…

.Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

前面对于分布式事务也讲了好几篇了&#xff08;可靠消息最终一致性分布式事务 - TCC分布式事务 - 2PC、3PChttps://github.com/kklldog/AgileDT 开源不易&#xff0c;大家多多 ✨✨✨回顾 前面一篇文章(可靠消息最终一致性 )我们详细介绍了基于可靠消息的分布式事务。为了更好的…

一位汉子的恋爱心得

1 每天早上起床的你。。2 喂&#xff0c;你怎么不理我&#xff01;3 最新防撕家方法。。4 塑料姐妹花&#xff0c;离得远显脸小。。心疼左一&#xff01;5 国外一位汉子的恋爱心得……6 当有人跟你说“追星有什么用&#xff0c;那些人也不认识你”。。你点的每个赞&#xff0c;…