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

 

GitHub - kei-soft/DockerNatsTest

Contribute to kei-soft/DockerNatsTest development by creating an account on GitHub.

github.com

 

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
Posted by kjun.kr
,