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

前言

之前自己有个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服务中的每个方法最多只能有一个参数,多个参数的话都变成写成一个实体进行传递,不然会报错



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

结语

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

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

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

  1. 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...

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

    美团点评 TiDB 深度实践之旅(9000 字长文 / 真实“踩坑”经历) 4   PingCAP · 154 天前 · 3956 次点击 这是一个创建于 154 天前的主题,其中的信息可能已经有所发 ...

  3. Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...

  4. HDP 3.1.0 集成 Sqoop2 踩坑问题记录

    HDP 3.1.0 集成 Sqoop2 踩坑问题记录 本文原始地址:https://sitoi.cn/posts/65261.html 问题一 $ sqoop:000> start job -n ...

  5. myeclipse使用db-brower连接到sqlserver2012踩坑经历

    myeclipse使用db-brower连接到sqlserver踩坑经历 首先得建立个角色 右键->创建登录名 权限开大点 连接设置 Driver template选择我选这个,格式按照我的写 ...

  6. sqlserver安装和踩坑经历

    sqlserver安装和踩坑经历 下载 下载 安装 大致是按照这个来的 安装教程 出错 windows系统安装软件弹出"Windows installer service could not ...

  7. Dubbo 服务 IP 注册错误踩坑经历

    个人博客地址 studyidea.cn,点击查看更多原创文章 踩坑 公司最近新建一个机房,需要将现有系统同步部署到新机房,部署完成之后,两地机房同时对提供服务.系统架构如下图: 这个系统当前对外采用 ...

  8. 使用BeanUtils.copyProperties踩坑经历

    1. 原始转换 提起对象转换,每个程序员都不陌生,比如项目中经常涉及到的DO.DTO.VO之间的转换,举个例子,假设现在有个OrderDTO,定义如下所示: public class OrderDTO ...

  9. nginx搭建网站踩坑经历

    为了更好的阅读体验,请访问我的个人博客 前言 早上刷抖音刷到一个只需要三步的nginx搭建教程(视频地址),觉得有些离谱,跟着复现了一遍,果然很多地方不严谨并且省略了大量步骤,对于很多不了解linux ...

随机推荐

  1. 巨蟒python全栈开发-第11阶段 ansible_project5

    今日大纲 1.命令展示前端页面实现(下面有个断点) 2.命令下发后端展示

  2. Django框架form表单的那些事儿

    Form那些事儿 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1:initial 初始值,input框里面的初始值. class L ...

  3. MySQL统计同比环比SQL

    大体思路: MySQL没有类似oracle方便的统计函数,只能靠自己去硬计算:通过时间字段直接增加年份.月份,然后通过left join关联时间字段去计算环比.同比公式即可 原始表结构: 求同比SQL ...

  4. EL表达式多条件或判断用法

    简单记录一EL表达式的判断用法 <c:if test="${(order.status == '06'&& order.type=='02') || (order.st ...

  5. 消息点击率翻倍的背后——闲鱼无侵入可扩展IFTTT系统

    一.面临问题 在闲鱼生态里,用户之间会有很多种关系.其中大部分关系是由买家触发,联系到卖家,比如买家通过搜索.收藏.聊天等动作与卖家产生联系:另外一部分是平台与用户之间的关系.对这些关系分析之后我们发 ...

  6. HDU - 6534 Chika and Friendly Pairs

    这个题其实也是很简单的莫队,题目要求是给一个序列,询问l-r区间内部,找到有多少对答案满足 i < j 并且 | a[ i ] -a[ j ] | <=k 也就是有多少对,满足差值小于k的 ...

  7. 第一次作业:C++ 函数重载

    函数重载 函数重载是在C语言的学习中未涉及的新概念.我们在编程时经常会遇到这样一个问题:我们编写完一个函数准备准备调用时,一旦需要传入不同的数据类型的参数时,一个函数无法实现,我们又必须重写另一个或者 ...

  8. pip、conda 换国内源,大大提高下载速度

    https://www.jianshu.com/p/b2d53904dd37 源就是下载地址了,换到国内的源下载速度真的快了近10倍,这里都用了清华的源 pip 只要新建一个配置文件,写上路径就行了 ...

  9. Codeforces Round #198 (Div. 1 + Div. 2)

    A. The Wall 求下gcd即可. B. Maximal Area Quadrilateral 枚举对角线,根据叉积判断顺.逆时针方向构成的最大面积. 由于点坐标绝对值不超过1000,用int比 ...

  10. 【codeforces 764C】Timofey and a tree

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...