Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penyelesaian komunikasi mesej perkhidmatan mikro berdasarkan go-zero

Penyelesaian komunikasi mesej perkhidmatan mikro berdasarkan go-zero

王林
王林asal
2023-06-22 17:19:371819semak imbas

Dengan populariti seni bina perkhidmatan mikro, komunikasi antara perkhidmatan mikro menjadi semakin penting. Kaedah komunikasi REST API yang biasa digunakan pada masa lalu mempunyai kelemahan berikut apabila perkhidmatan mikro memanggil satu sama lain:

  • Permintaan rangkaian yang kerap akan menyebabkan kelewatan dan kesesakan prestasi; dan sebilangan besar permintaan dalam tempoh yang singkat boleh menyebabkan ranap perkhidmatan;
  • Untuk senario dengan jumlah penghantaran data yang besar, kaedah penghantaran berdasarkan protokol HTTP juga terdedah kepada ketidakcekapan.
  • Oleh itu, melaksanakan komunikasi tak segerak antara perkhidmatan mikro berdasarkan baris gilir mesej (Message Queue) telah menjadi pilihan yang baik. Barisan mesej boleh menghantar mesej ke pelayan mesej, dan penerima boleh menerima dan memproses mesej secara tidak segerak, menjimatkan komunikasi yang memakan masa antara perkhidmatan, meningkatkan prestasi sistem dan memastikan kebolehpercayaan komunikasi.

Walau bagaimanapun, dari segi pelaksanaan seni bina, bagaimana untuk melaksanakan penyelesaian komunikasi mesej yang berkuasa dan berskala tinggi dengan cepat? Hari ini kita akan bercakap tentang penyelesaian komunikasi mesej perkhidmatan mikro berdasarkan go-zero.

Konfigurasi persekitaran

Untuk melaksanakan komunikasi perkhidmatan mikro, kami memerlukan alatan untuk mengendalikan baris gilir mesej pada pelayan. Yang popular pada masa ini termasuk RabbitMQ, Kafka, RocketMQ, dll. Artikel ini akan memperkenalkan penggunaan baris gilir mesej RabbitMQ. Jadi kita perlu memasang dan mengkonfigurasi RabbitMQ terlebih dahulu.

Memasang RabbitMQ

Pakej pemasangan dan kaedah pemasangan berkaitan boleh dilihat di [laman web rasmi RabbitMQ](https://www.rabbitmq.com/download.html). Tiada penjelasan terperinci diberikan di sini.

Selepas pemasangan selesai, cipta vhost dan pengguna yang diperlukan pada konsol pengurusan web RabbitMQ. Di sini kami menetapkan vhost sebagai myhost, nama pengguna dan kata laluan sebagai admin/admin.

Pasang go-zero

go-zero ialah kit alat untuk membina perkhidmatan mikro yang boleh skala dan boleh diselenggara. Ia menyepadukan semua alatan yang diperlukan dalam aplikasi monolitik dan menyediakan alatan yang paling biasa digunakan seperti perkhidmatan mikro, RPC dan gerbang API. Kita perlu memasang persekitaran pembangunan go-zero secara tempatan.

infrastruktur go-zero

go-zero adalah berdasarkan seni bina perkhidmatan mikro dan menyediakan alatan pembangunan biasa seperti perkhidmatan mikro, RPC dan get laluan API. Sangat mudah untuk menggunakan go-zero untuk melaksanakan seni bina perkhidmatan mikro yang menyokong baris gilir mesej RabbitMQ.

1 Cipta perkhidmatan

Kami menggunakan alat goctl (alat baris arahan go-zero) untuk mencipta perkhidmatan dengan cepat. Mula-mula, masukkan direktori tempat perkhidmatan dicipta dalam baris arahan go-zero, dan kemudian jalankan arahan berikut:

goctl api new message

Hasil operasi adalah seperti berikut:

- api
    - etc
        - message-api.yaml
    - internal
        - config
            - config.go
        - handler
            - message_handler.go
        - service
            - message_service.go
    - message.api
- Dockerfile
- go.mod
- go.sum
- main.go

Dalam perkhidmatan yang dicipta oleh perintah

Mengandungi direktori asas dan pelaksanaan lalai yang kami perlukan. Di mana

mewakili nama perkhidmatan dan goctl api new mewakili fail konfigurasi perkhidmatan. - api- etc/message-api.yaml2. Fail konfigurasi

Buka

dan konfigurasikan maklumat RabbitMQ kami:

Name: message-api
Host: 0.0.0.0
Port: 8080
JwtSecret: # 在API网关中使用

MessageQueue:
  Host: 127.0.0.1
  Port: 5672 # RabbitMQ端口
  User: admin # RabbitMQ用户名
  Password: admin # RabbitMQ密码
  VirtualHost: myhost # RabbitMQ vhost
etc/message-api.yamlBahagian

menentukan maklumat yang diperlukan apabila menggunakan RabbitMQ.

MessageQueue3. Pengendali dan pelaksanaan perkhidmatan

Kami perlu menambah pengendali dan pelaksanaan perkhidmatan untuk memproses mesej dalam baris gilir mesej RabbitMQ. Tambah fail

dalam direktori

dan tambah kod berikut: handler

package handler

import (
    "context"

    "github.com/tal-tech/go-zero/core/logx"
    "github.com/tal-tech/go-zero/rest/httpx"
    "github.com/tal-tech/go-zero/zmq"
)

type MessageHandler struct {
    messageService *zmq.Service
}

func NewMessageHandler(ctx context.Context) *MessageHandler {
    return &MessageHandler{
        messageService: zmq.NewService("my-exchange", "my-key", false), // 确定队列信息
    }
}

func (h *MessageHandler) SendMessage(ctx context.Context, req *MessageRequest) (*MessageResponse, error) {
    logx.Infof("handler receive message %v", req.Message)

    err := h.messageService.SendMessage(zmq.NewMessage(req.Message)) // 发送消息到队列

    if err != nil {
        logx.Error(err)
        return nil, httpx.NewDefaultError(httpx.InternalServerErrorStatus)
    }

    return &MessageResponse{}, nil
}
message_handler.go Antaranya, kami menggunakan alat zmq yang disediakan oleh go-zero untuk berinteraksi dengan baris gilir mesej RabbitMQ (lihat [go- dokumen rasmi sifar](https://go-zero.dev/cn/tools/zmq)).

Tambahkan fail

dalam direktori

dan tambah kod berikut: service

package service

import (
    "context"

    "message/internal/biz"
)

type MessageApi struct {
    bc *biz.BizClient
}

func NewMessageApi(bc *biz.BizClient) *MessageApi {
    return &MessageApi{
        bc: bc,
    }
}

func (s *MessageApi) SendMessage(ctx context.Context, req *MessageRequest) (*MessageResponse, error) {
    _, err := s.bc.SendMessage(ctx, req.Message)

    if err != nil {
        return nil, err
    }

    return &MessageResponse{}, nil
}
message_service.go Antaranya, bahagian

ialah kod untuk memproses logik aplikasi pelaksanaan boleh berdasarkan perniagaan tertentu Tulis mengikut keperluan.

biz4. Penjanaan kod

Selepas membuat pengendali dan perkhidmatan, anda perlu menggunakan alat baris arahan go-zero untuk menjana kod RPC secara automatik untuk kami. Dalam baris arahan, kami memasukkan direktori yang sama dengan fail

dan jalankan kod berikut:

goctl rpc proto -src message.api -dir .
message.api Perintah ini secara automatik akan menjana untuk kami fail protokol gRPC yang berkaitan dengan fail

dan menambahnya Letakkannya dalam direktori semasa.

message.api5. Perkhidmatan daftar

Tambah kod berikut dalam

:

// register MessageApi
group := server.Group("/")
messageSvc := service.NewMessageApi(biz.NewBizClient())
server.POST(group+"/send-message", httpx.NewHandler(messageSvc.SendMessage))

go func() {
    err = zmq.NewSubscriber("my-exchange", "my-key", false).Subscribe(func(msg zmq.Message) {
        logx.Infof("[RabbitMQ Subscriber] receive message %s", string(msg.Body))
    }) // 订阅队列

    if err != nil {
        panic(err)
    }
}()
internal/config/config.go Antaranya, kami mendaftarkan perkhidmatan

dalam aplikasi, dalam

Langganan dibuat dalam panggilan. Selepas melanggan mesej, kami menggunakan MessageApi untuk memproses mesej secara terus dalam baris gilir RabbitMQ. zmq.NewSubscriberlogx.InfofAkhir sekali, tambah kod berikut dalam kaedah

dalam

: main.go

s := &http.Server{
    Handler: server,
    Addr:    ":"+cfg.Port,
}
RunKod di atas mengkonfigurasi perkhidmatan sebagai pelayan HTTP yang boleh dijalankan dan mengikatnya pada port yang ditentukan. Akhirnya kami boleh menguji sama ada perkhidmatan kami adalah normal.

Ringkasan

Dalam artikel ini kami memperkenalkan penyelesaian komunikasi mesej perkhidmatan mikro berdasarkan go-zero, dan melaksanakan seni bina perkhidmatan mikro yang menyokong RabbitMQ melalui kod sampel. RabbitMQ mempunyai kelebihan kerana digunakan secara meluas dalam teknologi komunikasi pemesejan, menyokong berbilang bahasa pengaturcaraan, dan menjadi sumber terbuka Ia sesuai untuk kebanyakan senario aplikasi peringkat perusahaan. Dalam aplikasi praktikal, kita perlu menggunakannya secara fleksibel berdasarkan senario perniagaan dan ciri permintaan.

Atas ialah kandungan terperinci Penyelesaian komunikasi mesej perkhidmatan mikro berdasarkan go-zero. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn