手把手教你学Dapr - 4. 服务调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教你学Dapr - 4. 服务调用相关的知识,希望对你有一定的参考价值。

参考技术A

通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠、安全地通信。

先问几个问题:

此时你会发现这些事情HttpClientFactory没有帮你完成,而在微服务中这些又是必不可少的能力,接下来看看服务调用都做了什么

先看一下两个服务之间的调用顺序

默认情况下,调用同一个命名空间的其他服务可以直接使用AppID(假设是:nodeapp)

服务调用也支持跨命名空间调用,在所有受支持的宿主平台上,Dapr AppID遵循FQDN格式,其中包括目标命名空间。

比如调用命名空间:production,AppID:nodeapp

这在K8s集群中的跨名称空间调用中特别有用

通过托管平台上的相互(mTLS)身份验证,包括通过Dapr Sentry服务的自动证书转移,可以确保Dapr应用程序之间的所有调用的安全。 下图显示了自托管应用程序的情况。

应用程序可以控制哪些其他应用程序可以调用它们,以及通过访问策略授权它们做什么。 这使您能够限制具有个人信息的敏感应用程序不被未经授权的应用程序访问,并结合服务到服务的安全通信,提供了软多租户部署。

在调用失败和瞬态错误的情况下,服务调用执行自动重试,并在回退时间段内执行。

注: 自动重试,默认是开启的,可以关。但如果不关且业务又不支持幂等是很危险的。建议服务的接口要设计支持幂等,这在微服务里也是一个标配的选择。

Dapr可以在各种托管平台上运行。 为了启用服务发现和服务调用,Dapr使用可插拔的名称解析组件。 例如,K8s名称解析组件使用K8s DNS服务来解析集群中运行的其他应用程序的位置。 自托管机器可以使用mDNS名称解析组件。 Consul名称解析组件可以在任何托管环境中使用,包括K8s或自托管环境

一图胜千言,就使用mDNS轮着调用

默认情况下,将跟踪应用程序之间的所有调用,并收集指标,以提供应用程序的洞察力和诊断,这在生产场景中尤其重要。 这为您提供了服务之间调用的调用图和指标。

pythonapp 通过Dapr sidecar调用nodeapp,通过服务调用的API及gRPC代理依然是上面见到的那个调用流程,做到了语言无关

创建 ASP.NET Core空 项目,并修改 launchSettings.json ,让启动HTTP的启动端口变为5000

修改 Program.cs 文件

此时一共有4个服务

运行 Assignment.Server :在目录 dapr-study-room\\Assignment04\\Assignment.Server 打开命令行工具,并执行下面命令

调用服务:再打开一个新的命令行工具,并执行下面命令

可以发现4个命令都调用成功了,但是 Assignment.Server 输出结果有点意外

是的,没有 Hello World1! ,那怎么办呢?我们把Hello1的命令改一下

invoke调用的输出除了 App invoked successfully 以外还多了一行 Hello World1!

与此同时 Assignment.Server 的输出正确了

除此之外 invoke 还有一些参数,比如 --data , --data-file ,喜欢研究Dapr CLI的小伙伴可以继续尝试。不过一般情况下用SDK就可以了

创建 控制台应用程序 项目,使用NuGet包管理器添加 Dapr.Client SDK,并修改 Program.cs 文件

看几个细节

注:

使用命令行工具打开目录 dapr-study-room\\Assignment04\\Assignment.Client ,然后执行命令

如果你不是用VS Code终端的PowerShell执行dapr run就可能遇到下面的错误

即便你没有遇到也建议了解一下如何支持非默认端口

因为上面使用dapr run的时候没有指定dapr http port,而默认client访问的是3500端口

解决的办法有两种:

再执行一次 dotnet run 就可以看到正确的输出结果了

篇幅太长了,举一反三吧。就是调用 InvokeMethodGrpcAsync ,然后dapr-http-port换成dapr-grpc-port,DAPR_HTTP_PORT换成DAPR_GRPC_PORT

还记得dapr init的时候docker里有个zipkin吧,通过zipkin可以看一下调用跟踪,通过浏览器打开下面地址

此时页面是空的

根据步骤操作一下就可以看到了

随便点开一行数据尾部的SHOW,就可以看到调用详情

Assignment04

https://github.com/doddgu/dapr-study-room

我们的目标是 自由的 、 易用的 、 可塑性强的 、 功能丰富的 、 健壮的 。

所以我们借鉴Building blocks的设计理念,正在做一个新的框架 MASA Framework ,它有哪些特点呢?

目前源码已开始同步到Github(文档站点在规划中,会慢慢完善起来):

MASA.BuildingBlocks

MASA.Contrib

MASA.Utils

MASA.EShop

BlazorComponent

MASA.Blazor

QQ群:7424099

微信群:加技术运营微信(MasaStackTechOps),备注来意,邀请进群

手把手教你学Dapr

上一篇:手把手教你学Dapr - 2. 必须知道的概念

注意:

文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Terminal

运行命令行工具的时候建议以管理员身份,避免踩坑

为了保证操作顺畅,建议使用PowerShell先执行一下set-ExecutionPolicy RemoteSigned

安装Docker

因为Dapr CLI默认会在Docker内启动 redis、zipkin、placement。

当然这些也不是必须要安装的,只是推荐安装可以体验Dapr的完整能力,方便后续章节的学习。

  1. 下载并安装Docker Desktop

    https://www.docker.com/products/docker-desktop

  2. 安装WSL2,使用命令行工具执行命令

    wsl --instal
    
    如果不能使用wsl直接安装的话可以手动安装,运行PowerShell并执行下面两句命令
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    
    如果你再次遇到错误提示:0x800f080c 功能名称 VirtualMachinePlatform 未知。

    请保证自己的操作系统版本在Windows 10 build 18917以上

  3. 重启电脑后下载WSL2内核

    https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

  4. 运行命令行工具,设置默认使用WSL2

    wsl --set-default-version 2
    
  5. 下载Ubuntu 20.04

    https://www.microsoft.com/store/apps/9n6svws3rx71

  6. 设置Docker使用WSL2

你“可能”需要一个小工具

不能说的秘密,看文件名猜功能

https://github.com.cnpmjs.org/dotnetcore/FastGithub/releases/download/2.0.4/fastgithub_win-x64.zip

安装Dapr CLI

官方解释:Dapr CLI 是您用于各种 Dapr 相关任务的主要工具。 您可以使用它来运行一个带有Dapr sidecar的应用程序, 以及查看sidecar日志、列出运行中的服务、运行 Dapr 仪表板。

CLI是必须要安装吗?其实也不是,但新手不建议去体验这些骚操作。后续文章会讲解脱离dapr cli工作。

  1. 运行Windows TerminalPowerShell,执行命令,这里要耐心等待一下

    iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex
    

    如果是cmd执行下面命令:

    powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"
    
  2. 验证安装,重新打开命令行工具执行命令dapr,看到下面的提示即安装正确

             __
        ____/ /___ _____  _____
       / __  / __ \'/ __ \\/ ___/
      / /_/ / /_/ / /_/ / /
      \\__,_/\\__,_/ .___/_/
                  /_/
    
    ===============================
    Distributed Application Runtime
    
    Usage:
      dapr [command]
    
    Available Commands:
      completion     Generates shell completion scripts
      components     List all Dapr components. Supported platforms: Kubernetes
      configurations List all Dapr configurations. Supported platforms: Kubernetes
      dashboard      Start Dapr dashboard. Supported platforms: Kubernetes and self-hosted
      help           Help about any command
      init           Install Dapr on supported hosting platforms. Supported platforms: Kubernetes and self-hosted
      invoke         Invoke a method on a given Dapr application. Supported platforms: Self-hosted
      list           List all Dapr instances. Supported platforms: Kubernetes and self-hosted
      logs           Get Dapr sidecar logs for an application. Supported platforms: Kubernetes
      mtls           Check if mTLS is enabled. Supported platforms: Kubernetes
      publish        Publish a pub-sub event. Supported platforms: Self-hosted
      run            Run Dapr and (optionally) your application side by side. Supported platforms: Self-hosted
      status         Show the health status of Dapr services. Supported platforms: Kubernetes
      stop           Stop Dapr instances and their associated apps. . Supported platforms: Self-hosted
      uninstall      Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted
      upgrade        Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes
    
    Flags:
      -h, --help      help for dapr
      -v, --version   version for dapr
    
    Use "dapr [command] --help" for more information about a command.
    

初始化Dapr

  1. 使用命令行工具执行命令

    dapr init
    

    如此之外还有一个精简版的安装方式

    dapr init --slim
    

    看看官方解释slim

    在此模式下安装了两个不同的二进制文件 daprdplacementplacement是给actor用的,之前有提到过。

    在此模式下,不会为状态管理或发布/订阅安装任何默认组件(如 Redis),那就只能用服务调用。其他的需要用户自己设置环境和自定义组件。

    说白了,你只用服务调用,那slim是可以的,否则的话你需要手动配置来解决CLI代替你做的那部分工作。

  2. 验证Dapr版本

    dapr --version
    

    当前时间下,我的版本是

    CLI version: 1.4.0
    Runtime version: 1.4.3
    
  3. 验证容器

    docker ps
    

    dapr init的容器是包括dapr_placement, dapr_redis, dapr_zipkin

  4. 验证组件目录,打开目录%USERPROFILE%\\.dapr\\,看到如下结构即代表安装完成

运行一个示例代码看看效果

运行环境准备

vs 2022/2019,建议直接上VS2022体验64位VS

https://visualstudio.microsoft.com/zh-hans/vs/preview/#download-preview

.net 6,如果你用的不是vs2022,需要自行安装.net 6

https://download.visualstudio.microsoft.com/download/pr/5bc3c525-d6d5-4370-8468-e44a1b948c03/fe758c9942966b88b52d92ce2823f6c0/dotnet-sdk-6.0.100-rc.2.21505.57-win-x64.exe

从Github下载示例代码

使用命令行工具克隆代码库到本地

ssh(推荐)用下面的命令

git clone git@github.com:doddgu/dapr-study-room.git

https用下面的命令

git clone https://github.com/doddgu/dapr-study-room.git

没有git的需要先安装一下git,具体教程可以自行百度

https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/Git-2.33.1-64-bit.exe

使用Dapr运行.Net示例代码

  1. 使用命令行工具,跳转到源码目录dapr-study-room\\Assignment03\\Assignment.Server

    Tips:在资源管理器找到源码目录

    Win 11可以右键空白区域 -> 在Windows终端中打开即可

    Win 11以下在资源管理器输入cmd

  2. 执行命令dapr run --app-id assignment-server --app-port 5038 dotnet run

    可以先不用了解命令行的意思,后续章节会讲解

  3. 看到输入内容如下即运行成功

    == APP == info: Microsoft.Hosting.Lifetime[14]
    == APP ==       Now listening on: https://localhost:7038
    == APP == info: Microsoft.Hosting.Lifetime[14]
    == APP ==       Now listening on: http://localhost:5038
    == APP == info: Microsoft.Hosting.Lifetime[0]
    == APP ==       Application started. Press Ctrl+C to shut down.
    == APP == info: Microsoft.Hosting.Lifetime[0]
    == APP ==       Hosting environment: Development
    == APP == info: Microsoft.Hosting.Lifetime[0]
    == APP ==       Content root path: D:\\Project\\OpenSource\\dapr-study-room\\Assignment03\\Assignment.Server
    time="2021-10-27T18:06:11.8422605+08:00" level=info msg="application discovered on port 5038" app_id=assignment-server instance=SSHZ014 scope=dapr.runtime type=log ver=1.4.3
    time="2021-10-27T18:06:11.8788949+08:00" level=info msg="application configuration loaded" app_id=assignment-server instance=SSHZ014 scope=dapr.runtime type=log ver=1.4.3
    time="2021-10-27T18:06:11.8803982+08:00" level=info msg="actor runtime started. actor idle timeout: 1h0m0s. actor scan interval: 30s" app_id=assignment-server instance=SSHZ014 scope=dapr.runtime.actor type=log ver=1.4.3
    time="2021-10-27T18:06:11.8844485+08:00" level=info msg="dapr initialized. Status: Running. Init Elapsed 1830.3305ms" app_id=assignment-server instance=SSHZ014 scope=dapr.runtime type=log ver=1.4.3
    time="2021-10-27T18:06:11.8920835+08:00" level=info msg="placement tables updated, version: 0" app_id=assignment-server instance=SSHZ014 scope=dapr.runtime.actor.internal.placement type=log ver=1.4.3
    
  4. 还有一个验证方式,使用命令行工具执行命令dapr list

    其中APP ID,APP PORT,COMMAND是不变的,其余都是变的

    APP ID HTTP PORT GRPC PORT APP PORT COMMAND AGE CREATED PID

    assignment-server 49948 49949 5038 dotnet run 13m 2021-10-27 18:06.09 22596

调用Dapr API

  1. 重新打开一个命令行工具

  2. 测试Dapr API,再打开一个命令行工具

    dapr invoke --app-id assignment-server --method hello
    
  3. 验证运行是否成功

    执行dapr inovoke的命令行窗口输出如下

    App invoked successfully

    执行dapr run的命令行窗口输出如下

    == APP == Hello World!

    这个Hello World就是Assignment.Server的API /hello 打印出来的,此时你的环境已经ok,且第一个示例也运行成功了

给自己点个赞吧

以上是关于手把手教你学Dapr - 4. 服务调用的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你学Dapr - 6. 发布订阅

手把手教你学Dapr

手把手教你学Dapr

手把手教你学Dapr - 9. 可观测性

手把手教你学Dapr - 2. 必须知道的概念

手把手教你学Dapr - 5. 状态管理