ในการทำ micro service นั้นการคุยกันระหว่าง service มีวิธีการมากมายที่สามารถทำได้เช่นการเรียกผ่าน restful การคุยผ่าน GRPC หรือวิธีอื่นๆอีก
ในตัวอย่างนี้จะลองใช้ NATS ซึ่งเป็นระบบการสื่อสารแบบ messaging แบบไลท์เวทและทำงานอย่างรวดเร็ว

ถูกออกแบบให้มีประสิทธิภาพสูงและง่ายต่อการใช้งาน โดยใช้โปรโตคอลแบบ publish-subscribe ซึ่งช่วยให้แอปพลิเคชันสามารถส่งข้อความไปยังหลายตัวรับพร้อมกัน และผู้รับสามารถรับข้อความทั้งหมดหรือเฉพาะข้อความที่สนใจได้ ระบบ NATS ยังมีความยืดหยุ่นสูงและมีความเสถียรในการทำงานที่มีความต้องการสูง

โดยตัวอย่างนี้จะจำลองการรับส่งข้อมูลผ่าน NATS ด้วยภาษา Golang ดังนี้

ก่อนอื่น run nats server ค้างไว้ โดยใช้ docker compose แบบนี้จะได้ตัวอย่าง nats ui เอาไว้ดูการวิ่งของ message ด้วย

version: '3'

services:
  nats:
    image: nats:latest
    ports:
      - "4222:4222"

  nats-webui:
    image: sphqxe/nats-webui:latest
    ports:
      - "3000:80"
    environment:
      - "NATS_SERVERS=nats://nats:4222"

จากนั้นเขียน code go service A ฝั่ง Publisher ดังนี้

package main

import (
	"log"
	"github.com/nats-io/nats.go"
)

func main() {
	// connect nat server
	nc, err := nats.Connect("nats://localhost:4222")
	if err != nil {
		log.Fatal(err)
	}
	defer nc.Close()

	// publish message
	msg := []byte("Hello, NATS!")
	nc.Publish("mychannel", msg)

}

เขียน code go service B ฝั่ง Publisher ดังนี้

package main

import (
	"log"

	"github.com/nats-io/nats.go"
)

func main() {
	// connect nat server
	nc, err := nats.Connect("nats://localhost:4222")
	if err != nil {
		log.Fatal(err)
	}
	defer nc.Close()

	// subscribe message
	for {
		nc.Subscribe("mychannel", func(msg *nats.Msg) {
			log.Printf("Received a message: %s", string(msg.Data))
		})
	}
}

จากนั้น run service B ค้างไว้ก่อนเพื่อรอ subscribe และ run service A เพื่อ publish ข้อมูล ถ้าเปิดใน terminal ที่ service B จะเห็นข้อมูลที่ได้รับเข้ามา

เพียงเท่านี้ก็สามารถส่ง message หากันระหว่าง 2 microservice ได้แล้ว