728x90
728x170
1. NATS 서비스 구동하기
cmd 창에서 아래 명령어로 NATS 서비스를 활성화 시킵니다.
docker run -p 4222:4222 nats -p 4222
2. WebApi Nats Server 만들기
ASP.NET Core 웹 API 프로젝트를 만들고
Nsts.Client Nuget Package 를 추가합니다.
ValuesController.cs 를 추가하고 아래처럼 클라이언트단으로 Publish 하는 코드를 넣어줍니다.
using System.Text;
using Microsoft.AspNetCore.Mvc;
using NATS.Client;
namespace WebAppNatsSerer.Controllers
{
[Route("[controller]")]
public class ValuesController : Controller
{
// POST api/values
[HttpPost]
public IActionResult Post([FromBody] string value)
{
Thread.Sleep(5000);
ConnectionFactory cf = new ConnectionFactory();
Options opts = ConnectionFactory.GetDefaultOptions();
opts.Url = "nats://localhost:4222";
IConnection c = cf.CreateConnection(opts);
c.Publish("worker", Encoding.UTF8.GetBytes($"hello, world: {value}"));
c.Close();
return Ok();
}
}
}
( API 를 호출하게되면 클라이언트 단으로 Publish 하게 됩니다.)
3. Client 만들기
ConsoleApp 프로젝트를 하나 만들어서 Subscribe 코드를 넣어줍니다.
Publish 하게되면 Subscribe 한곳에 이벤트가 발생됩니다.
("worker"(subject) 라는 채널을 통해 Pub/Sub 이 됩니다.)
using NATS.Client;
namespace ConsoleAppNatsWorker
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Worker");
ConnectionFactory cf = new ConnectionFactory();
Options opts = ConnectionFactory.GetDefaultOptions();
opts.Url = "nats://localhost:4222";
IConnection c = cf.CreateConnection(opts);
EventHandler<MsgHandlerEventArgs> h = (sender, args) =>
{
Console.WriteLine($"worker received {args.Message}");
};
IAsyncSubscription s = c.SubscribeAsync("worker", h);
while (true)
{
Console.WriteLine("worker listening...");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
}
}
}
(1초 간격으로 worker listening... 를 화면에 뿌려주고 Publish 가 되면 received 메세지를 출력합니다.)
결과 (실행순서 Server -> Client)
클라이언트 단은 아래처럼 Subscribe 를 한 후 대기를 하게됩니다.
WebAPI 를 호출하게되면 WebAPI 에서 Publish 가 이루어지고
아래처럼 Publish 한 내용이 클라이언트단에 출력됩니다.
[Source]
https://github.com/kei-soft/DockerNatsTest
728x90
그리드형
'C#' 카테고리의 다른 글
[C#] 패턴 매칭 (0) | 2023.03.28 |
---|---|
[C#] Record 란 (0) | 2023.03.28 |
bin obj 폴더 일괄 삭제하기 (0) | 2023.02.19 |
[C#/gRPC] 대용량 데이터 Stream 전달시 에러 - HTTP/2 INTERNAL_ERROR (0) | 2023.01.13 |
[C#] [링크] AlterNats (0) | 2023.01.13 |