未来统一NATS消息应用框架
订阅服务端
package sync
import (
"gitee.com/ichub/goconfig/common/base/basedto"
"gitee.com/ichub/gonats/general/nats/natsconst"
"github.com/nats-io/nats.go"
"github.com/sirupsen/logrus"
"log"
"time"
)
type ReqrespServer struct {
ReqRespBase
basedto.BaseEntitySingle
}
func NewReqrespServer() *ReqrespServer {
return &ReqrespServer{
ReqRespBase: ReqRespBase{
natsUrl: natsconst.NatsUrl,
timeout: 10 * time.Second, //响应消息的主题
subject: natsconst.NatsSubject,
},
}
}
func (this *ReqrespServer) Server() {
this.ServerTopic(this.subject)
}
func (this *ReqrespServer) ServerTopic(topic string) {
nc, err := nats.Connect(this.natsUrl)
if err != nil {
log.Fatal(err)
panic("Error connecting to NATS: " + this.natsUrl)
}
defer nc.Close()
// 创建一个Subscription来监听特定的Subject
sub, err := nc.SubscribeSync(topic)
if err != nil {
log.Fatal(err)
panic("Error subscribing to subject: " + topic)
return
}
defer func() {
var err = sub.Unsubscribe()
if err != nil {
log.Printf("Error unsubscribing: %v", err)
}
}()
// 创建一个请求响应循环
for {
// 等待请求消息
msg, err := sub.NextMsg(this.timeout)
if err != nil {
log.Error(err)
continue
}
// 处理请求消息
responseMsg := "Received: ***" + string(msg.Data) + "***"
err = msg.Respond([]byte(responseMsg))
if err != nil {
log.Error(err)
continue
}
logrus.Info("Response sent:", responseMsg)
}
}
请求客户端
package sync
import (
"gitee.com/ichub/goconfig/common/base/basedto"
"gitee.com/ichub/gonats/general/nats/natsconst"
"github.com/nats-io/nats.go"
"github.com/sirupsen/logrus"
"time"
)
type ReqrespClient struct {
ReqRespBase
basedto.BaseEntitySingle
}
func NewReqrespClient() *ReqrespClient {
return &ReqrespClient{
ReqRespBase: ReqRespBase{
timeout: 30 * time.Second,
natsUrl: natsconst.NatsUrl,
subject: natsconst.NatsSubject,
},
}
}
func (this *ReqrespClient) Client() error {
var requestbody = []byte("Hello NATS!")
return this.ClientBody(this.subject, requestbody)
}
func (this *ReqrespClient) ClientBody(topic string, requestbody []byte) error {
nc, err := nats.Connect(this.natsUrl)
if err != nil {
logrus.Fatal(err)
return err
}
defer nc.Close()
subj, err := nc.Request(topic, requestbody, this.timeout)
if err != nil {
logrus.Error(err)
return err
}
logrus.Info(string(subj.Data))
return nil
}
测试用例:
func Test001_reqrespServer(t *testing.T) {
FindBeanReqrespServer().Server()
}
func Test002_reqrespClient(t *testing.T) {
FindBeanReqrespClient().Client()
}
执行结果:
INFO[2024-04-428 23:06:47]D:/go-ichub/go/gonats/general/nats/sync/reqresp_client.go:44 gitee.com/ichub/gonats/general/nats/sync.(*ReqrespClient).ClientBody() Received: ***Hello NATS!***
--- PASS: Test002_reqrespClient (0.06s)
PASS
INFO[2024-04-428 23:06:47]D:/go-ichub/go/gonats/general/nats/sync/reqresp_server.go:70 gitee.com/ichub/gonats/general/nats/sync.(*ReqrespServer).ServerTopic() Response sent:Received: ***Hello NATS!***