.NET Core 3.1 API 에 Akka.net 탑재해보겠습니다.
시작 템플릿
시작 템플릿은 .Net Core 3.1 API 를 사용하였으며, Docker 지원 옵션을 추천합니다. ( 도커 개발환경 지원)
샘플에서 프로젝트명은 AkkaNetCore 로 생성 하였습니다.
라이브러리 추가
<PackageReference Include="Akka" Version="1.3.17" /> <PackageReference Include="Akka.Cluster" Version="1.3.17" /> <PackageReference Include="Akka.Cluster.Tools" Version="1.3.17" /> <PackageReference Include="Akka.DI.Extensions.DependencyInjection" Version="1.3.2" /> <PackageReference Include="Akka.Logger.NLog" Version="1.3.5" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.8.1" />
- Akka : 베이스 이며 로컬 액터만 사용한다고 하면 이것만으로 충분하다.
- Akka.Cluster : 클러스터는 리모트기능을 포함하고 있으며 , 작성된 액터를 원격으로 조직화할때 사용된다.
- Akka.Cluster.Tools : 클러스터를 쉽게 구성할수 있는 툴들이 추가되어있다. ( ex>싱글톤 클러스터 )
- Akka.DI.Extensions.DependencyInjection : 액터에 의존성 주입을 할수 있게한다.(옵션)
- Akka.Logger.NLog : 액터 메시지 로그 어댑터가 Nlog를 활용할수 있게한다.
- Nlog.Web.AspNetCore : Net Core에서 Nlog(로깅 툴)를 활용할수 있게한다.
누겟이나 프로젝트 편집을 통해 의존 라이브러리 추가가 가능합니다.
Akka Extensions
Akka System및 구성요소(액터,설정) 등을 편리하게 사용하기 위해 사용자 정의 셋팅 파일을 추가합니다.
이 파일은 닷넷 능력치에따라, 필자가 작성한 방법보다 더 편리한 클래스로 개선가능합니다.
using System; using System.Collections.Concurrent; using System.IO; using System.Text; using Akka.Actor; using Akka.Configuration; using Microsoft.Extensions.Configuration; using AkkaConfig = Akka.Configuration.Config; namespace AkkaNetCore.Config { public class AkkaLoad { public static ConcurrentDictionary<string, IActorRef> ActorList = new ConcurrentDictionary<string, IActorRef>(); public static void RegisterActor(string name, IActorRef actorRef) { if (ActorList.ContainsKey(name)) throw new Exception("이미 등록된 액터입니다."); ActorList[name] = actorRef; } public static IActorRef ActorSelect(string name) { return ActorList[name]; } public static AkkaConfig Load(string environment, IConfiguration configuration) { if(environment.ToLower()!= "production") { environment = "Development"; } return LoadConfig(environment, "akka{0}.conf", configuration); } private static AkkaConfig LoadConfig(string environment, string configFile, IConfiguration configuration) { string akkaip = configuration.GetSection("akkaip").Value ?? "127.0.0.1"; string akkaport = configuration.GetSection("akkaport").Value ?? "5100"; string akkaseed = configuration.GetSection("akkaseed").Value ?? "127.0.0.1:5100"; string roles = configuration.GetSection("roles").Value ?? "akkanet"; var configFilePath = string.Format(configFile, environment.ToLower() != "production" ? string.Concat(".", environment) : ""); if (File.Exists(configFilePath)) { string config = File.ReadAllText(configFilePath, Encoding.UTF8) .Replace("$akkaport", akkaport) .Replace("$akkaip", akkaip) .Replace("$akkaseed", akkaseed) .Replace("$roles", roles); var akkaConfig = ConfigurationFactory.ParseString(config); Console.WriteLine($"=== AkkaConfig:{configFilePath}\r\n{akkaConfig}\r\n==="); return akkaConfig; } return Akka.Configuration.Config.Empty; } } }
어플리케이션 로깅
위 순서대로 코드 셋팅이 성공하면 구동후 위와같은 로깅을 볼수 있습니다.
성공한 Git을 Pull받아 바로 실행하지 말고, 가급적 처음부터 셋팅해보길 권장합니다.
닷넷 코어 에서의 DI확장,Swagger,로깅등에 대한 설명은 생략합니다.
참고자료:
- https://havret.io/akka-net-asp-net-core
- https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-3.0&tabs=visual-studio
- https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-2
- Top-Level Architecture : 액터는 TopLebel 아키텍으로 구성되며,AkkaSystem의 고유 라이프 사이클을 지원하기때문에,의존 생명주기를 .net core 종속적이게 맞출 필요는 없습니다. (선택사항)