新文章 网摘 文章 随笔 日记

Dapr for .NET-4 使用docker compose

文章转自:https://zhuanlan.zhihu.com/p/455812861

Dapr for .NET-4 使用docker compose

Dapr for .NET-4 使用docker compose

 
目录
收起
项目结构
dapr文件夹
MyBackEnd项目
docker-compose.yml

上一节中,我们使用docker-compose将sidecar运行到了容器中,这种情况下,实际上有一点需要说明一下。

由于我们的sidecar目前运行在了docker容器中,所以基于本机的dapr配置这个时候是不生效的了。如果要用到诸如状态管理等等组件/构建块时,则需要配置每一个sidecar容器。

本章的内容基于上一节,所以,所有的代码都是基于上一节进行讲解。

上一节中,我们已经将sidecar和我们自己的应用都打包到了docker容器中,这一节,我们在此基础上继续增加状态管理的配置。

本系列内容主要用于演示使用docker compose(而不是本地的dapr配置文件)来对dapr进行配置的方案。处于演示的目的,我们在使用docker compose将项目配置好之后,试验了状态管理构建块的相关API。好了,开始把。

用于演示的项目是我自己写的,现在已经放到了GitHub - pangjianxin/DaprDotNetSample

项目结构

目前整体项目结构如下:

当前项目结构

现在我们将新增的变更逐项加以说明

dapr文件夹

该文件夹放置dapr组件配置文件和Dapr Config CRD:

config.yaml用于配置dapr。

components/pubsub.yaml用于配置pub/sub组件。

components/satestore.yaml用于配置状态管理组件。

其中,statestore.yaml内容如下:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: redis:6379
  - name: redisPassword
    value: ""
  - name: actorStateStore
    value: "true"

注意,metadata中配置的redis连接字符串是用的“容器名:端口号”的形式进行配置的。

MyBackEnd项目

在该项目中我们引入了dapr.aspnetcore项目。

dotnet add package dapr.aspnetcore

在Program项目中,我们做了如下修改:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDaprClient();//添加了这一行

builder.Services.AddControllers();

//......

在WeatherForecastController中注入了DaprClient:

 public WeatherForecastController(ILogger<WeatherForecastController> logger, DaprClient daprClient)
        {
            _logger = logger;
            _daprClient = daprClient;
        }

然后,在Get方法中使用DaprClient操作了状态管理的构建块API:

[HttpGet(Name = "GetWeatherForecast")]
        public async Task<IEnumerable<WeatherForecast>> Get()
        {
            var counter = await _daprClient.GetStateAsync<int>("statestore", "counter");

            counter++;

            await _daprClient.SaveStateAsync("statestore", "counter", counter);

            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)],
                State = counter//给WeatherForecast类新添加了一个字段
            })
            .ToArray();
        }

我们只是进行了简单的调用,以测试是否可行。

此外我们给MyBackEnd项目中的WeatherForecast类新增了一个字段State,用于接收从状态管理中得到的counter。

MyFrontEnd没有其他变化,只是为WeatherForecast类新增了一个字段State,用于存储从状态管理中得到的counter。

接下来,变化最大的就是docker-compose.yml了。

docker-compose.yml

我们先贴出它的内容:

version: '3.4'

services:
  ############################
  # Redis state store
  ############################
  redis:
    image: "redis:latest"
    ports:
      - "6380:6379"
    networks:
      - demo_web

  ############################
  # Dapr actor placement service
  ############################
  placement:
    image: "daprio/dapr"
    command: ["./placement", "-port", "50006"]
    ports:
      - "50006:50006"
    networks:
      - demo_web

  ############################
  # Dapr zipkin service
  ############################
  zipkin:
    image: "openzipkin/zipkin:latest"
    #command: ["/zipkin","start-zipkin"]
    ports:
      - "9412:9411"
    networks:
      - demo_web

  ############################
  # MyFrontEnd service
  ############################
  myfrontend:
    image: ${DOCKER_REGISTRY-}myfrontend
    build:
      context: .
      dockerfile: MyFrontEnd/Dockerfile
    ports:
      - "51000:8081"
    environment:
      - "ASPNETCORE_URLS=http://*:8081;"
    networks:
      - demo_web

  myfrontend-dapr:
    image: "daprio/daprd:latest"
    command: [ "./daprd", 
    "-app-id", "MyFrontEnd", 
    "-app-port", "8081", 
    "-placement-host-address", "placement:50006",
     "-config","/dapr/config.yaml",
    "-components-path", "/dapr/components"]
    depends_on:
      - myfrontend
    volumes:
      - "./dapr:/dapr"
    network_mode: "service:myfrontend"

  ############################
  # MyBackEnd service
  ############################
  mybackend:
    image: ${DOCKER_REGISTRY-}mybackend
    build:
      context: .
      dockerfile: MyBackEnd/Dockerfile
    ports:
      - "52000:8082"
    environment:
      - "ASPNETCORE_URLS=http://*:8082;"
    networks:
      - demo_web

  mybackend-dapr:
    image: "daprio/daprd:latest"
    command: [ "./daprd", 
    "-app-id", "MyBackEnd", 
    "-app-port", "8082" ,
    "-placement-host-address", "placement:50006",
    "-config","/dapr/config.yaml",
    "-components-path", "/dapr/components"]
    depends_on:
      - mybackend
    volumes:
      - "./dapr/:/dapr"
    network_mode: "service:mybackend"

networks:
  demo_web:

首先,我们创建了一个docker network,demo_web,docker-compose中所描述的所有容器将来都会加入到这个network namespace中。

然后,我们将Dapr必须的三个容器放到了docker-compose中,一个是redis,用做状态管理组件和pub/sub组件的实例。另一个是replacement,用作dapr actor组件的实例。最后是zipkin,zipkin获取sidecar发送过来的消息,并记录关键信息。

redis容器我们将端口映射为6380:6379,但是6380这个端口其实根本用不到,因为它们都是运行在同一个network namespace中,所以是直接走的6379,之所以将外部端口定为6380是要避免端口冲突。因为我的主机上已经有一个redis占用了6379的端口了。

所以,在components文件夹中的statestore.yaml文件中连接字符串设置为6379。(statestore.yaml文件内容已在上面列出)

我们在下面列出上述容器的必要配置文件信息:

#状态管理组件
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: redis:6379
  - name: redisPassword
    value: ""
  - name: actorStateStore
    value: "true"

 

#pub/sub组件
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: redis:6379
  - name: redisPassword
    value: ""

 

#dapr配置CRD,其中包含了zipkin的配置。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  tracing:
    samplingRate: "1"
    zipkin:
      endpointAddress: http://zipkin:9411/api/v2/spans

docker-compose中所有的容器都将network设置为了demo_web。而所有的sidecar容器都用network_mode:“service:xxxxx”这种格式将seidecard所运行的网络限制在了与之相关的应用上了。

此外,每一个sidecar容器都需要引入同一份组件配置文件,我们通过volumes可以做到这一点。

做好这些配置之后,我们通过docker-compose up -d或直接在vs中F5运行,即可看到如下画面:

可以看到state的值已经输出了。

此外,查看zipkin:

zipkin此时也获取到了接口调用的相关信息了。

参考:samples/hello-docker-compose at master · dapr/samples

发布于 2022-01-11 11:52
.NET
Docker
Dapr
posted @ 2023-05-24 15:36  岭南春  阅读(92)  评论(0)    收藏  举报