加不加 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 流程:
- 数据读取服务
reader - 模型训练服务
trainer - 评估服务
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 会自动转发。