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;就一定会有数据…

获取html滚动条位置,pc和移动端获取滚动条的位置

html5碰撞小球模拟这里根据动量守恒和能量守恒定理来计算小球的位置,从而模拟完全弹性碰撞下的小球运行轨迹. html代码: /p>spring jdbctemplate源码跟踪闲着没事,看看源码也是一种乐趣! java操作数据库的基本步骤都是类似的: 1. 建立数据库连接 2. 创建Connection 3. 创建s…

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 和…

html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?

html xmlnshttp://www。w3。org/1999/xhtml headtitle标题页-学无忧(www。xue51。com)/title/headscript languageJavaScriptvar key0var timerfunction setObj(){ ietype (document。layers) ? 1 : 0; //判断浏览器类型 divObj (ietype)? document。mydiv : mydiv。style …

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

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

赛尔号什么时候支持html5,赛尔号三全能时代即将来临 你准备好了吗

大新闻&#xff01;赛尔号刻印系统即将迎来改版升级&#xff01;更简单的刻印强化方式&#xff0c;更清晰的刻印等级机制&#xff0c;强化满级还有额外属性加成&#xff01;想知道具体情况如何&#xff1f;下面柚子姐姐就为大家介绍本次刻印系统改版升级后的全新变化吧&#xf…

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

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

vue 调用mutation方法_Vuex白话教程第三讲:Vuex旗下的Mutation

文 | 大宏写在前面上一讲「Vuex 旗下的 State 和 Getter」&#xff0c;告诉了我们怎么去使用仓库 store 中的状态数据。当然&#xff0c;光会用肯定还不够&#xff0c;大部分的应用场景还得对这些状态进行操控&#xff0c;那么具体如何操控呢&#xff0c;这就是这一讲要说的重点…

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

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

如何在 C# 中使用 反射

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

echarts迁徙图 vue_如何快速在Vue中实现流向图或迁徙图?

原标题&#xff1a;如何快速在Vue中实现流向图或迁徙图&#xff1f;我们经常在一些新闻报道和商业杂志上看到运用地图来展示商业现象的做法。这样利用地图来反映和分析数据的形式&#xff0c;叫数据地图&#xff0c;它可以直观的表达出数据之间的空间关系。在数据地图中&#x…

霍纳法树形流图中处理机p个数_2009系统结构试卷答案

一&#xff0e;单项选择题(共10分&#xff0c;每选1分)1.与流水线最大吞吐率高低有关的是(C)A.各个子过程的时间B.最快子过程的时间C.最慢子过程的时间D.最后子过程的时间2.在流水机器中&#xff0c;全局相关是指(D)A.先写后读相关B.先读后写相关C.指令相关D.由转移指令引起的相…

html文件上传添加额外参数,bootstrap-fileinput组件在上传时传递额外参数

解决方法关键的配置参数是uploadExtraData具体的代码如下&#xff1a;//获得额外参数的方法fodderType function() {return $("#fodderTypeSelect").val();};//初始化fileinput控件(第一次初始化)function initFileInput(ctrlName, FileExtensions, fileSize) {var …

什么是ASP.NET Core静态Web资产?

What are ASP.NET Core Static Web Assets?HostBuilder.ConfigureWebHostDefaults()中发生了很多隐藏的魔术(最终称为ConfigureWebDefaults)。 我想更好地了解它&#xff0c;因为我找不到有关它的文档。此代码似乎正在加载一些静态文件。什么是静态网络资产&#xff0c;为什么…

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

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