都引用下面的Service_Interfaces) Dapr目录下就是上面下载的Dapr源代码 CSRedisCore我
之前本身有个core2.2的项目一直是用的Surging作为微处事框架的,后来了解到了Dapr,发明对照轻量级,开发部署等也非常便利,故将本身的措施升级到了3.0同时框架改成了Dapr,网上查到的好多Dapr文章根基都是大差差别,,多半是用的GIT上的示例或者是直接文章翻译很少有提到实战上的一些问题,下面我把我本身遇到的一些问题和解决要领记录一下同时大抵讲下安置集成法式。
前期筹备安置 Docker(dapr安置完后会在Docker中生成两个容器Dapr_redis和Dapr_placement)
安置?Dapr CLI(用于使用Dapr的一些命令)
安置?.Net Core SDK 3.0(Dapr只能用于3.0的措施中)
下载dotnet-sdk(Nuget上暂时只有预览版,所以直接用源码集成便利源码调试)
注意:安置dapr cli的时候他会让你用 一段powershell脚本安置,但由于国内墙的问题使用不了所以需要xxxxemmmm,另一个步伐就是直接去release下载文件https://github.com/dapr/cli/releases
具体安置命令法式啥的不说了,链接点击过去都有介绍
大抵集成法式具体的如何集成和配置网上都有大家可以看下这篇GIT上的集成法式,我这里直接给大家看下我示例措施的项目布局重要的内容会写在括号里
Clients目录下都是用于挪用处事的客户端(这里都是通过ActorProxy的RPC方法挪用,有点像SF、akka.net和Orleans,都引用下面的Service_Interfaces)
Dapr目录下就是上面下载的Dapr源代码
CSRedisCore我项目里面用到了Redis所以把CSRedisCore的源代码下载了下来
Service_Infrastructure 处事的根本设施存放一些通用的对象或者辅佐类
Service_Interfaces处事的接口都在这里(引用Dapr.Actors)
Service_Models处事和客户端用到的模型都在这
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处事中如何使用依赖注入
对付这个问题有两个解决要领:
默认的处事实现中结构函数只能有两个参数ActorService和ActorId,但是它在注册的时候供给了另一个结构要领,好比我的一个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($":{5000}/");
第一个要领有局限性,和本身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(); }温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32489.html