Dapr for .NET-4 使用docker compose
文章转自:https://zhuanlan.zhihu.com/p/455812861

Dapr for .NET-4 使用docker compose

上一节中,我们使用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"]
