Go에 NATS 포함
13241 단어 microservicesgo
참고: 항상 그렇듯이 모든 코드를 사용할 수 있습니다here.
왜 이것이 필요합니까?
nats server 또는 cli 컨테이너를 사용하여 docker을 실행하는 동안 일반적으로 선호되는 방법이지만 일부 경우에는 불필요할 수 있습니다. 이러한 예는 테스트입니다. 테스트하는 동안 외부 서비스를 위해 새 인스턴스를 시작하는 것이 종종 번거롭습니다. 이는 메모리 내 서버를 사용하여 완전히 피할 수 있습니다. 운 좋게도 NATS 서버 패키지는 즉시 이 기능을 제공합니다!
설정
코드를 작성하기 전에 go 프로젝트를 빠르게 설정해 보겠습니다.
이동 모듈
$ go mod init example
$ touch main.go
종속성
$ go get -d github.com/nats-io/nats-server/v2
$ go get github.com/nats-io/nats.go
암호
설정이 끝나면 이제 옵션으로 새 서버를 초기화하여 시작할 수 있습니다.
opts := &server.Options{}
ns, err := server.NewServer(opts)
if err != nil {
panic(err)
}
참고:
Host
, Port
, Authorization
등을 server.Options
를 사용하여 구성할 수 있습니다.다음으로 고루틴을 통해 서버를 시작하고 서버가 연결 준비가 될 때까지 기다립니다.
go ns.Start()
if !ns.ReadyForConnections(4 * time.Second) {
panic("not ready for connection")
}
서버가 준비되면 서버에서 제공하는
ClientURL
기능을 사용하여 nats.go 클라이언트와 연결할 수 있습니다.nc, err := nats.Connect(ns.ClientURL())
if err != nil {
panic(err)
}
제목을 구독하고 메시지 데이터를 인쇄해 봅시다. 선택적으로
Shutdown
함수를 호출하여 nats 서버를 중지할 수 있습니다.subject := "my-subject"
nc.Subscribe(subject, func(msg *nats.Msg) {
data := string(msg.Data)
fmt.Println(data)
ns.Shutdown()
})
마지막으로 데이터를 주제에 게시하고 종료될 때까지 서버를 계속 실행하기 위해
WaitForShutdown
를 호출합니다.nc.Publish(subject, []byte("Hello embedded NATS!"))
ns.WaitForShutdown()
우리의 완전한 예제는 다음과 같아야 합니다!
package main
import (
"fmt"
"time"
"github.com/nats-io/nats-server/v2/server"
"github.com/nats-io/nats.go"
)
func main() {
opts := &server.Options{}
// Initialize new server with options
ns, err := server.NewServer(opts)
if err != nil {
panic(err)
}
// Start the server via goroutine
go ns.Start()
// Wait for server to be ready for connections
if !ns.ReadyForConnections(4 * time.Second) {
panic("not ready for connection")
}
// Connect to server
nc, err := nats.Connect(ns.ClientURL())
if err != nil {
panic(err)
}
subject := "my-subject"
// Subscribe to the subject
nc.Subscribe(subject, func(msg *nats.Msg) {
// Print message data
data := string(msg.Data)
fmt.Println(data)
// Shutdown the server (optional)
ns.Shutdown()
})
// Publish data to the subject
nc.Publish(subject, []byte("Hello embedded NATS!"))
// Wait for server shutdown
ns.WaitForShutdown()
}
빌드 및 실행!
내장된 NATS 서버를 사용하여 예제 바이너리를 빌드하고 실행해 보겠습니다.
$ go build
$ ./example
Hello embedded NATS!
보시다시피 구독자로부터 출력을 얻습니다!
성능
성능은 모든 애플리케이션의 중요한 측면이므로 NATS를 임베디드 또는 외부 서비스(cli, docker 등)로 사용할 때의 성능을 비교해 보겠습니다. 8개 간격으로 100만 개의 메시지에 대한 벤치마크를 실행할 것입니다.
설정
먼저 외부 nats 서버를 시작해야 합니다.
$ nats-server
[5868] 2022/02/22 20:09:21.073386 [INF] Starting nats-server
[5868] 2022/02/22 20:09:21.073657 [INF] Version: 2.7.0
[5868] 2022/02/22 20:09:21.073660 [INF] Git: [not set]
[5868] 2022/02/22 20:09:21.073662 [INF] Name: NCFHZUA6H6YRJHE65OXRW5X5NL2XDTR7Q4NBZG5Q2KEHZTFN6JMUK4HU
[5868] 2022/02/22 20:09:21.073665 [INF] ID: NCFHZUA6H6YRJHE65OXRW5X5NL2XDTR7Q4NBZG5Q2KEHZTFN6JMUK4HU
[5868] 2022/02/22 20:09:21.076236 [INF] Listening for client connections on 0.0.0.0:4222
[5868] 2022/02/22 20:09:21.076659 [INF] Server is ready
결과
벤치마크 코드는 here 찾을 수 있으며 아래와 같이 실행할 수 있습니다.
$ go run benchmark/benchmark.go
Results have been saved to results.html
성능에 큰 차이가 없는 것 같습니다. 수백만 개의 메시지를 테스트하는 것을 고려하면 정말 인상적입니다.
결론
이 기사에서는 go 애플리케이션에 nats 서버를 포함하는 방법을 배웠습니다. 또한 작은 성능 벤치마크를 수행했습니다. official docs 을 확인하십시오.
Reference
이 문제에 관하여(Go에 NATS 포함), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/karanpratapsingh/embedding-nats-in-go-19o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)