加不加 dapr 服务调用前后有什么区别吗

54 阅读2分钟

加不加 dapr 服务调用前后有什么区别吗

ChatGPT said:

这个问题问得好,我们来简单对比一下使用 Dapr 服务调用(Service Invocation) 和不使用 Dapr 时的区别,主要从功能、开发体验、扩展性、安全性等方面来分析。


✅ 不使用 Dapr 的服务调用

一般是你自己写逻辑,比如通过 http.Client 或 gRPC 客户端去调用别的服务,比如:

go
CopyEdit
resp, err := http.Post("http://service-b/api/xxx", "application/json", body)

优点:

  • 控制权完全在自己手里,灵活;
  • 不依赖额外组件。

缺点:

  • 服务发现需要自己实现(比如注册中心:consul、etcd、k8s DNS 等);
  • 重试、熔断、超时控制、追踪日志等都需要自己实现;
  • 不支持多种协议(比如 gRPC、HTTP)之间的透明调用;
  • 安全认证和 ACL 控制复杂;
  • 可观测性和治理能力弱。

✅ 使用 Dapr 的服务调用

Dapr 提供了统一的服务调用 API。服务间通过 应用 ID + 方法名 进行调用,不需要知道服务 IP/端口:

go
CopyEdit
http://localhost:<daprPort>/v1.0/invoke/<app-id>/method/<method-name>

优点:

  • 服务发现自动完成(通过 app-id);
  • 支持 HTTP 和 gRPC 混合调用
  • ✅ 内建 重试、熔断、超时控制(基于配置);
  • ✅ 自动添加 分布式追踪(支持 Zipkin, Jaeger);
  • ✅ 可以加上 访问控制、mTLS 加密
  • ✅ 和其他 Dapr building block(如 Pub/Sub、状态管理)无缝集成。

缺点:

  • ⚠️ 引入 Dapr sidecar,部署和学习曲线会增加;
  • ⚠️ 默认有点“黑盒”,调试可能要多了解 Dapr 的行为;
  • ⚠️ 依赖 Dapr runtime,增加了系统复杂性。

✨ 举个例子:

你在用一个三阶段的 AI 流程:

  1. 数据读取服务 reader
  2. 模型训练服务 trainer
  3. 评估服务 evaluator

不用 Dapr:

你要在代码里写明地址、端口,例如:

go
CopyEdit
http.Post("http://trainer.default.svc.cluster.local:8080/train", ...)

用了 Dapr:

只要知道服务的 App ID:

bash
CopyEdit
http://localhost:3500/v1.0/invoke/trainer/method/train

而且服务之间可以是不同协议,比如 evaluator 是用 gRPC 实现的,也没问题,Dapr 会自动转发。