编写于:2022年7月21日 , cc
安装的插件:
docker-windows
Dapr
tye
vault
Dapr安装前提,需要安装docker-windows版本
安装 Dapr cli
. 创建dapr命令,拉取dapr
Dapr CLI 是您用于各种 Dapr 相关任务的主要工具。 您可以使用它来运行一个带有Dapr sidecar的应用程序, 以及查看sidecar日志、列出运行中的服务、运行 Dapr 仪表板。
x1#安装命令
2wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
3
4#校验安装是否成功
5
6dapr
7 __
8 ____/ /___ _____ _____
9 / __ / __ '/ __ \/ ___/
10 / /_/ / /_/ / /_/ / /
11 \__,_/\__,_/ .___/_/
12 /_/
13===============================
14Distributed Application Runtime
15
输出显示应该如下方所示:
Dapr 与您的应用程序一起作为sidecar运行,在自托管模式下,这意味着它是您本地机器上的一个进程。 因此,初始化 Dapr 包括获取 Dapr sidecar 二进制文件并将其安装到本地.
此外,默认初始化过程还创建了一个开发环境,帮助简化 Dapr 的应用开发。 这包括下列步骤:
确保以管理员方式运行命令提示符终端 (右键单击,以管理员方式运行)
安装最新的 Dapr 运行时二进制程序:
xxxxxxxxxx
11dapr init
验证
xxxxxxxxxx
41dapr --version
2
3 CLI version: 1.2.0
4 Runtime version: 1.4.0
验证容器正在运行
请确保镜像为daprio/dapr, openzipkin/zipkin和 redis 的容器都在运行:
xxxxxxxxxx
51docker ps
2
348ba145c26b8 openzipkin/zipkin:latest 9411/tcp, 0.0.0.0:9411->9410/tcp dapr_zipkin
47c6cb13fa040 daprio/dapr:1.7.4 0.0.0.0:6050->50005/tcp dapr_placement
5a0195e3a0fc8 redis 0.0.0.0:6379->6379/tcp dapr_redis
Windows 中,Dapr 初始化路径到 %USERPROFILE%.dapr\
Tye插件主要为和dapr连用,在开发中调试使用
安装命令:
xxxxxxxxxx
11dotnet tool install --global Microsoft.Tye --version 0.11.0-alpha.22111.1
VS调试插件:
https://marketplace.visualstudio.com/items?itemName=ikkentim.TimsTyeExplorer22
Tye入门教程:
https://github.com/dotnet/tye/blob/main/docs/getting_started.md
Tye与dapr结合入门文档:
重点,请仔细阅读此篇文档方便开发时使用和调试
https://github.com/dotnet/tye/blob/main/docs/recipes/dapr.md
在项目中会有三个dapr配置文件
pubsub.yaml # 发布订阅配置文件
statestore.yaml # 状态管理配置文件
secretstores.hashicorp.vault.yaml # 秘钥管理配置文件
暂未使用
xxxxxxxxxx
151nameResolution
2component"consul"
3configuration
4 client
5 address"192.165.10.102:8500" #consul地址
6 selfRegistertrue
7 checks
8name"Dapr Health Status"
9 checkID"daprHealth:${APP_ID}"
10 interval"15s"
11 http"http://${HOST_ADDRESS}:${DAPR_HTTP_PORT}/v1.0/healthz" #dapr的健康检查地址
12name"Service Health Status"
13 checkID"serviceHealth:${APP_ID}"
14 interval"15s"
15 http"http://${HOST_ADDRESS}:${APP_PORT}/api/health/GetHeartbeat" #dapr依赖服务的健康检查地址
在服务调用中,封装了DaprClient的调用方法,使用封装的扩展方法即可调用
xxxxxxxxxx
101 //在接收消息的StartUp中注册消息接收的中间件
2 services.AddControllers().AddDapr();
3
4 //在构造函数中注入 DaprClient 方法
5
6var data = _daprClient.DaprInvokeMethodExtAsync<RetDataResult<bool>>
7 (HttpMethod.Get
8 , DefaultValues.PersonalizationServer
9 , $"api/PageAssembly/CompanyId?companyId={SessionData.CompanyCode}"
10 , HttpContext).Result;
x
1 /// <summary>
2 /// 发送消息
3 /// </summary>
4 /// <returns></returns>
5 [HttpGet]
6 public async Task<ActionResult> PubAsync()
7 {
8 await _daprClient.PublishEventAsync("pubsub", "test_topic", "推送的消息!");
9 return Ok();
10 }
11
12
13 //在接收消息的StartUp中注册消息接收的中间件
14
15 app.UseCloudEvents(); //<--------重点
16
17 app.UseEndpoints(endpoints =>
18 {
19 endpoints.MapControllers();
20
21 endpoints.MapSubscribeHandler(); //<--------重点
22 });
23
24
25 /// <summary>
26 /// 接收消息
27 /// </summary>
28 /// <param name="obj"></param>
29 /// <returns></returns>
30 [Topic("pubsub", "test_topic")]
31 [HttpPost("/sub")]
32 public IActionResult SubAsync(string obj)
33 {
34
35 Console.WriteLine($"weather changed:{obj}");
36
37 return Ok();
38 }
xxxxxxxxxx
141# 增加绑定的配置文件,绑定定时任务
2
3apiVersion dapr.io/v1alpha1
4kind Component
5metadata
6 name cron
7 namespace default
8spec
9 type bindings.cron
10 version v1
11 metadata
12name schedule
13 value"@every 15m" # every 5 seconds
14
xxxxxxxxxx
71//增加绑定配置文件,即可绑定,定时任务
2 [HttpPost("/cron")]
3 public IActionResult Index()
4 {
5 Console.WriteLine($"hello from the cron input binding................{DateTime.Now.ToString("yyyyMMdd H:m:s")}");
6 return Ok();
7 }
此次采用的秘钥管理组件是 hashicorp-vault
在代码中可以引用:Dapr.Extensions.Configuration 组件,读取vault中的配置,在代码中使用
xxxxxxxxxx
341# 增加秘钥管理的配置文件
2
3apiVersion dapr.io/v1alpha1
4kind Component
5metadata
6 name vault-secret-store
7spec
8 type secretstores.hashicorp.vault
9 version v1
10 metadata
11name vaultAddr
12 value http //127.0.0.18200
13 #- name: caCert # Optional. This or caPath or caPem
14 # value: "[ca_cert]"
15 #- name: caPath # Optional. This or CaCert or caPem
16 # value: "[path_to_ca_cert_file]"
17 #- name: caPem # Optional. This or CaCert or CaPath
18 # value : "[encoded_ca_cert_pem]"
19name skipVerify # Optional. Default: false
20 value true
21 #- name: tlsServerName # Optional.
22 # value : "[tls_config_server_name]"
23 #- name: vaultTokenMountPath # Required if vaultToken not provided. Path to token file. ~/.vault-token
24 # value : ""
25name vaultToken # Required if vaultTokenMountPath not provided. Token value.
26 value "hvs.n9lOGM7LQXo8JtBogY64RXjA"
27 #- name: vaultKVPrefix # Optional. Default: "dapr"
28 # value : "dapr"
29name vaultKVUsePrefix # Optional. default: "true"
30 valuefalse
31name enginePath # Optional. default: "secret"
32 value"secret"
33name vaultValueType # Optional. default: "map"
34 value"map"
在代码中的配置与使用
xxxxxxxxxx
311//Program.cs 文件中的配置
2//DefaultValues.IdentityServer 为设置的公共常量
3//new DaprSecretDescriptor 为读取的配置项
4.ConfigureAppConfiguration(config =>
5{
6 #region 设置读取vault配置
7
8 var daprClient = new DaprClientBuilder().Build();
9 var secretDescriptors = new List<DaprSecretDescriptor>
10 {
11 new DaprSecretDescriptor(DefaultValues.IdentityServer),
12 new DaprSecretDescriptor(DefaultValues.Vault_Secret_ServerAppsettings),
13 new DaprSecretDescriptor(DefaultValues.Vault_Secret_CacheRedisConfig),
14 new DaprSecretDescriptor(DefaultValues.Vault_Secret_LoggerApi)
15 };
16 config.AddDaprSecretStore(DefaultValues.Vault_ComponentName, secretDescriptors,
17 daprClient);
18
19 #endregion
20})
21
22//Startup.cs 文件中读取配置
23 Configuration[“ConnectionStrings”] //此方法直接读取连接字符串
24
25//此方法为读取的配置项映射到实体
26 services.Configure<Appsettings>(this.Configuration);
27//在Controller中使用方式:根据映射的实体构造函数注入使用
28 IOptions<Appsettings>
29//在Controller中使用方式:IConfiguration构造函数注入使用
30 IConfiguration _configuration;
31 _configuration[“ConnectionStrings”]
创建 tye.yaml,配置dapr,配置项目启动项和端口
x
1
2name micronet
3extensions
4name dapr
5 log-level debug
6 components-path"dapr/components"
7services
8name configserver
9 project ConfigServer/Config.csproj
10 bindings
11port5001
12name commonserver
13 project CommonServer/Common.csproj
14 bindings
15port5002
16name mongoserver
17 project MongoServer/Mongo.csproj
18 bindings
19port5003
在项目根目录下cmd,输入以下命令:
x
1tye run
2
3Launching Tye Host...
4
5[20:00:13 INF] Executing application from E:\ProjectCode\Micronet\tye.yaml
6[20:00:13 INF] Dashboard running on http://127.0.0.1:8000
7[20:00:13 INF] Build Watcher: Watching for builds...
8[20:00:13 INF] Building projects
浏览器访问 http://127.0.0.1:8000
即可查看运行的服务和运行日志
打开 vs的 tye调试插件:Tye Explorer
选中要调试的项目 Attach to selected ,可多选联调
项目发布Release版本
docker常用命令
docker创建镜像
xxxxxxxxxx
41# ids4 镜像名称
2# v1 镜像版本
3# 最后还有个 "."
4docker build -t ids4:v1 .
docker导出镜像
xxxxxxxxxx
41# ids4 镜像名称
2# v1 镜像版本
3# ids4.tar.gz 镜像导出的压缩包
4docker save ids4:v1 -o ids4.tar.gz
docker导入压缩包
xxxxxxxxxx
31# 将镜像拖入指定文件夹
2# ids4.tar.gz 镜像导出的压缩包
3docker load -i ids4.tar.gz
docker上传镜像到镜像仓库
xxxxxxxxxx
81#将镜像标记到镜像仓库
2# ids4 镜像名称
3# v1 镜像版本
4#192.168.59.128:5000/ids4:v1 镜像仓库的地址
5docker tag ids4:v1 192.168.59.128:5000/ids4:v1
6
7#将镜像推送到仓库
8docker push
在创建镜像前,先生成应用,应用生成在“ dist ”文件夹下。
创建的两个文件都在项目根目录下 以SPA项目为例,在.BS.SPA文件加下。
创建nginx配置文件 文件名称命名为:default.conf
xxxxxxxxxx
151server {
2 listen 80;
3 server_name localhost; # 修改为docker服务宿主机的ip
4
5 location / {
6 root /usr/share/nginx/html;
7 index index.html index.htm;
8 try_files $uri $uri/ /index.html =404;
9 }
10
11 error_page 500 502 503 504 /50x.html;
12 location = /50x.html {
13 root html;
14 }
15}
创建dockerfile
xxxxxxxxxx
91FROM nginx
2
3MAINTAINER cc
4
5RUN rm /etc/nginx/conf.d/default.conf
6
7ADD default.conf /etc/nginx/conf.d/
8
9COPY dist/ /usr/share/nginx/html/
创建镜像
xxxxxxxxxx
11docker build -t vueclient:v1 .
k8s中运行vue项目的yaml文件,与后端相同,去除dapr配置即可示例如下:
xxxxxxxxxx
181 template
2 metadata
3 labels
4 service ids4
5 annotations#--- 从此处开始去除
6 dapr.io/enabled"true"
7 dapr.io/app-id"ids4"
8 dapr.io/app-port"5401"
9 dapr.io/config"dapr-config" #--- 到此处结束
10 spec
11 containers
12name ids4
13 image 192.168.59.128 5000/ids4 v1
14 imagePullPolicy IfNotPresent
15 ports
16name http
17 containerPort5401
18 protocol TCP
详情见HashCorpVault文档
暂未使用,仅作为参考学习使用
xxxxxxxxxx
141
2
31. docker-compose.yaml中的配置注释
4
5+ . redis设置
6- 拉取最新镜像创建redis容器
7```yaml
8redis:
9image: "redis:latest"
10ports:
11- "6379:6379" #指定端口,对外映射端口
12networks:
13- ts_web #设置同一网络主要为服务之间联通
14
. zipkin设置
xxxxxxxxxx
61 zipkin
2 image"openzipkin/zipkin:latest"
3 ports
4"9412:9411" #指定端口,对外映射端口
5 networks
6#设置同一网络主要为服务之间联通 ts_web
. dapr placement设置
xxxxxxxxxx
71 placement
2 image"daprio/dapr"
3 command"./placement" "-port" "50006"
4 ports
5"50006:50006" #指定端口,对外映射端口
6 networks
7#设置同一网络主要为服务之间联通 ts_web
. 构建服务(Common服务)
x
1 common
2 image $ DOCKER_REGISTRY- common
3 build
4 context.
5 dockerfile Common/Dockerfile #依据本地路径下的dockerfile文件创建镜像
6 ports
7
8"30002:3500" #访问dapr Sidecar
9"5002:5002" #访问swagger
10 networks
11#设置同一网络主要为服务之间联通 ts_web
. 构建服务(依据Common服务创建对应的dapr服务)
x
1 commonserver-api-dapr
2 image"daprio/daprd:1.7.0" #dapr镜像
3 command "./daprd"
4 "-app-id" "Common" #app-id是必填的,与consul中的服务名称的功能是一致的
5 "-app-port" "5002" #app-port是必填的,与服务的端口保持一致即可
6 "-placement-host-address" "placement:50006" #placement端口地址
7 "-config""/dapr/config.yaml" #dapr配置文件路径
8 "-components-path" "/dapr/components" #dapr组件路径
9 depends_on
10#依赖的容器 commonserver
11 consul4
12 volumes
13"./dapr:/dapr" #指定的路径
14 network_mode"service:common" #网络依赖
. 网关服务构建
x
1 apigateway
2 image $ DOCKER_REGISTRY- apigateway
3 build
4 context.
5 dockerfile ApiGateWay/Dockerfile #依据本地路径下的dockerfile文件创建镜像
6 ports
7"7000:80" #网关映射端口
8 networks
9#设置同一网络主要为服务之间联通 ts_web
. docker容器创建的网络连接
xxxxxxxxxx
31 networks
2 ts_web
3 externaltrue
docker-compose 命令
xxxxxxxxxx
51#启动docker-compose
2 docker-compose up -d
3
4#停止docker-compose
5 docker-compose down