Dapr 相关的文章我已经写了20多篇了[1] 。 当向其他人推荐Dapr 的时候,需要回答的一个问题就是:

Dapr 似乎并不是特别令人印象深刻。它提供了一组"构建块",解决了与构建微服务相关的几个挑战。这些构建基块包括服务到服务调用、发布订阅消息传递、状态管理、可观察性、机密管理和Actor 编程模型。 但是,我们不是已经有了所有这些的解决方案吗?

是的 任何构建微服务应用程序的人都已经不得不处理所有这些问题,我们看到这些人 提到的工具和框架对于减轻痛苦有很长的路要走。 我认为Dapr提供了一些独特的东西。为了说明这一点,我下面将选择一个最常见的构建块 - 服务到服务调用,以强调Dapr如何在您已经在使用的内容之上提供附加值。

当一个微服务需要调用另一个微服务时,需要发生几件事。

首先,我们需要服务发现 - 找到我们正在与之通信的服务地址。当然,Kubernetes通过内置的DNS使这变得非常轻松。但是,开发人员在其开发计算机上本地运行微服务的情况也很常见。在这种情况下,每个微服务都位于特定端口号上的 localhost,这要求您具有一些替代机制,以便在本地运行时指向正确的服务。使用Dapr,无论您是在"自托管"[2]模式下运行(直接在您的计算机上)还是在Kubernetes上运行,您都可以按名称对目标服务进行寻址,服务发现这项富有挑战性的工作交给Dapr 的可插拔的服务发现组件来完成。

其次,在微服务之间进行通信时,如果存在暂时性网络问题请务必重试[3]。当然,这可以通过像Polly[4]这样的库来自己实现,但这需要每个人都记得使用它,很有可能你在微服务中发现了一个错误,该错误是由于忘记实现重试而引起的。那么我们使用Dapr,这只是一个内置功能。

第三,微服务采用零信任的安全原则,保护微服务之间的通信非常重要。通常应使用 mTLS 对通信进行加密,并且应使用身份验证来验证调用方是否已获得授权。一个被广泛认可的最佳实践是使用相互 TLS,但正确配置可能会很痛苦,并且在开发时本地运行时通常会妨碍您。使用 Dapr,所有服务到服务的通信都会使用 mTLS 自动加密[5],并且证书会自动循环,这为你带走了一个巨大的心智负担。

第四,安全性的另一个方面是管理允许哪些微服务相互调用。例如,微服务 A 可能被允许与微服务 B 通信,但反之亦然。推出自己的框架来配置这样的东西可能会很痛苦,如果你不是安全专家,很容易出错。服务网格可以为 Kubernetes 集群提供这种行为。Dapr还可以通过访问控制列表[6]提供相同的访问限制,这些列表易于配置,甚至可以在"自托管"模式而不是Kubernetes中运行时工作。

第五,如果您具有分布式跟踪和指标收集功能,以便您了解微服务之间的通信,这也是非常有价值。在Azure 通过 Application Insights 提供了此功能,但同样,如果你在本地运行,你就用不了这项服务,而且据我的经验在所有服务上正确配置它时都遇到各种问题。使用 Dapr,可观察性[7]是运行时的另一个内置功能。它使用开放的标准,如OpenTelemetry和W3C跟踪,使它非常容易与现有工具集成,本地开发可以选择zipkin等兼容的解决方案。

最后,我们看到gRPC[8]作为基于HTTP的微服务API的替代品的兴起,因为它的性能更高。在微服务环境中从 HTTP 迁移到 gRPC 可能很棘手,因为您需要同时升级客户端和服务器,或者提供一个同时公开两种协议的接口进行迁移的兼容。Dapr再次可以帮助我们 - 允许gRPC或HTTP用于服务到服务调用[9],甚至允许HTTP调用方使用gRPC服务,Dapr的Sidecar和Sidecar 之间的所有通信都是通过gRPC。

因此,正如您所看到的,服务调用的"简单"任务有很多,Dapr为您提供了开箱即用的非常全面的解决方案。 Dapr 还提供了很多开箱即用的解决方案,看到这里你相信我了--我们非常需要Dapr 这样的解决方案。


相关参考:

[1]Dapr 文章: https://www.cnblogs.com/shanyou/category/1931296.html

[2]自托管:https://docs.dapr.io/operations/hosting/self-hosted/

[3]重试模式:https://docs.microsoft.com/zh-cn/azure/architecture/patterns/retry

[4]Polly: https://github.com/App-vNext/Polly

[5]自动加密: https://docs.dapr.io/concepts/security-concept/#sidecar-to-sidecar-communication

[6]访问控制列表:https://docs.dapr.io/operations/configuration/invoke-allowlist

[7]可观测性:https://docs.dapr.io/concepts/observability-concept/

[8]gRPC: https://grpc.io/

[9]允许gRPC或HTTP用于服务到服务调用: https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-services-grpc/

从服务之间的调用来看 我们为什么需要Dapr的更多相关文章

  1. 33.服务之间的调用之RPC、Restful深入理解

    33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架   版权声明:本文为博主原创文章,遵循CC 4.0 ...

  2. 第五章 SpringCloud之Eureka-Client使用RestTemplate实现服务之间的调用

    注意:这个章节,请结合前几章节一起使用,因为其要调用上一章节的服务 1.pom.xml <?xml version="1.0" encoding="UTF-8&qu ...

  3. SpringCloud实战 | 第五篇:SpringCloud整合OpenFeign实现微服务之间的调用

    一. 前言 微服务实战系列是基于开源微服务项目 有来商城youlai-mall 版本升级为背景来开展的,本篇则是讲述SpringCloud整合OpenFeign实现微服务之间的相互调用,有兴趣的朋友可 ...

  4. 服务之间的调用为啥不直接用 HTTP 而用 RPC?

    什么是 RPC?RPC原理是什么? 什么是 RPC? RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比 ...

  5. JHipster技术栈定制 - 基于UAA的微服务之间安全调用

    本文通过代码实例演示如何通过UAA实现微服务之间的安全调用. uaa: 身份认证服务,同时也作为被调用的资源服务.服务端口9999. microservice1: 调用uaa的消费者服务,服务端口80 ...

  6. 微服务之间的调用(Ribbon与Feign)

    来源:https://blog.csdn.net/jrn1012/article/details/77837658 使用Eureka作为服务注册中心,在服务启动后,各个微服务会将自己注册到Eureka ...

  7. springcloud 入门 3 (服务之间的调用)

    服务调用: 指的是注册到服务端上的客户端之间数据的相互调用问题:服务与服务的通讯是基于http restful的 服务直接调用主要有两种实现:ribbon  和 feign ribbon是实现负载均衡 ...

  8. 微服务~Eureka实现的服务注册与发现及服务之间的调用

    微服务里一个重要的概念就是服务注册与发现技术,当你有一个新的服务运行后,我们的服务中心可以感知你,然后把加添加到服务列表里,然后当你死掉后,会从服务中心把你移除,而你作为一个服务,对其它服务公开的只是 ...

  9. 服务注册中心之ZooKeeper系列(二) 实现一个简单微服务之间调用的例子

    上一篇文章简单介绍了ZooKeeper,讲了分布式中,每个微服务都会部署到多台服务器上,那服务之间的调用是怎么样的呢?如图: 1.集群A中的服务调用者如何发现集群B中的服务提供者呢? 2.集群A中的服 ...

随机推荐

  1. C. Arpa's loud Owf and Mehrdad's evil plan

    C. Arpa's loud Owf and Mehrdad's evil plan time limit per test 1 second memory limit per test 256 me ...

  2. 1052 - String Growth

    1052 - String Growth    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Z ...

  3. Visible Trees(hdu2841)

    Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. 简单的 for 循环也会踩的坑

    前言 最近实现某个业务时,需要读取数据然后再异步处理:在 Go 中实现起来自然就比较简单,伪代码如下: list := []*Demo{{"a"}, {"b"} ...

  5. Linux进程管理之基本指令

    目录 基本介绍 显示系统执行的进程 指令 ps - aux 常用选项 每行栏目的含义 查看父进程 终止进程 相关指令 实用案例 踢掉某个非法登录用户 终止远程登录服务sshd,在适当的时候再次重启ss ...

  6. maven dependency全局排除

    http://www.voidcn.com/article/p-zychsdnd-bqg.html 个人比较喜欢log4j.properties这种配置文件,而springboot默认使用logbac ...

  7. SpringBoot 之 配置文件、yaml语法、配置注入、松散绑定

    配置文件 SpringBoot 有两种配置文件格式,二选一即可,官方推荐 yaml: application.properties key=value的格式 application.yaml key: ...

  8. git 不小心把某个文件给 add 了 的解决方法

    1.我不小心把这两个文件给add 进来本地仓库 2.解决 进入指令框 ,执行 git rm --cached  文件名 如下图 注意,必须指定文件否则会删除所有

  9. 解压安装Cacti在apache中的补充

    如果你不是安装 Cacti 到 Apache 默认的网络目录文件夹位置,那么在 /etc/httpd/conf.d 中新增配置文件 cacti.conf,并且按如下内容编辑.设置 /your/cact ...

  10. linux获取 GPG 密钥失败

    实质性问题就是自己系统没有yum的GPG密钥 查看自己系统版本 cat /etc/issue 登陆mirrors.163.com 找到自己系统对应的密钥  RPM-GPG-KEY-CentOS-3   ...