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:
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
Memasang RabbitMQ
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
infrastruktur go-zero
1 Cipta perkhidmatan
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.yaml
2. Fail konfigurasi
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.yaml
Bahagian menentukan maklumat yang diperlukan apabila menggunakan RabbitMQ. MessageQueue
3. Pengendali dan pelaksanaan perkhidmatan
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. biz
4. Penjanaan kod
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.api
5. Perkhidmatan daftar
// 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.NewSubscriber
logx.Infof
Akhir sekali, tambah kod berikut dalam kaedah
: main.go
s := &http.Server{ Handler: server, Addr: ":"+cfg.Port, }
Run
Kod 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
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!