Dapr学习(3)之服务调用概述

1、服务调用概述

  • 介绍

    通过服务调用,应用程序可以使用 gRPC 或 HTTP 这样的标准协议来发现并可靠地与其他应用程序通信。
    在许多具有多个需要相互通信的服务的环境中,开发者经常会问自己以下问题:
      我如何发现和调用不同服务上的方法?
      我如何安全地调用其他服务?
      我如何处理重试和瞬态错误?
      我如何使用分布式跟踪来查看调用图来诊断生产中的问题?
    
    Dapr 通过提供服务调用 API 来应对这些问题,这种调用 API 作为反向代理与内置的服务发现相结合, 同时利用内置分布式跟踪、计量、错误处理、加密等功能。
    Dapr 采用边车(Sidecar)、去中心化的架构。 要使用 Dapr 来调用应用程序,请在任意 Dapr 实例上使用 invoke 这个API。 sidecar 编程模型鼓励每个应用程序与自己的 Dapr 实例对话。 Dapr 实例会相互发现并进行通信。
  • 调用逻辑

    Dapr服务调用总览图

    image

    Dapr服务调用说明
      1. 服务 A 对服务 B 发起HTTP/gRPC的调用
      2. Dapr通过托管平台(local&k8s)的名称解析组件获取服务B的地址
      3. Dapr 将消息转发至服务 B的 Dapr 边车
      注: Dapr 边车之间的所有调用考虑到性能都优先使用 gRPC。仅服务与 Dapr 边车之间的调用可以是 HTTP 或 gRPC
      4. 服务 B的 Dapr 边车将请求转发至服务 B 上的特定端点 (或方法) 。服务 B 随后运行其业务逻辑代码。
      5. 服务 B 发送响应给服务 A。响应将转至服务 B 的边车。
      6. Dapr 将消息转发至服务 A 的 Dapr 边车。
      7. 服务 A 接收响应。
    
    Dapr支持的名称解析组件(consul、kubernetes、dns等)

    image

    命名空间作用域(跨命名空间调用)
      服务调用支持跨命名空间调用。 在所有受支持的托管平台上, Dapr 应用程序标识(ID)遵循包含了目标命名空间的有效 FQDN(完全限定的域名)格式。
      例如,以下字符串包含应用程序标识 nodeapp 以及应用程序在 production 中运行的名称空间
      localhost:3500/v1.0/invoke/nodeapp.production/method/neworder
    
    Dapr使用 mDNS 轮询负载均衡

    Dapr 使用 mDNS 协议提供轮询负载均衡的服务调用请求,例如用于本地或多个联网的物理机器。
    应用程序实例,其中包含 app ID 为 FrontEnd 和 3 个 app ID 为 Cart 的应用程序实例,并且您从 FrontEnd 应用程序到 Cart 应用程序的3个实例之间的进行轮询。 这些实例可以在同一机器上或不同的机器上
    image
    注意:您可以有 N 个相同app ID的实例,对于每个应用程序来说 app ID 都是唯一的。 而且您可以有多个此应用程序的实例,其中所有这些实例都有相同的 app ID

2、服务调用实例,HelloWorld快速入门

  • 在Hello World 快速入门中描述的应用程序,在 python 应用程序调用一个 node.js 应用的地方。 这种情况下,python应用将是“service A”,Node.js应用将是“service B”。

  • 服务调用图解:

    image

  • 服务调用说明:

      1. Node.js 应用程序有一个 app ID 为 nodeapp 的 Dapr 应用程序。 当 python 应用程序通过 POST http://localhost:3500/v1.0/invoke/nodeapp/method/neworder 调用 Node.js 应用程序的 neworder 方法时, 首先会到达 python app 的本地 dapr sidecar。
      2. Dapr 使用本地机器运行的名称解析组件(在这种情况下自动运行的 mDNS),发现 Node.js 应用的位置。
      3. Dapr 使用刚刚收到的位置将请求转发到 Node.js 应用的 sidecar。
      4. Node.js 应用的 sidecar 将请求转发到 Node.js 应用程序。 Node.js 应用执行其业务逻辑,记录收到的消息,然后将订单 ID 存储到 Redis (未在图表中显示)中
      5. Node.js应 用程序通过 Node.js sidecar 向 Python 应用程序发送一个响应。
      6. Dapr 转发响应到 Python 的 Dapr sidecar
      7. Python 应用程序收到响应。
    

3、发现并调用服务

  • 为服务选择标识

    Dapr 允许您为您的应用分配一个全局唯一ID。 此 ID 为您的应用程序封装了状态,不管它可能有多少实例
    a. 自托管方式(dapr cli)
      dapr run --app-id cart --app-port 5000 python app.py
      dapr run --app-id cart --app-port 5000 --app-ssl python app.py # ssl模式
    
    b. Kubernetes方式(yaml文件)
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: python-app
        namespace: default
        labels:
          app: python-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: python-app
        template:
          metadata:
            labels:
              app: python-app
            annotations:
              dapr.io/enabled: "true"
              dapr.io/app-id: "cart"
              dapr.io/app-port: "5000"
    
    若要使用ssl连接,在annotations节点配置dapr.io/app-ssl: "true"
  • 调用服务

    终端执行命令行:
      POST:curl http://localhost:3500/v1.0/invoke/cart/method/add -X POST
      GET:curl http://localhost:3500/v1.0/invoke/cart/method/add
      DELETE:curl http://localhost:3500/v1.0/invoke/cart/method/add -X DELETE
    
  • 服务调用 API

    HTTP 请求格式:
      POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/invoke/<appId>.<namespace>/method/<method-name>
    
    说明:
      daprPort	dapr 端口。
      appId		分布式应用部署appId
      method-name	分布式应用部署方法名称
    
  • 配置 Dapr 来使用 gRPC

    a. 自托管方式(dapr cli),使用--app-protocol 标志来配置Dapr 使用 gRPC 与应用程序通信
      dapr run --app-protocol grpc --app-port 5005 node app.js
    
    b. Kubernetes方式(yaml文件)
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: myapp
        namespace: default
        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-protocol: "grpc"
              dapr.io/app-port: "5005"
    
posted @ 2022-06-12 00:00  xjk27400861  阅读(521)  评论(1编辑  收藏  举报