どのようにGalangのZeromq要求応答パターンを使用する
概要
私たちの多くは、バックエンドをdecopulatingについて考えて、それをマイクロサービスに分割しました.あなたがモノリシックバックエンドを持っているとしましょうし、ニュースレターのようなものを追加することを決定し、メールを送信する唯一の機能を持っているマイクロサービスを持っていると思います.
インターネットでは、この課題を解決するためにいくつかの解決策を見つけるでしょうが、最も一般的なの一つはmessage broker . しかし、すべての私たちのメッセージブローカーの使用として高度なソリューションを必要としない、それは私が使用したいこれらの特定のケース(小さなアプリケーション)ですZeroMQ .
あなたがzeromqを知らないならば、それがコミュニティで広く共有されないテクノロジーであるので、それはOKですthis 記事は、私にあなたより良い導入を与える.
今日の例
今日の例のアイデアは、テキストとなるJSONプロパティを受信する単純なAPI(サーバー)を作成することです.そして、この同じ文字列の長さを計算する責任があるアプリケーション(Worker)に同じテキストを送信します.最後に、文字列の長さをAPIに返し、レスポンス本文で送信します.
私が使用するフレームワークはfiber そして、私が使うつもりであるzeromqクライアントはそうですzmq4 .
コードしましょう
あなたが既に理解しているかもしれないように、我々は2つのバックエンドを持つつもりです.バックエンドの一つは、私たちのAPIになるサーバーを呼び出します.他のバックエンドは私たちの小さなマイクロサービスになる労働者です.
まず、依存関係をインストールしましょう.
go get github.com/gofiber/fiber/v2
go get github.com/pebbe/zmq4
簡単なAPIを作りましょう.// @/server/server.go
package main
import "github.com/gofiber/fiber/v2"
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello there 👋")
})
app.Listen(":3000")
}
リクエスト本体からのデータの構造については、次のようになります.type Input struct {
Text string `json:"text"`
}
今私たちのプロジェクトにZMQ 4をインポートすることができますし、クライアントを作成しましょう.// @/server/server.go
package main
import (
"github.com/gofiber/fiber/v2"
zmq "github.com/pebbe/zmq4"
)
type Input struct {
Text string `json:"text"`
}
func main() {
app := fiber.New()
zctx, _ := zmq.NewContext()
// ...
}
次に、リクエストタイプのZEROMQソケットを作成し、私たちが定義したアドレスを通して接続を受け付けます.// @/server/server.go
package main
import (
"github.com/gofiber/fiber/v2"
zmq "github.com/pebbe/zmq4"
)
type Input struct {
Text string `json:"text"`
}
func main() {
app := fiber.New()
zctx, _ := zmq.NewContext()
s, _ := zctx.NewSocket(zmq.REQ)
s.Bind("tcp://*:6666")
// ...
}
それから、我々の終点では、我々はGETからPOSTまでHTTP動詞を変えます、そして、我々はc.BodyParser()
関数.// @/server/server.go
package main
import (
"github.com/gofiber/fiber/v2"
zmq "github.com/pebbe/zmq4"
)
type Input struct {
Text string `json:"text"`
}
func main() {
app := fiber.New()
zctx, _ := zmq.NewContext()
s, _ := zctx.NewSocket(zmq.REQ)
s.Bind("tcp://*:6666")
app.Post("/", func(c *fiber.Ctx) error {
input := new(Input)
if err := c.BodyParser(input); err != nil {
panic(err)
}
// ...
return c.SendString("Hello there 👋")
})
app.Listen(":3000")
}
今、我々はウェブソケットにテキストを送らなければなりません.// @/server/server.go
package main
import (
"github.com/gofiber/fiber/v2"
zmq "github.com/pebbe/zmq4"
)
type Input struct {
Text string `json:"text"`
}
func main() {
app := fiber.New()
zctx, _ := zmq.NewContext()
s, _ := zctx.NewSocket(zmq.REQ)
s.Bind("tcp://*:6666")
app.Post("/", func(c *fiber.Ctx) error {
input := new(Input)
if err := c.BodyParser(input); err != nil {
panic(err)
}
s.Send(input.Text, 0)
// ...
return c.SendString("Hello there 👋")
})
app.Listen(":3000")
}
今、我々が対応するテキスト長でメッセージを受け取るとき、我々はレスポンスの本体にそれを送ります、エラーが起こったならば、我々はそれを扱います.// @/server/server.go
package main
import (
"github.com/gofiber/fiber/v2"
zmq "github.com/pebbe/zmq4"
)
type Input struct {
Text string `json:"text"`
}
func main() {
app := fiber.New()
zctx, _ := zmq.NewContext()
s, _ := zctx.NewSocket(zmq.REQ)
s.Bind("tcp://*:6666")
app.Post("/", func(c *fiber.Ctx) error {
input := new(Input)
if err := c.BodyParser(input); err != nil {
panic(err)
}
s.Send(input.Text, 0)
if msg, err := s.Recv(0); err != nil {
panic(err)
} else {
return c.JSON(fiber.Map{"Length": msg})
}
})
app.Listen(":3000")
}
これにより、サーバーが完成し、今ではワーカーズで働き始めることができます.プロジェクトにZMQ 4をインポートし、クライアントを作成しましょう.
// @/worker/worker.go
package main
import (
zmq "github.com/pebbe/zmq4"
)
func main() {
zctx, _ := zmq.NewContext()
// ...
}
それから、私たちは応答タイプの私たちのzeromqソケットをつくります、そして、我々は我々が以前定義したアドレスを通して接続を受け入れます.// @/worker/worker.go
package main
import (
zmq "github.com/pebbe/zmq4"
)
func main() {
zctx, _ := zmq.NewContext()
s, _ := zctx.NewSocket(zmq.REP)
s.Connect("tcp://localhost:6666")
// ...
}
次に、それは我々のサーバーを介して受信するメッセージのそれぞれを計算するようにループを作成しましょう.我々がメッセージを受け取るとすぐに、我々はそれを記録します、そして、それから、我々は
len()
関数は、テキストの長さを送信する前に、値を文字列に変換しなければならないことを考慮しなければなりません.このためには、
strconv.Itoa()
関数.次のようになります.// @/worker/worker.go
package main
import (
"log"
"strconv"
zmq "github.com/pebbe/zmq4"
)
func main() {
zctx, _ := zmq.NewContext()
s, _ := zctx.NewSocket(zmq.REP)
s.Connect("tcp://localhost:6666")
for {
if msg, err := s.Recv(0); err != nil {
panic(err)
} else {
log.Printf("Received: %s\n", msg)
s.Send(strconv.Itoa(len(msg)), 0)
}
}
}
さて、Postmanに類似したツールを使用してAPIをテストするとき、リクエスト本文にJSONオブジェクトを送信できます.次に、端末に似たようなものがあります.
結論
いつものように、あなたはそれが面白いと思います.あなたがこの記事のどんなエラーにでも気づくならば、コメントで彼らに言及してください.🧑🏻💻
この動画はお気に入りから削除されています.✌️
Reference
この問題について(どのようにGalangのZeromq要求応答パターンを使用する), 我々は、より多くの情報をここで見つけました https://dev.to/franciscomendes10866/how-to-use-zeromq-request-reply-pattern-in-golang-3n5gテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol