dapr+.net实战服务调用之grpc

dotNET跨平台 dotNET跨平台     2023-01-15     709

关键词:

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

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

什么是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接口进行测试,调用成功!!

相关文章:

dapr牵手.net学习笔记:状态管理之docker-compose发布

Dapr牵手.NET学习笔记:想入非非的服务调用Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用Dapr牵手.NET学习笔记:用docker-compose部署服务说明:为了给出demo的全貌,这篇有点长,如果有上一篇的基础,... 查看详情

dapr+.net实战服务监测

服务监测分布式服务性能指标,链路追踪,运行状况,日志记录都很重要,我们日常开发中为了实现这些功能需要集成很多功能,替换监控组件时成本也很高。Dapr可观测性模块将服务监测与应用程序分离。它... 查看详情

dapr+.netcore实战服务调用(代码片段)

服务调用是什么在分布式应用程序中的服务之间进行调用会涉及到许多挑战。例如:维护其他服务的地址。如何安全地调用服务。在发生短暂的暂时性错误时如何处理重试。分布式应用程序调用链路追踪。服务调用构建块通... 查看详情

dapr+.net实战本地调试

前几节开发Dapr应用程序时,我们使用daprcli来启动dapr服务,就像这样:daprrun--dapr-http-port3501--app-port5001--app-idfrontenddotnet.\\FrontEnd\\bin\\Debug\\net5.0\\FrontEnd.dll如果你想要通过dapr调试服务呢?在这里使用d 查看详情

dapr+.net实战(十-终篇)k8s运行dapr(代码片段)

工作原理为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector、dapr-operator、dapr-placement和dapr-sentry服务。 dapr-operator:管理组件(statestores,pub/subs,etc.)dapr-sidecar-injector: 将Dapr注入 annotated pods,并 查看详情

手把手教你学dapr-4.服务调用(代码片段)

介绍通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠、安全地通信。为什么不直接用HttpClientFactory呢先问几个问题:如何发现和调用不同服务的方法如何安全地调用其他服务,并对... 查看详情

dapr+.net实战绑定(代码片段)

什么是绑定处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处:避免连接到消息系统(如队列和消息总线)并进行轮询的复杂性聚焦于业务逻辑,而不是如何与系统交互使代码不受SDK或外部库的强耦... 查看详情

dapr+.net实战发布和订阅(代码片段)

什么是发布-订阅发布订阅是一种众所周知并被广泛使用的消息传送模式,常用在微服务架构的服务间通信,高并发削峰等情况。但是不同的消息中间件之间存在细微的差异,项目使用不同的产品需要实现不同的实现... 查看详情

blazor+dapr+k8s微服务之服务调用

 1.1  Dapr环境配置1.1.1       在开发机安装DockerDesktop并启用Kubernetes安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和K8s正在运行) 1.1.2       在开发机安装DaprCli安装命令:powershell-Command... 查看详情

dapr牵手.net学习笔记:想入非非的服务调用

demo运行环境:Windows10,Docker(dapr_zipkin,dapr_redid,dapr_placement)安装:daprinit卸载:dapruninstall,然后删除C:\\Users\\当前用户\\.daprdapr在部署时是通过给服务挂载一个sidecar, 查看详情

dapr+.net实战(十四)虚拟机集群部署mdns+consul

前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr。1.环境准备我们准备两台centos7虚拟机Dapr1:192.168.43.131Dapr2:192.168.43.1322.DaprCLI安... 查看详情

blazor+dapr+k8s微服务之开发环境调试

...模式不支持开发调试在上一篇随笔《Blazor+Dapr+K8s微服务之服务调用》中,我们通过为每个微服务运行daprrun….dotnetrun命令,以自宿主的方式在本地开发环境成功运行了服务调用的例子。但是,这种运行方式是不... 查看详情

dapr牵手.net学习笔记:跨物理机负载均衡服务调用

...用外部负载均衡nginx来对应,那在不同的host中跑同一服务,看看dapr内部的负载均衡是怎么实现的。说说现有的服务,两个服务,订单服务,支付服务;下完订单后同步调支付服务。一、demo项目的mock代码Ord... 查看详情

漫谈grpc5:实战,在java中使用grpc(代码片段)

原文链接:java版gRPC实战之二:服务发布和调用-掘金欢迎访问我的GitHubgithub.com/zq2599/blog…内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;关于《java版gRPC实战》系列《java版gRPC实... 查看详情

dapr+.net实战actor(代码片段)

什么是Actor模式Actors为最低级别的“计算单元”以上解释来自官方文档,看起来“晦涩难懂”。大白话就是说Actors模式是一段需要单线程执行的代码块。实际开发中我们经常会有一些逻辑不能并发执行,我们常用的做法就... 查看详情

dapr+.net实战secrets(代码片段)

什么是Secrets应用程序通常会通过使用专用的存储来存储敏感信息,如连接字符串、密钥等。通常这需要建立一个密钥存储,如AzureKeyVault、Hashicorp等,并在那里存储应用程序级别的密钥。要访问这些密钥存储,应... 查看详情

dapr的grpc组件(又叫可插拔组件)的提案

Dapr在1.9版本中的提案,计划在DaprRuntime中组件采用外部gRPC组件:https://github.com/dapr/dapr/issues/3787,针对这个gRPC组件有一个具体实现方面的提案https://github.com/dapr/dapr/issues/4925。昨天刚批准了其中的PRhttps://github.com/da 查看详情

手把手教你学dapr-4.服务调用

参考技术A通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠、安全地通信。先问几个问题:此时你会发现这些事情HttpClientFactory没有帮你完成,而在微服务中这些又是必不可少的能力,接下来看... 查看详情