自托管模式运行dapr

新建订阅webapi项目,取名为backend

项目增加docker支持,取消https支持

修改Program.cs

  1. var builder = WebApplication.CreateBuilder(args);
  2. builder.Services.AddControllers();
  3. builder.Services.AddEndpointsApiExplorer();
  4. builder.Services.AddSwaggerGen();
  5. var app = builder.Build();
  6. //订阅需要用到以下方法
  7. app.UseCloudEvents();
  8. app.MapSubscribeHandler();
  9. //if (app.Environment.IsDevelopment())
  10. {
  11. app.UseSwagger();
  12. app.UseSwaggerUI();
  13. }
  14. app.UseAuthorization();
  15. app.MapControllers();
  16. app.Run();

修改WeatherForecastController.cs

  1. using Dapr;
  2. using Microsoft.AspNetCore.Mvc;
  3. namespace backend.Controllers
  4. {
  5. [ApiController]
  6. [Route("[controller]")]
  7. public class WeatherForecastController : ControllerBase
  8. {
  9. [HttpPost("TestSub")]
  10. [Topic("pubsub", "deathStarStatus")]
  11. public object TestSub([FromBody]string message)
  12. {
  13. Console.WriteLine($"TestSub deathStarStatus {message}");
  14. return new { message = "TestSub deathStarStatus" };
  15. }
  16. }
  17. }

Topic 就是确定接收的主题

修改launchSettings.json

将applicationUrl参数改为"http://localhost:5001"

在backend项目根目录下运行

  1. dapr run --app-id backend --app-port 5001 dotnet run

新建发布事件webapi项目,取名为front

项目增加docker支持,取消https支持

修改Program.cs,增加dapr支持

修改WeatherForecastController.cs

  1. using Dapr.Client;
  2. using Microsoft.AspNetCore.Mvc;
  3. namespace front.Controllers
  4. {
  5. [ApiController]
  6. [Route("[controller]")]
  7. public class WeatherForecastController : ControllerBase
  8. {
  9. private readonly DaprClient _daprClient;
  10. public WeatherForecastController(DaprClient daprClient)
  11. {
  12. _daprClient = daprClient;
  13. }
  14. [HttpPost("TestPub")]
  15. public async Task TestPub([FromBody]string msg)
  16. {
  17. try
  18. {
  19. await _daprClient.PublishEventAsync<string>("pubsub", "deathStarStatus", msg);
  20. }
  21. catch (Exception ex)
  22. {
  23. Console.WriteLine(ex.ToString());
  24. }
  25. }
  26. }
  27. }

_daprClient.PublishEventAsync("pubsub", "deathStarStatus", msg); 此方法就是发布订阅

修改launchSettings.json文件,将"applicationUrl"改为 "http://localhost:5002"

在front项目根目录运行

  1. dapr run --app-id front --app-port 5002 dotnet run

命令行发布订阅

  1. dapr publish --publish-app-id front --pubsub pubsub --topic deathStarStatus --data "hello"

backend控制台会显示下面消息

网页发布订阅

访问front网站,Swagger UI

运行TestPub后,backend项目控制台会显示接受到订阅消息

k8s模式运行dapr

  1. #初始化dapr集群
  2. dapr uninstall --all
  3. docker rm -f backend front
  4. dapr init -k

构建docker镜像

  1. docker build -t daprbackend:v2 -f backend/Dockerfile .
  2. docker build -t daprfrontend:v2 -f front/Dockerfile .

运行k8s项目

  1. kubectl apply -f k8s/dapr-backend.yaml
  2. kubectl apply -f k8s/dapr-front.yaml

dapr-backend.yaml

  1. kind: Deployment
  2. apiVersion: apps/v1
  3. metadata:
  4. name: dapr-deploy-backend
  5. labels:
  6. service: backend
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. service: backend
  12. template:
  13. metadata:
  14. labels:
  15. service: backend
  16. annotations:
  17. dapr.io/enabled: "true"
  18. dapr.io/app-id: "backend" #这里要注意app-id要与front调用的名称要一致
  19. dapr.io/app-port: "8080"
  20. #dapr.io/config: "dapr-config"
  21. spec:
  22. containers:
  23. - name: daprbackend
  24. image: daprbackend:v2
  25. imagePullPolicy: Never
  26. ports:
  27. - name: http
  28. containerPort: 8080
  29. protocol: TCP
  30. ---
  31. apiVersion: v1
  32. kind: Service
  33. metadata:
  34. name: daprbackend
  35. labels:
  36. service: backend
  37. spec:
  38. type: NodePort
  39. ports:
  40. - port: 80
  41. targetPort: 8080
  42. nodePort: 30003
  43. protocol: TCP
  44. name: http
  45. - port: 50001
  46. targetPort: 50001
  47. nodePort: 30042
  48. protocol: TCP
  49. name: dapr-grpc
  50. selector:
  51. service: backend

dapr-front.yaml

  1. kind: Deployment
  2. apiVersion: apps/v1
  3. metadata:
  4. name: dapr-deploy-front
  5. labels:
  6. service: front
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. service: front
  12. template:
  13. metadata:
  14. labels:
  15. service: front
  16. annotations:
  17. dapr.io/enabled: "true"
  18. dapr.io/app-id: "front"
  19. dapr.io/app-port: "8080"
  20. #dapr.io/config: "dapr-config"
  21. spec:
  22. containers:
  23. - name: daprfrontend
  24. image: daprfrontend:v2
  25. imagePullPolicy: Never
  26. ports:
  27. - name: http
  28. containerPort: 8080
  29. protocol: TCP
  30. ---
  31. apiVersion: v1
  32. kind: Service
  33. metadata:
  34. name: daprfrontend
  35. labels:
  36. service: front
  37. spec:
  38. type: NodePort
  39. ports:
  40. - port: 80
  41. targetPort: 8080
  42. nodePort: 30004
  43. protocol: TCP
  44. name: http
  45. - port: 50001
  46. targetPort: 50001
  47. nodePort: 30041
  48. protocol: TCP
  49. name: dapr-grpc
  50. selector:
  51. service: front

运行发布端项目

访问http://127.0.0.1:30004/swagger/index.html

运行TestPub,

终端会显示以下错误,原因是pubsub组件没运行

运行pubsub组件

  1. kubectl apply -f redis.yaml
  2. kubectl apply -f pubsub.yaml

redis.yaml文件

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: redis
  6. version: v1
  7. name: redis
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: redis
  13. strategy:
  14. type: Recreate
  15. template:
  16. metadata:
  17. labels:
  18. app: redis
  19. spec:
  20. containers:
  21. - name: redis
  22. image: redis:6-alpine
  23. imagePullPolicy: IfNotPresent
  24. ports:
  25. - containerPort: 6379
  26. ---
  27. apiVersion: v1
  28. kind: Service
  29. metadata:
  30. labels:
  31. app: redis
  32. name: redis
  33. spec:
  34. type: NodePort
  35. ports:
  36. - name: "data"
  37. port: 6379
  38. targetPort: 6379
  39. selector:
  40. app: redis

pubsub.yaml文件

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: pubsub
  5. spec:
  6. type: pubsub.redis
  7. version: v1
  8. metadata:
  9. - name: redisHost
  10. value: redis:6379
  11. - name: redisPassword
  12. value: ""

重新运行发布于订阅程序

  1. kubectl delete -f k8s/dapr-front.yaml
  2. kubectl delete -f k8s/dapr-backend.yaml
  3. kubectl apply -f k8s/dapr-front.yaml
  4. kubectl apply -f k8s/dapr-backend.yaml

验证实验成功

访问 http://127.0.0.1:30004/swagger/index.html

查看订阅端的日志,收到信息“wxy",就表示实验成功

常用命令

  1. dapr run --app-id backend --app-port 5001 dotnet run
  2. dapr run --app-id front --app-port 5002 dotnet run
  3. dapr publish --publish-app-id front --pubsub pubsub --topic deathStarStatus --data "hello"
  4. ::kubectl delete all --all
  5. ::dapr uninstall --all
  6. dapr uninstall --all
  7. docker rm -f backend front
  8. dapr init -k
  9. docker build -t daprbackend -f backend/Dockerfile .
  10. docker build -t daprfrontend -f front/Dockerfile .
  11. Dapr uninstall --all
  12. dapr init -k
  13. kubectl apply -f k8s/dapr-backend.yaml
  14. kubectl apply -f k8s/dapr-front.yaml
  15. pause

参考文章

文章源码下载

待上传

作者

吴晓阳,微信号:shiningrise,email:shiningrise@qq.com

微服务实践k8s&dapr开发部署实验(3)订阅发布的更多相关文章

  1. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  2. [Abp vNext微服务实践] - 文章目录

    简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...

  3. 2019年微服务实践第一课,网易&谐云&蘑菇街&奥思技术大咖深度分享

    微服务的概念最早由Martin Fowler与James Lewis于2014年共同提出,核心思想是围绕业务能力组织服务,各个微服务可被独立部署,服务间是松耦合的关系,以及数据和治理的去中心化管理.微 ...

  4. QCon技术干货:个推基于Docker和Kubernetes的微服务实践

    2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...

  5. Serverless 微服务实践-移动应用包分发服务

    背景 阿里云函数计算是事件驱动的全托管计算服务.通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传.函数计算会为您准备好计算资源,以弹性.可靠的方式运行您的代码,并提供日志查询.性能监控.报 ...

  6. .net 微服务实践

    l  前言 本文记录了我的一次.net core 微服务架构实践经验,以及所用到的技术 l  优点 每个服务聚焦于一块业务,无论在开发阶段或是部署阶段都是独立的,更适合被各个小团队开发维护,团队对服务 ...

  7. .NET CORE微服务实践

    .NET CORE微服务实践 https://www.cnblogs.com/zengqinglei/p/9570343.html .NET CORE 实践部署架构图 实践源码:https://git ...

  8. SFDC 微服务实践之路 2016.12.10 杭州(整理)--转

    原文地址:http://mp.weixin.qq.com/s/8cC4Ewt6yPjnxdYxuNZlFQ 微服务是什么? 微服务是一种细粒度(Fine-Grain)的SOA 或许在座的高朋了解过其概 ...

  9. 微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io

    原文:微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io [编者的话]这是用微服务开发应用系列博客的第七篇也是最后一篇.第一篇中介绍了微服务架构模式,并且讨论了微服架构的优缺点: ...

  10. 微服务实践之路--RPC

    微服务实践之路--RPC 重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thr ...

随机推荐

  1. 解密方舟的高性能内存回收技术——HPP GC

    原文:https://mp.weixin.qq.com/s/o8uuP1XViIyviveL4m-8ZQ,点击链接查看更多技术内容. 众所周知,内存是操作系统的一项重要资源,直接影响系统性能.而在应用 ...

  2. redis 简单整理——redis shell[九]

    前言 简单介绍一下redis的shell命令. 正文 redis 提供了一些工具,如redis-cli.redis-server.redis-benchmark等. redis-cli -r 对red ...

  3. docker 应用篇————docker 的文件系统[十]

    前言 简单介绍一下docker的文件系统. 正文 docker 容器启动就是一个文件系统的启动. 在docker中,每一层镜像都具备一些文件. 比如说,有一个centos的镜像. 里面就是一个微小版的 ...

  4. 并发系列64章(TPL 数据流(二))第八章

    前言 续第七章. 正文 数据流块的并行处理 数据流块在网格上本身就是并行的,为什么这么说呢? 加入有两个数据库,他们链接在一起,然后给他们post数据. 当数据流块一在运行的时候,数据流块二也在执行, ...

  5. xml转voc数据集(含分享数据集)

    数据集的链接:行人检测数据集voc数据集(100张) 原始图片和.xml数据目录结构如下: . └── data ├── 003002_0.jpg ├── 003002_0.xml ├── 00300 ...

  6. 力扣206(java&python)-反转链表(简单)

    题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2: 输入:head = [1,2] ...

  7. 云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator

    作者 | 刘睿.杜恒 导读:RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区.本文将从实践出发,结合案例来说明,如何通过 RocketMQ Ope ...

  8. 针对数据库连接池到DRDS连接探活的优化

    简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下.使⽤过DRDS产品的 ...

  9. 使用 Arthas 排查 SpringBoot 诡异耗时的 Bug

    简介: 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用.最近,在优化接口的响应时间,优化了代码之后,但是时间还是达不到要求:有一个 ...

  10. PyFlink 教程(三):PyFlink DataStream API - state & timer

    简介: 介绍如何在 Python DataStream API 中使用 state & timer 功能. 一.背景 Flink 1.13 已于近期正式发布,超过 200 名贡献者参与了 Fl ...