【愚公系列】2023年01月 Dapr分布式应用运行时-多容器微服务使用Dapr

举报
愚公搬代码 发表于 2023/01/31 21:34:42 2023/01/31
【摘要】 前言在分布式应用程序中通常由许多独立的程序组成。 它们可以同时运行独立的微服务。 这些应用程序通常是容器化应用程序,并需要容器业务流程工具,例如 Docker Compose 或 Kubernetes。Dapr就可以一键运行管理这些程序,具体操作步骤如下 一、多容器微服务使用Dapr 1.创建应用程序1、在 Visual Studio 2022 中,创建一个 ASP.NET Core We...

前言

在分布式应用程序中通常由许多独立的程序组成。 它们可以同时运行独立的微服务。 这些应用程序通常是容器化应用程序,并需要容器业务流程工具,例如 Docker Compose 或 Kubernetes。

Dapr就可以一键运行管理这些程序,具体操作步骤如下

一、多容器微服务使用Dapr

1.创建应用程序

1、在 Visual Studio 2022 中,创建一个 ASP.NET Core Web 应用项目:
在这里插入图片描述

2、将你的项目命名为 MyFrontEnd,将你的解决方案命名为 DaprMultiContainer:
在这里插入图片描述
3、在最后一个对话框中,保留默认值。 请勿选择“启用 Docker 支持”。 稍后添加 Docker 支持。
在这里插入图片描述
4、对于后端,请将一个 ASP.NET Core Web API 项目添加到同一解决方案中:

在这里插入图片描述
5、将项目命名为 MyBackEnd:
在这里插入图片描述
6、默认情况下,Dapr 依赖于网络边界来限制对其公共 API 的访问。 因此,请清除“为 HTTPS 配置”复选框:
在这里插入图片描述

2.添加 Dapr 服务调用

使用 Dapr 服务调用构建块配置服务之间的通信。 使 Web 应用能从 Web API 中检索天气预报。 服务调用构建块有许多优势。 其中包括服务发现、自动重试、消息加密(使用 mTLS)以及改进的可观测性。 你将使用 Dapr .NET SDK 在 Dapr 上调用服务调用API。

1、添加Dapr.AspNetCore

Install-Package Dapr.AspNetCore

在这里插入图片描述
2、在 MyFrontEnd 项目中,打开 Program.cs 文件并添加对builder.Services.AddDaprClient 的调用:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddDaprClient();

builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

在这里插入图片描述
3、添加 WeatherForecast类文件:

namespace MyFrontEnd;

public class WeatherForecast
{
    public DateTime Date { get; set; }

    public int TemperatureC { get; set; }

    public int TemperatureF { get; set; }

    public string Summary { get; set; } = string.Empty;
}

在这里插入图片描述
4、在“Pages”文件夹中打开“Index.cshtml.cs”文件,并将它的内容替换为以下代码:

using Dapr.Client;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace MyFrontEnd.Pages;

public class IndexModel : PageModel
{
    private readonly DaprClient _daprClient;

    public IndexModel(DaprClient daprClient)
    {
        _daprClient = daprClient;
    }

    public async Task OnGet()
    {
        var forecasts = await _daprClient.InvokeMethodAsync<IEnumerable<WeatherForecast>>(
            HttpMethod.Get,
            "MyBackEnd",
            "weatherforecast");

        ViewData["WeatherForecastData"] = forecasts;
    }
}

在这里插入图片描述
5、将“Pages”文件夹中“Index.cshtml”文件的内容替换为以下代码。 它会向用户显示视图数据中存储的天气预报:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    @foreach (var forecast in (IEnumerable<WeatherForecast>)ViewData["WeatherForecastData"]!)
    {
        <p>The forecast for @forecast.Date is @forecast.Summary!</p>
    }
</div>

在这里插入图片描述

3.添加容器支持

添加容器支持,并使用 Docker Compose 运行解决方案。

1、右键单击 MyFrontEnd 项目,选择“添加”>“容器业务流程协调程序支持…”。随即将显示“添加容器业务流程协调程序支持”对话框:
在这里插入图片描述
2、选择“Linux”作为目标 OS:
在这里插入图片描述
创建完成后会在解决方案下新增一个 docker-compose.yml 、 .dockerignore 、Dockerfile文件:
在这里插入图片描述

3、以同样方式执行MyFrontEnd项目
在这里插入图片描述
4、使得两个容器支持dapr
修改docker-compose.yml 文件的内容更新为与以下示例相匹配

version: '3.4'

services:
  myfrontend:
    image: ${DOCKER_REGISTRY-}myfrontend
    build:
      context: .
      dockerfile: MyFrontEnd/Dockerfile
    ports:
      - "51000:50001"

  myfrontend-dapr:
    image: "daprio/daprd:latest"
    command: [ "./daprd", "-app-id", "MyFrontEnd", "-app-port", "80" ]
    depends_on:
      - myfrontend
    network_mode: "service:myfrontend"

  mybackend:
    image: ${DOCKER_REGISTRY-}mybackend
    build:
      context: .
      dockerfile: MyBackEnd/Dockerfile
    ports:
      - "52000:50001"

  mybackend-dapr:
    image: "daprio/daprd:latest"
    command: [ "./daprd", "-app-id", "MyBackEnd", "-app-port", "80" ]
    depends_on:
      - mybackend
    network_mode: "service:mybackend"

在这里插入图片描述
在更新后的文件中,我们分别为 myfrontend 和 mybackend 服务添加了 myfrontend-dapr 和 mybackend-dapr, 在更新后的文件中,解释如下:

  • 使用了 daprio/daprd:latest 容器映像。 不建议将 latest 标记用于生产方案。对于生产,最好的做法是使用特定的版本号。
  • 出于网络隔离目的,Compose 文件中定义的每个服务都有其自己的网络命名空间。 挎斗使用 network_mode: “service:…” 确保它们在与应用程序所在的同一网络命名空间中运行。 这样做能够使挎斗和应用程序使用 localhost进行通信。
  • 必须公开 Dapr 在上面侦听 gRPC 通信的端口(默认为 50001),从而使能够彼此通信。

4.运行程序

在这里插入图片描述
看看docker容器情况
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。