什么是dapr?为什么要使用它

官方文档https://docs.dapr.io/zh-hans/developing-applications/building-blocks/

介绍

  • dapr是一个分布式运行时(Distributed Application Runtime)是一个开源项目,它把构建微服务的最佳实践沉淀为开发者可直接调用的标准化API,让你能更专注于业务逻辑本身

  • 像下面这张图的介绍,应用程序通过HTTP/gRPC通过dapr sdk,与dapr运行时通信。这个dapr运行时是通过sidecar的方式部署到同应用的pod内的
    在这里插入图片描述

  • 整体能力图谱
    在这里插入图片描述
    ● Building Block:Dapr 对分布式应用开发过程中使用到的典型范式的抽象以及对应的 API 设计。通过这些抽象,对客户侧可以规范 api 和使用方式,而对实现侧则是可插拔可替换的基础。可以说,这是整个 dapr 中最重要的一组概念。
    ● Components:对各个 building block 的具体实现。是 dapr 可扩展、可插拔的具体体现。
    ● SDK:Dapr 提供给应用开发者使用的一组编程接口,是对如何使用各 building block 的行为规范。也是 DAPR 实现多语言支持的具体表现。
    ● Sidecar:
    ○ 首先这是一种应用部署模式,将复杂的逻辑抽离到独立的程序中,该程序与应用程序一起作为单独的进程或容器运行。这种部署模式,我们称之为 Sidecar 模式。
    ○ 其次特指这个运行在主程序旁边的独立进程,我们称之为 Sidecar;在 Dapr 语境下,我们说的 运行时 就是 sidecar。

Building Block

下面只说一个,简单理解下

Service to Service Invocation

  • 服务调用使应用程序能够以 http 或 gRPC 的形式通过已知的端点相互通信。Dapr 提供了一个端点,作为反向代理和内置服务发现的组合,同提供内置的分布式跟踪和错误处理能力帮助应用开发。

在这里插入图片描述

执行过程如下:

  1. 服务 A 以服务 B 为目标发起 HTTP 或 gRPC 调用,该调用转到本地的 Dapr Sidecar。
  2. Dapr 使用在给定托管平台上运行的名称解析组件来发现服务B的位置。
  3. Dapr 将消息转发给服务B的Dapr Sidecar

注意:所有 Dapr Sidecar 之间的调用都将通过gRPC进行性能测试。只有服务和 Dapr Sidecar 之间的调用可以是HTTP 或 gRPC。

  1. 服务 B 的 Dapr Sidecar 将请求转发到服务 B 上指定的端点(或方法),然后服务B运行其业务逻辑代码。
  2. 服务 B 向服务 A 发送一个响应,该响应到达服务 B 的 Sidecar。
  3. Dapr将响应转发给服务 A 的 Dapr Sidecar。
  4. 服务A接收响应。

使用

  • 下面是一个使用dapr sdk订阅metaq topic的例子
import asyncio
import json
import logging
import os
from typing import Any, Callable, Coroutine

import grpc
import httpx
from ali_dapr_python.metaq import MetaQClient

from app.infrastructure.observability.telemetry import get_tracer

async def _run_one_subscription_session(
    topic: str,
    consumer_group: str,
    tag: str,
    handler: Callable[[dict[str, Any]], Coroutine[Any, Any, None]],
) -> None:
    """运行一次订阅会话:建连 → 消费 → 流断退出。

    抛出的异常由外层 _consume 的指数退避循环处理。
    """
    client_cm = MetaQClient()
    client = await client_cm.__aenter__()
    try:
        queue = await client.subscribe(topic, consumer_group, tag=tag)
        logger.info(
            "MetaQ subscribed: topic=%s, group=%s, tag=%s", topic, consumer_group, tag,
        )

        while True:
            message = await queue.next_message()
            if not message:
                continue

            logger.info("MetaQ message received: topic=%s, message=%s", topic, message.data())

            with _tracer.start_as_current_span(
                "metaq.consume",
                attributes={"metaq.topic": topic, "metaq.tag": tag},
            ):
                raw_data = message.data()
                parsed = json.loads(raw_data) if isinstance(raw_data, str) else raw_data
                await handler(parsed)
                await queue.respond_success(message)
                logger.debug("MetaQ consumed: topic=%s, message=%s", topic, parsed)
    finally:
        try:
            await client_cm.__aexit__(None, None, None)
        except Exception:  # noqa: BLE001
            pass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clarence Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值