https://github.com/powerumc/mediatr-remote
The MediatR.Remote library is an extension library of the IMediator implementation that distributes and relays remote objects.
https://github.com/powerumc/mediatr-remote
mediator mediator-pattern mediatr mediatr-extension mediatr-library
Last synced: 3 months ago
JSON representation
The MediatR.Remote library is an extension library of the IMediator implementation that distributes and relays remote objects.
- Host: GitHub
- URL: https://github.com/powerumc/mediatr-remote
- Owner: powerumc
- License: apache-2.0
- Created: 2022-08-21T12:07:35.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2024-06-12T14:08:09.000Z (about 1 year ago)
- Last Synced: 2025-03-14T11:37:25.457Z (3 months ago)
- Topics: mediator, mediator-pattern, mediatr, mediatr-extension, mediatr-library
- Language: C#
- Homepage:
- Size: 993 KB
- Stars: 4
- Watchers: 0
- Forks: 1
- Open Issues: 3
-
Metadata Files:
- Readme: README.ko.md
- License: LICENSE
Awesome Lists containing this project
README
# MediatR.Remote [[English](README.md)]
## MediatR.Remote 는 무엇입니까?
MediatR.Remote 라이브러리는 원격 개체를 분산하여 중계하는 `IMediator` 구현의 확장 라이브러리 입니다.
[Akka.NET](https://getakka.net/) 또는 [Orleans](https://github.com/dotnet/orleans) 과 같은 분산 클러스터링 프레임워크에서 메시지를 통한 분산 방법에서 영감을 받았습니다.최근 소프트웨어 개발은 작은 규모로 시작하지만 점점 더 복잡해지고 빠른 속도로 확장해야 합니다.
그러나 규모의 확장을 항상 염두하고 개발하지만 때론 기존 아키텍처가 새로운 아키텍처 설계에 장애물이 되기도 합니다.
`MediatR.Remote` 는 `IMediator` 의 Mediator Pattern 을 원격/분산하도록 고안된 라이브러리 입니다.`MediatR.Remote` 는 `Role` 기반으로 각 서비스의 역할을 의미 합니다.
각 역할(Role)은 하나의 `In-Process` 서비스에 위치할 수도 있고, 물리적으로 분산될 수도 있으며,
구조를 축소하거나 확장하는 것에 초점이 맞추어져 있습니다.## 설치하기
```bash
dotnet add package MediatR.Remote# ASP.NET Core
dotnet add package MediatR.Remote.Extensions.DependencyInjection
```## 시작하기
### 1. 메시지 정의
`IRemoteRequest` 인터페이스를 메시지 클래스에 구현합니다.
또는 `IRemoteNotification`, `IRemoteStreamRequest` 인터페이스 구현이 필요합니다.```csharp
public class HelloRemoteRequest : IRequest, IRemoteRequest
{
public HelloRemoteRequest(string message)
{
Message = message;
}public string Message { get; }
public IEnumerable SpanRoles => new[] { "internal-api1", "internal-api2" };
}public class HelloResponse
{
public HelloResponse(string message)
{
Message = message;
}public string Message { get; }
}
```### 2. 서비스 구성하기
`AddRemoteMediatR()` 메서드를 통해 현재 실행하는 서비스의 역할(Role) 을 정의합니다.
만약 한 서비스에 모든 역할을 하나의 In-Process 에서 동작하려면 `builder.Services.AddRemoteMediatR(new[] {"public-api", "internal-api1", "internal-api2"}, ...);` 과 같이 서비스의 역할을 정의하면 됩니다.
```csharp
builder.Services.AddMediatR(/* ..생략.. */);
builder.Services.AddRemoteMediatR("public-api", remoteBuilder =>
{
remoteBuilder.AddHttpStrategy("public-api", client => client.BaseAddress = new Uri("http://localhost:5000"));
remoteBuilder.AddHttpStrategy("internal-api1", client => client.BaseAddress = new Uri("http://localhost:5010"));
remoteBuilder.AddHttpStrategy("internal-api2", client => client.BaseAddress = new Uri("http://localhost:5020"));
});
```### 3. Middleware 적용하기
```csharp
app.UseRouting(); // <-- Routing 미들웨어가 필수로 필요함
app.UseRemoteMediatR(mediatorApplicationBuilder => mediatorApplicationBuilder.UseHttpListener());
```### 4. 메시지 전송
```csharp
class Test
{
private IRemoteMediator mediator; // or private IMediator mediator;public Test(IRemoteMediator mediator)
{
_mediator = mediator;
}
public async Task Call()
{
var request = new HelloRemoteRequest("HELLO WORLD");
var response = await _mediator.Send(request);
}
}
```## More Communication Strategies
### HTTP
```csharp
// Configure Service
services.AddRemoteMediatR("public-api", remoteBuilder =>
{
remoteBuilder.AddHttpStrategy("internal-api1", client => client.BaseAddress = new Uri("http://localhost:5010"));
});// Configure Middleware
app.UseRemoteMediatR(routeBuilder => routeBuilder.MapHttpListener().AllowAnonymous());
```### gRPC
실험적인 기능
```csharp
// Define Custom IMediator Interface
public interface IGrpcMediator : IRemoteMediator;public class GrpcMediator(IMediator mediator) : RemoteMediator(mediator), IGrpcMediator
{
public override string ProtocolName => "grpc";
}// Configure Service
services.AddGrpc();
services.AddRemoteMediatR("public-api", "grpc", remoteBuilder =>
{
remoteBuilder.AddGrpcStrategy("internal-api1", client => client.Address = new Uri("http://localhost:5011"));
});// Configure Middleware
app.UseRemoteMediatR(applicationBuilder => applicationBuilder.UseGrpcListener());
```## 더 많은 예제
* [메시지 통신 예제](examples)