前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年01月 Dapr分布式应用运行时-多容器微服务使用Dapr

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

作者头像
愚公搬代码
发布2023-01-12 10:52:19
5260
发布2023-01-12 10:52:19
举报
文章被收录于专栏:历史专栏

文章目录

  • 前言
  • 一、多容器微服务使用Dapr
    • 1.创建应用程序
    • 2.添加 Dapr 服务调用
    • 3.添加容器支持
    • 4.运行程序

前言

在分布式应用程序中通常由许多独立的程序组成。 它们可以同时运行独立的微服务。 这些应用程序通常是容器化应用程序,并需要容器业务流程工具,例如 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

代码语言:javascript
复制
Install-Package Dapr.AspNetCore
在这里插入图片描述
在这里插入图片描述

2、在 MyFrontEnd 项目中,打开 Program.cs 文件并添加对builder.Services.AddDaprClient 的调用:

代码语言:javascript
复制
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类文件:

代码语言:javascript
复制
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”文件,并将它的内容替换为以下代码:

代码语言:javascript
复制
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”文件的内容替换为以下代码。 它会向用户显示视图数据中存储的天气预报:

代码语言:javascript
复制
@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 文件的内容更新为与以下示例相匹配

代码语言:javascript
复制
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容器情况

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/01/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、多容器微服务使用Dapr
    • 1.创建应用程序
      • 2.添加 Dapr 服务调用
        • 3.添加容器支持
          • 4.运行程序
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档