.NetCore集成Dapr踩坑经历

该篇内容由个人博客点击跳转同步更新!转载请注明出处

前言

之前自己有个core2.2的项目一直是用的Surging作为微服务框架的,后来了解到了Dapr,发现比较轻量级,开发部署等也非常方便,故将自己的程序升级到了3.0同时框架改成了Dapr,网上查到的好多Dapr文章基本都是大差不同,大都是用的GIT上的示例或者是直接文章翻译很少有提到实战上的一些问题,下面我把我自己遇到的一些问题和解决方法记录一下同时大致讲下安装集成步骤。

前期准备

  1. 安装 Docker(dapr安装完后会在Docker中生成两个容器Dapr_redis和Dapr_placement)
  2. 安装?Dapr CLI(用于使用Dapr的一些命令)
  3. 安装?.Net Core SDK 3.0(Dapr只能用于3.0的程序中)
  4. 下载dotnet-sdk(Nuget上暂时只有预览版,所以直接用源码集成方便源码调试)

    注意:安装dapr cli的时候他会让你用 一段powershell脚本安装,但由于国内墙的问题使用不了所以需要xxxxemmmm,另一个办法就是直接去release下载文件https://github.com/dapr/cli/releases

具体安装命令步骤啥的不说了,链接点击过去都有介绍

大致集成步骤

具体的如何集成和配置网上都有大家可以看下这篇GIT上的集成步骤,我这里直接给大家看下我示例程序的项目结构重要的内容会写在括号里

  1. Clients目录下都是用于调用服务的客户端(这里都是通过ActorProxy的RPC方式调用,有点像SF、akka.net和Orleans,都引用下面的Service_Interfaces)
  2. Dapr目录下就是上面下载的Dapr源代码
  3. CSRedisCore我项目里面用到了Redis所以把CSRedisCore的源代码下载了下来
  4. Service_Infrastructure 服务的基础设施存放一些通用的东西或者帮助类
  5. Service_Interfaces服务的接口都在这里(引用Dapr.Actors)
  6. Service_Models服务和客户端用到的模型都在这
  7. Service_Webapi为客户端提供服务(引用Dapr.Actors和Dapr.Actors.AspNetCore)

具体项目依赖如下图

错误内容和解决方法

由于目标计算机积极拒绝,无法连接。

ERROR: DaprHttpInteractor:  System.Net.Http.HttpRequestException: 由于目标计算机积极拒绝,无法连接。
 ---> System.Net.Sockets.SocketException (10061): 由于目标计算机积极拒绝,无法连接。

这是由于dotnet-sdk默认调用的端口是3500但你通过Darp运行的程序端口是随机的所以运行的时候需要指定一个端口通过 -port xx,例如:

dapr run --port 3500 --app-id demo_actor --app-port 5000 dotnet run

或者通过指定程序调用的端口通过设置DAPR_HTTP_PORT的环境变量来指定程序调用端口

ERR_INVOKE_ACTOR

Error converting value "ERR_INVOKE_ACTOR" to type 'System.Nullable

这是由于作者在程序中少写了这个状态应该算个bug我提交了issue但还没回我,具体的在DaprErrorCodes文件中最后加一下就行

Actor服务中如何使用依赖注入

对于这个问题有两个解决方法:

  1. 默认的服务实现中构造函数只能有两个参数ActorServiceActorId,但是它在注册的时候提供了另一个构造方法,比如我的一个redis服务构造函数是这样的,里面iredisprovider需要通过注入来获取

    可以在注册actor的时候提供你所需要的东西,如下
public static IWebHostBuilder CreateHostBuilder(string[] args)=>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseActors(actorRuntime =>
            {
                 //重点
                actorRuntime.RegisterActor<RedisCachesService>((type) => new ActorService(type, (actorService, actorId) => new RedisCachesService(new RedisProvider(),actorService, actorId)));
            })
            .UseUrls($"http://localhost:{5000}/");
  1. 第一个方法有局限性,和自己new对象没啥区别。所以这里推荐自己实现一个ServiceLocator用来获取所需要的服务,简单写一下用法,定义一个ServiceLocator类
 public class ServiceLocator
    {
        public static IServiceProvider Current { get; set; }
    }

在startup > configure 中赋值

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            ServiceLocator.Current = app.ApplicationServices;

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseHsts();
        }

在Actor服务中使用

public RedisCachesService(ActorService actorService, ActorId actorId) : base(actorService, actorId)
        {
            using (var scoped=ServiceLocator.Current.CreateScope())
            {
                _cr = scoped.ServiceProvider.GetService<IRedisProvider>().GetInstance();
            }
        }

需要注意的点

1.Actor服务中的每个方法最多只能有一个参数,多个参数的话都变成写成一个实体进行传递,不然会报错

  1. Dapr提供了一个可视化界面 dashboard 这个暂时有点问题,谷歌打不开,但edge可以,貌似是Angular的BUG,所以推荐大家暂时不要用,因为功能很少不如直接dapr cli方便

    结语

    大致的问题就如上面这些,但我记得还有几个隔了一天年纪太大忘光了,后续有新问题我会继续更新。不要问我dapr和其它微服务框架比效率性能哪个好,我也没试过。这玩意儿既然是微软开源的我想也不会太差,而且有专业的团队维护,不出太大意外我想发展肯定是越来越好的。

微信关注我哦!(转载注明出处)

原文地址:https://www.cnblogs.com/ShaoJianan/p/NetCore.html

时间: 2024-10-08 11:37:51

.NetCore集成Dapr踩坑经历的相关文章

.Net4.6 Task 异步OA现金盘平台出租函数 比 同步函数 慢5倍 踩坑经历

异步Task简单介绍本标题有点 哗众取宠OA现金盘平台出租QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com ,各位都别介意(不排除个人技术能力问题) -- 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 -- 异步编程模型 .Net 4.6 给 Task 增加了好几个 特别实用的方法,而且引入了 await async 语法糖 当然,这是非常不错的技术,奈何我有自己的线程队列封装,也就没有着

TiDB 深度实践之旅--真实“踩坑”经历

美团点评 TiDB 深度实践之旅(9000 字长文 / 真实“踩坑”经历) 4 PingCAP · 154 天前 · 3956 次点击 这是一个创建于 154 天前的主题,其中的信息可能已经有所发展或是发生改变. 原标题:美团点评携手 PingCAP 开启新一代数据库深度实践之旅 一.背景和现状 在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增长,促使我们去探索更合理的数据存储方案和实践新的运维方式.随着近一两年来分布式数据库大放异彩,美团 DBA 团队联合架构

【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历

2013年给1个大学的小客户部署过一个小型的Asp.NET网站,非常小,用的sqlite数据库,今年人家说要换台服务器,要重新部署一下,好吧,虽然早就过了服务时间,但无奈谁叫人家是客户了,二话不说,上,源代码和以前的文件都有,部署还不是分分钟的事情,打开IIS挂上去就行了.谁知道,这个部署将近花了2天的时间.看看踩坑过程和解决方法. 本文原文地址:http://www.cnblogs.com/asxinyu/p/4380380.html 1.居然拿XP系统做服务器 第一个坑其实和我没关系,客户以

关于django中间件使用的踩坑经历

背景 ??这个之前本地写的那个django测试项目说起,那时候写了个练手的项目,目的是为了熟悉总结django2.0和django1.8的区别.不试不知道,一试就发现了许许多多的坑以及bug,把这些坑以及bug解决完了之后,打算写篇文章记录下我遇到的问题以及解决方法和思路. 起因 ??起因是当我在自强学堂的django课堂上,看到了有一个demo,这个demo具体实现的效果就是当网站在正式环境上运行的时候,为了安全起见,将DEBUG改为False(关闭调试模式),但是导致网站发生错误无法查看错误

Uber使用Swift重写APP的踩坑经历及解决方案(转载)

我是托马斯·阿特曼,目前是Uber移动架构和框架组负责人.Uber现在的用户量已经达到数百万,这么大的用户量,Uber是如何用框架实现的呢? Swift与百位工程师的故事 - 原因.架构.经验 今天我想谈谈一百多名Uber工程师是如何使用Swift编程语言的,在上周三新发布的Rider App主应用程序全部都是用Swift语言重构的.接下来我的分享主要包括三个部分:选择Swift的原因.Uber新架构:重构经验. 优步的开端--重构的原因 这是整个移动团队四年前的样子(指向屏幕显示有三名工程师的

【Springboot】Springboot2 集成 redis 踩坑

今天用Springboot2集成redis的时候,一开始是用以前的方法出了很多问题.一查才知道Springboot2使用 lettuce 作为默认的redis client.所以配置文件里别配置jedis的参数了,配置lettuce pool. 还想用 jedis 的需要自己在 pom 文件手动添加 jedis client 的依赖. redis: database: 0 host: 192.168.1.210 port: 6379 password: password lettuce: poo

Xamarin踩坑经历

1.SDK版本 Android SDK Build-tools必须安装23.0.1版,不得升级高版本,否则将导致异常:尝试在条件"$(_DeviceSdkVersion) >= 21"中对计算结果为""而不是数字的"$(_DeviceSdkVersion)"进行数值比较. 2.JDK JDK最好使用1.8版本,否则VS2017中的Xamarin项目编译会失败. 3.目标最低Android版本 在App.Droid项目属性中设置最低Andro

Mysql视图权限设置的踩坑经历

1.事件背景今天临近中午饭点时,开发同事发来需求,在mariadb库创建两个视图,要求指定帐号有只读权限.很简单的需求,连上服务器,两条grant命令一刷,fulsh privileges 回车,楼主就安心吃饭去了. 2.重点来了,待楼主用餐归来,(还在楼下打了盘王者农药,排位两连跪(┬_┬)),上午发来需求的同事找我了. 3.柳暗花明瞬间蒙圈的我,回了个稍等,就赶紧去查原因了.在反复确认grant没问题后,楼主持续蒙圈了.此时距离接到这个问题,已经过去了20分钟,甚是焦急啊,明明一个小需求怎么

【踩坑经历】SQLSTATE[HY000] [2002] Connection refused

使用docker搭建lnmp环境,使用的是分容器的搭建方案 框架使用thinkphp,想要连接数据MySQL,一直显示"SQLSTATE[HY000] [2002] Connection refused" 数据库配置host填的是localhost,后面改成了127.0.0.1,都是连接不了 还以为是数据库用户权限问题,新建了一个用户,刷新了权限,结果还是不行 想了好久,原来都是分容器的问题,由于采用了分容器的搭建方案,在php的容器内连接127.0.0.1或者localhost,肯定