分布式应用运行时 Dapr:简化微服务开发的利器
什么是 Dapr?
Dapr(Distributed Application Runtime)是一个由微软发起并开源的分布式应用运行时,它为构建微服务架构的应用程序提供了一套标准化的构建块。Dapr 的核心思想是将分布式系统的复杂性抽象化,让开发者能够专注于业务逻辑,而不是基础设施的细节。
核心特性
1. 可移植性
Dapr 采用边车模式(Sidecar Pattern),作为一个独立的进程与应用程序一起运行。这意味着: - 支持多种编程语言(Go、Java、Python、.NET、JavaScript等) - 可以部署在任何环境(Kubernetes、虚拟机、边缘设备) - 无需修改现有代码即可集成
2. 标准化构建块
Dapr 提供了一系列预构建的分布式系统构建块:
- 服务调用:可靠的服务间通信
- 状态管理:跨服务的状态存储
- 发布/订阅:事件驱动的消息传递
- 绑定:与外部系统的集成
- 可观测性:监控和追踪
- 密钥管理:安全的密钥存储
- 执行组件:有状态的对象模型
3. 可插拔组件
Dapr 的所有构建块都支持可插拔的后端组件: - 状态存储:Redis、PostgreSQL、MongoDB、Cassandra等 - 消息代理:RabbitMQ、Kafka、Azure Service Bus等 - 绑定:HTTP、gRPC、Kafka、MQTT等
实战示例:构建简单的微服务应用
环境准备
text
# 安装 Dapr CLI wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash # 初始化 Dapr dapr init # 验证安装 dapr --version
示例1:服务调用
服务端(Go语言)
text
package main
import (
"fmt"
"log"
"net/http"
"github.com/dapr/go-sdk/service/common"
daprd "github.com/dapr/go-sdk/service/http"
)
func main() {
// 创建 Dapr HTTP 服务
s := daprd.NewService(":8080")
// 注册服务方法
if err := s.AddServiceInvocationHandler("hello", helloHandler); err != nil {
log.Fatalf("注册处理器失败: %v", err)
}
// 启动服务
if err := s.Start(); err != nil && err != http.ErrServerClosed {
log.Fatalf("服务启动失败: %v", err)
}
}
func helloHandler(ctx context.Context, in *common.InvocationEvent) (*common.Content, error) {
log.Printf("收到请求: %s", in.Data)
return &common.Content{
Data: []byte("Hello from Dapr!"),
ContentType: "text/plain",
}, nil
}
客户端调用
text
package main
import (
"context"
"fmt"
dapr "github.com/dapr/go-sdk/client"
)
func main() {
// 创建 Dapr 客户端
client, err := dapr.NewClient()
if err != nil {
panic(err)
}
defer client.Close()
// 调用远程服务
resp, err := client.InvokeMethod(
context.Background(),
"myapp", // 目标应用ID
"hello", // 方法名
"get", // HTTP方法
)
if err != nil {
fmt.Printf("调用失败: %v", err)
} else {
fmt.Printf("响应: %s", string(resp))
}
}
示例2:状态管理
text
package main
import (
"context"
"fmt"
dapr "github.com/dapr/go-sdk/client"
)
func main() {
client, err := dapr.NewClient()
if err != nil {
panic(err)
}
defer client.Close()
ctx := context.Background()
// 保存状态
err = client.SaveState(ctx, "statestore", "key1", []byte("value1"), nil)
if err != nil {
panic(err)
}
// 获取状态
item, err := client.GetState(ctx, "statestore", "key1", nil)
if err != nil {
panic(err)
}
fmt.Printf("获取的状态值: %s\n", string(item.Value))
// 删除状态
err = client.DeleteState(ctx, "statestore", "key1", nil)
if err != nil {
panic(err)
}
}
示例3:发布/订阅模式
发布者
text
func publishEvent(client dapr.Client) error {
ctx := context.Background()
// 发布事件到主题
err := client.PublishEvent(ctx, "pubsub", "orders", []byte("订单创建"))
if err != nil {
return err
}
fmt.Println("事件发布成功")
return nil
}
订阅者
text
func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) {
fmt.Printf("收到事件: %s\n", string(e.Data))
return false, nil
}
func main() {
s := daprd.NewService(":8080")
// 订阅主题
subscription := &common.Subscription{
PubsubName: "pubsub",
Topic: "orders",
Route: "/orders",
}
if err := s.AddTopicEventHandler(subscription, eventHandler); err != nil {
log.Fatal(err)
}
s.Start()
}
部署配置
组件配置文件(redis-pubsub.yaml)
text
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: pubsub
spec:
type: pubsub.redis
version: v1
metadata:
- name: redisHost
value: localhost:6379
- name: redisPassword
value: ""
应用部署(Kubernetes)
text
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "myapp"
dapr.io/app-port: "8080"
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
最佳实践
1. 开发环境
text
# 本地运行带 Dapr 的应用 dapr run --app-id myapp --app-port 8080 go run main.go # 查看组件 dapr components list # 查看配置 dapr configurations list
2. 监控和诊断
text
# 查看 Dapr 侧车日志 dapr logs --app-id myapp # 查看指标 dapr dashboard
3. 配置管理
text
# 使用配置文件 dapr run --config ./config.yaml -- go run main.go
优势总结
- 降低复杂性:抽象分布式系统模式,减少样板代码
- 语言无关:支持多种编程语言,团队可以选择最适合的技术栈
- 云原生友好:与 Kubernetes 深度集成,支持多云部署
- 生产就绪:内置可观测性、安全性和弹性模式
- 社区活跃:由 CNCF 托管,拥有活跃的开发者社区
学习资源
- 官方文档:https://docs.dapr.io
- GitHub 仓库:https://github.com/dapr/dapr
- 示例项目:https://github.com/dapr/samples
- 中文社区:https://dapr-cn.github.io
Dapr 通过提供标准化的构建块,真正实现了”一次编写,随处运行”的微服务开发体验。无论是初创公司还是大型企业,都可以通过 Dapr 加速微服务应用的开发和部署过程。
dapr_20260204142836.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载




还没有评论,来说两句吧...