Dapr微服务应用开发系列3:服务调用构件块

题记:这篇开始逐一深入介绍各个构件块,从服务调用开始

原理

所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的。而方便的含义在于,你无需担心如下问题:

  • 如何发现其他服务,不用关心调用的链路以及负载均衡

  • 调用过程中如何保证安全性

  • 在遇到瞬态错误或中断的时候如何处理重试

  • 如何记录调用链路的跟踪信息

Dapr本身并没有提供额外的API让你去利用这些特性,上面所有的一切都通过Sidecar模式帮你横切到Dapr边车实例中自动处理。如下图所示:

你的服务对其他服务发起的一切服务调用都要经过Dapr边车实例,其他服务接收的一切服务调用同样也要经过Dapr实例。分别执行如下步骤:

  1. 如果服务A要对服务B发起调用(不管HTTP还是gRPC),其实调用的目标是服务A的Dapr边车;

  2. Dapr会利用Dapr的命名解析组件(后续文章会介绍)来找到服务B的的Dapr边车位置;

  3. 然后服务A的Dapr边车就把调用请求转发给服务B的边车了;

  4. 由于服务B的边车和服务B是配对的,知道服务B的调用信息(比如端口),所有请求被再次转发给服务B,服务B完成服务调用的业务处理;

  5. 服务B处理完,把服务调用响应结果返回给服务B的Dapr边车;

  6. 服务B的Dapr边车返回响应结果给服务A的Dapr边车;

  7. 服务A的Dapr边车最后把响应结果返回给服务A本身。

能力

从上面的原理可以看出,通过成对的Dapr边车,来作为服务之间调用的中介,就可以简化服务和Dapr边车之间的调用方式,就可以强化边车之间的调用方式。

这什么意思呢?就是Dapr把服务调用之间的一些共性且复杂的问题帮你解决掉(两个边车之间的调用),你只用采用最基本的HTTP和gRPC功能来暴露你的服务或者调用你的服务(服务与边车之间的调用)。由此,你可以获得Dapr给你提供的如下能力:

  • 寻址和负载均衡:Dapr自动帮你找到要调用的目标服务,并自动对目标服务的多个实例进行负载均衡。

  • 命名空间范围限定:可以把服务放到特定的命名空间内,从而方便隔离各类服务。这个能力最常见的用途就是用命名空间来限定运行环境(开发、测试、生产等)。不过这个能力和托管环境有关,目前只有Kubernetes支持。

  • 重试:在分布式环境中,远程服务出现瞬态故障是很常见的(可能由网络、负载、安全等因素造成),所以在微服务架构中针对同步服务调用必须实现重试机制。传统的方式下,(就算有重试框架的帮助下)需要在业务逻辑代码中编写很多冗长的重试代码。通过Dapr边车内置的重试机制极度简化了这个问题。目前Dapr的会间隔1秒最多重试3次。

  • 安全通信:分布式环境,通信的安全性也是一个需要重点关注的领域。Dapr提供了一个名为Sentry的基础服务,让边车之间的通信基于mTLS来进行安全保证(mTLS的证书会自动更新)。

  • 安全访问:在安全通信的mTLS证书的基础,可以通过配置信任域(TrustDomain)和应用标识(App Identity)来进行访问控制。在这里暂时不对此话题展开。

  • 可观测性:默认情况下,Dapr会收集边车之间服务调用的度量和跟踪信息,从而帮助开发人员来洞察和诊断应用程序。也就是说,高大上的分布式跟踪直接由Dapr提供内置支持了。

  • 可替换的服务发现:原理里面提到Dapr之间的服务发现会依赖于一个称之为命名解析组件的东西,实际上这个东西可以在不同的托管环境中进行替换。默认情况下,在Kubernetes里面,是使用DNS Service来作为命名解析组件的实现。

规范

由于服务调用这个构件块并没有为服务应用提供什么可直接访问的能力,所以整个规范也相对简单,仅仅规定了调用其他应用的URL模式,即通过如下地址来发送HTTP请求(或gRPC请求):

POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/invoke/<appId>/method/<method-name>

上面的URL地址涉及到几个约定好的参数:

  • daprPort:这是Dapr边车暴露的HTTP端口(默认50001)或者gRPC端口(默认3500);可以通过 dapr run--dapr-grpc-port--dapr-http-port 来设置;应用内可以通过 DAPR_HTTP_PORTDAPR_GRPC_PORT 这两个环境变量来获得端口值。

  • appId:这是目标应用的AppId,在命名空间(如果有)内唯一的标识;可以通过 dapr run--app-id 来设置。

  • method-name:这是需要调用的目标应用的接口名称,一般是根路径(比如 /hello )或者嵌套路径(比如 /api/weather )也是支持的。

DOTNET SDK

作为DOTNET博主,我就仅介绍DOTNET SDK的情况。由于服务调用规范本身就简单,所以SDK也相对简单。对于被调用端,目前并没有提供任何辅助的能力,你只需要使用适合的现成框架来暴露HTTP或者gRPC端点。

对于调用端,提供了一个客户端类 DaprClient,有如下方法来帮助你发送服务调用的请求:

  • InvokeMethodAsync

  • InvokeMethodRawAsync

  • InvokeMethodWithResponseAsync

对于DaprClient具体的用法可以参见这里的示例代码:https://github.com/dapr/dotnet-sdk/blob/master/samples/Client/DaprClient/Program.cs#L217

internal static async Task InvokeDepositServiceOperationAsync(DaprClient client)
{Console.WriteLine("Invoking deposit");var data = new { id = "17", amount = (decimal)99 };// Invokes a POST method named "depoit" that takes input of type "Transaction" as define in the RoutingSample.Console.WriteLine("invoking");var a = await client.InvokeMethodAsync<object, Account>("routing", "deposit", data, HttpInvocationOptions.UsingPost());Console.WriteLine("Returned: id:{0} | Balance:{1}", a.Id, a.Balance);Console.WriteLine("Completed");
}

用法与例子

要了解服务调用构件块具体如何使用的,照着官方文档做就是了。

对于不想看英文文档的同学,可以关注我们Dapr中文社区的翻译过程(也欢迎加入):https://github.com/dapr-cn/docs

另外我在单独写一个Dapr的Quickstarts(正在逐步完善中),大家可以参考:https://github.com/heavenwing/dapr-dotnet-quickstarts/tree/main/ServiceInvocation

彩蛋——如何暴露gRPC端点

最后,官方文档里面其实没有把如何暴露gRPC端点这个话题讲清楚,不过在SDK中其实已经把dapr的Protobuf 封装好了(其实是自动生成好了),你引用了SDK中的Dapr.Client包就可以直接使用。我之前根据dapr的protobuf协议实现了一个例子,其实就是实现 AppCallback.AppCallbackBaseTask<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context) 方法,并通过ASP.NET Core来托管。代码已经合并到SDK中的samples部分,见:https://github.com/dapr/dotnet-sdk/blob/master/samples/AspNetCore/GrpcServiceSample/Readme.md。调用代码见:https://github.com/dapr/dotnet-sdk/blob/master/samples/Client/DaprClient/Program.cs#L298

后来我觉得这个示例更加类似quickstarts,而不是SDK的示例,后面我会把这个示例添加到我的quickstarts中,并在SDK中去实现一个真正进行gRPC端点暴露开发的辅助能力,敬请期待。

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

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

相关文章

Android开发p图软件,媲美大神P图效果 Android软件抠图神手

媲美大神P图效果 Android软件抠图神手2013年02月20日 01:50作者&#xff1a;杨霏霏编辑&#xff1a;杨霏霏文章出处&#xff1a;泡泡网原创分享泡泡网手机频道2月20日 PS的功能大家耳熟能详&#xff0c;其中抠图便是各位PS用户普遍会用到的一个功能。然而手机上抠图大家想过吗&…

腾讯公测云开发低码!实战评测

听说腾讯的新产品『 云开发低码 』即将开放公测了&#xff0c;怀着无比激动的心情&#xff0c;鱼皮立刻去官网申请并成功拿到了公测资格&#xff0c;然后使用它开发了一个小程序&#xff0c;并且通过 2020 Techo Park 开发者大会加深了对这项技术的了解。而就在 2020 年的最后一…

gitee 从 拉取新分支到本地_Hexo博客详细教程(一)| 建立本地站点

点上方蓝字关注我们每天都有好玩的东西等着你博客炫酷效果展示安装Hexo安装Git参考文章&#xff1a;Git实用教程(二) | Git简介及安装详解。安装NodejsNodejs可以从官网( https://nodejs.org/en )下载LTS版本&#xff1a;安装之后检查一下是否正常输出版本信息&#xff1a;安装…

索尼android 怎么截屏快捷键,索尼XZ Premium怎么截屏 2种索尼XZ Premium截图方法

截屏作为手机常用功能之一&#xff0c;我们经常在分享朋友圈或微博的时候经常需要用到屏幕截屏。今天本文主要分享一下索尼XZ Premium怎么截屏&#xff0c;作为一款相对冷门的非国产骁龙835旗舰机&#xff0c;在使用中难免出现一些不太熟悉的问题&#xff0c;下面小编分享2种索…

IdentityServer4 之Client Credentials走起来

前言API裸奔是绝对不允许滴&#xff0c;之前专门针对这块分享了jwt的解决方案(WebApi接口裸奔有风险)&#xff1b;那如果是微服务&#xff0c;又怎么解决呢&#xff1f;每一个服务都加认证授权也可以解决问题&#xff0c;只是显得认证授权这块冗余&#xff0c;重复在搞事情&…

读数据库遇到空就进行不下去_如何保证缓存与数据库的双写一致性?

作者&#xff1a;你是我的海啸来源&#xff1a;https://blog.csdn.net/chang384915878分布式缓存是现在很多分布式应用中必不可少的组件&#xff0c;但是用到了分布式缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据…

Windows Terminal 新手入门

翻译自 Kayla Cinnamon 2020年12月17日的文章《Getting Started with Windows Terminal》[1]安装Windows Terminal&#xff08;Windows 终端&#xff09;有两个不同的版本&#xff1a;Windows Terminal[2] 和 Windows Terminal 预览版[3]。两个版本都可以从 Microsoft Store 和…

5120v2怎么配置web登陆_阿里企业邮箱如何配置和添加到第三个电子邮件客户端中?...

我们常见的第三方邮箱客户端有&#xff1a;Outlook、Thunderbird、Live mail、Web客户端、畅邮&#xff08;DM Pro&#xff09;客户端等&#xff0c;下面用畅邮&#xff08;DM Pro&#xff09;为例。流程一.配置信息企业邮箱POP、SMTP、IMAP地址列表如下&#xff1a;&#xff0…

银河麒麟V10入选2020中国十大科技新闻

日前&#xff0c;中央电视台、中央人民广播电台、中国国际广播电台、中国国际电视台联合评选了“2020十大国内科技新闻”&#xff0c;“银河麒麟操作系统V10”与其他国家科技领域重大成榜上有名。8月13日&#xff0c;银河麒麟操作系统V10发布后&#xff0c;央视新闻、人民日报、…

微型计算机硬件采用什么,微型计算机的硬件系统包括什么?

微型计算机的硬件系统包括cpu、存储器、输入设备、输出设备四大部分。CPU是计算机硬件的核心&#xff0c;控制着整个计算机系统的工作&#xff1b;存储器是计算机中的记忆存储部件&#xff1b;输入设备是计算机与用户或其他设备通信的桥梁&#xff1b;输出设备是计算机硬件系统…

如何在 C# 中使用 反射

C# 中的 反射 常用于在程序的运行时获取 类型 的元数据&#xff0c;可获取的信息包括已加载到进程中的 程序集 和 类型 信息&#xff0c;它和 C 中的 RTTI&#xff08;Runtime Type Information&#xff09; 的作用是差不多的。为了能够使用反射&#xff0c;需要在项目中引用 S…

计算机基础知识教案1,计算机基础知识教案一

计算机基础知识教案一 秦皇岛外国语职业学院教案首页 年 月 日 学科 计算机基础 年级 专一 课题 计算机基础知识 教具 课时分配 2课时 教学目的 1. 了解计算机的发展、特点和应用 2&#xff0e; 掌握计算机的系统组成 3&#xff0e; 掌握各个逻辑部件性能指标和作用 教学重点、…

C# 9 新特性——init only setter

C# 9 新特性——init only setterIntroC# 9 中新支持了 init 关键字&#xff0c;这是一个特殊的 setter&#xff0c;用来指定只能在对象初始化的时候进行赋值&#xff0c;另外支持构造器简化的写法&#xff0c;Target-typed new expression 在已知类型的情况下可以使用 new() 来…

乔安监控云存储_智能运维丨全栈监控,护航云上业务

自2006年至今&#xff0c;云计算商用领域已经历了十余载的发展。云也从概念普及进入到广泛应用阶段&#xff0c;云服务变成了像水电一样的基础服务&#xff0c;已经是行业共识。云发展速度快、成长空间大&#xff0c;监控场景复杂最新Gartner的报告预测到2019年公有云市场将达到…

阿星Plus:基于abp vNext开源一个博客网站

作为微软最早迈向开源的重要软件之一&#xff0c;.NET 5的发布具有重要意义&#xff01;微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上&#xff0c;为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。这里推荐一个.NET Core 3.1 开源的…

html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径

上传文件到服务器是一个常用的操作&#xff0c;而在服务器上保存文件就需要多多用心了。因为你不可能只在一个路径里保存文件&#xff0c;所以需要实践一下保存文件到任意位置。当然&#xff0c;前提是你的应用程序有这样的操作权限。首先建立一个main.go文件&#xff0c;作为项…

excel表格中添加combobox_Excel中两个表格对比,找出不同数据

当你有两个Excel工作簿需要对比数据时候&#xff0c;你该怎么做呢&#xff1f;数据少&#xff0c;我们直接用眼睛就可以看到&#xff0c;数据如果太多&#xff0c;那么对比找出不同数据&#xff0c;是一件非常困难的事情。今天&#xff0c;小汪老师就来教大家几招&#xff0c;可…

计算机算法音乐专业,音乐信号分析算法的乐理简说(非音乐专业的乐理)

前言这篇文章不是讲乐理知识的&#xff0c;那是音乐制作人&#xff0c;编曲人员所需要钻研的学问&#xff0c;不过你要有兴趣也可以看看专业的乐理知识。这里仅仅是说在音乐信号分析的项目中&#xff0c;我们需要知道的一些参数的意义。在诸多信号处理&#xff0c;或图像处理算…

代码改变世界,也改变了我

愿2021的你&#xff0c;可以勇敢的踏出那一步&#xff0c;可以去追求自己想要的东西。脑图版代码版using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp14 {internal class Program{pr…