多运行时的微服务架构 被看做是微服务未来的发展方向,dapr
是microsoft发起的是一个多运行时的微服务架构实现,目前社区比较活跃。
在 Servicemesh 的定义中,简短的描述了 Servicemesh 的关键特征:
服务间通讯由 sidecar 接管,而 sidecar 由控制平面统一控制,从而实现了服务间通讯能力的下沉,使得应用得以大幅简化。
2020年,Bilgin Ibryam 发表文章 “Multi-Runtime Microservices Architecture” ,正式提出了多运行时微服务架构(别名Mecha/机甲,非常帅气的名字),对基于 sidecar 模式的各种产品形态进行了实践总结和理论升华, 将分布式应用存在的四大类需求,作为 Multi-Runtime 的理论出发点:
- Multi-Runtime
- 生命周期(Lifecycle): 主要是通过 PaaS 平台如 kubernetes 来满足
* Packaging: 构建打包
* Healthcheck: 健康检查
* Deployment: 发布
* Scaling: 扩展
* Configuration: 配置
- 网络(Network):
* Service Discovery: 服务发现
* A/B Testing:A/B 测试
* Canary rollouts: 金丝雀滚动发布
* Retry: 重试
* Timeout: 超时
* Circuit Breaker: 熔断
* Point-to-point: 点对点访问
* Pub/Sub: 发布订阅
* Security: 安全
* Observability: 可观察性
- 状态(State):
* Workflow mgmt: 工作流管理
* Idempotency: 幂等性
* Temporal scheduling(cron jobs): 定时调度
* Caching: 缓存
* Application state: 应用状态
- 绑定(Binding):
* Connectors: 连接器
* Protocol conversion: 协议转换
* Message Transformation: 消息传递
* Message routing: 消息路由
* Transactionality: 事务
将应用需要的分布式能力外移到各种runtime, 这些 runtime 会逐渐整合,只保留少量甚至只有一两个的 runtime。这种提供多种分布式能力的 runtime 也被称为 Mecha。 每个微服务就会由至少一个 Mecha Runtime 和应用 Runtime 共同组成,也就是每个微服务都会有多个(至少两个)runtime,这也就是 Multi-Runtime / Mecha 名字的由来。
Multi-Runtime 和 servicemesh 的差异总结如下图所示:
Multi-Runtime的本质是面向云原生应用的 分布式能力抽象层
备注:分布式能力的通用标准API,将会是Multi-Runtime成败的关键。
Dapr是一个可移植的、事件驱动的运行时,它使任何开发者都能轻松地构建运行在云和边缘的弹性、无状态和有状态的应用程序,并拥抱语言和开发者框架的多样性。
Dapr提供的功能模块:
Dapr有三个主要组成部分:API,Building Blocks 和Components:
运行架构:
# install dapr
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
dapr init
dapr --version
# CLI version: 1.4.0
# Runtime version: 1.4.3
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 0dda6684dc2e openzipkin/zipkin "/busybox/sh run.sh" 2 minutes ago Up 2 minutes 9410/tcp, 0.0.0.0:9411->9411/tcp dapr_zipkin
# 9bf6ef339f50 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp dapr_redis
# 8d993e514150 daprio/dapr "./placement" 2 minutes ago Up 2 minutes 0.0.0.0:6050->50005/tcp dapr_placement
ls $HOME/.dapr
# bin components config.yaml
# Step 1: Run the Dapr sidecar
dapr run --app-id myapp --dapr-http-port 3500
# Step 2: Save state
curl -X POST -H "Content-Type: application/json" -d '[{ "key": "name", "value": "Bruce Wayne"}]' http://localhost:3500/v1.0/state/statestore
# Step 3: Get state
curl http://localhost:3500/v1.0/state/statestore/name